- GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)。GBK编码专门用来解决中文编码的,是双字节的。不论中英文都是双字节的。
- UTF-8 编码是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8 节省空间。另外,如果是外国人访问你的GBK网页,需要下载中文语言包支持。访问UTF-8编码的网页则不出现这问题。可以直接访问
day001
数据库分类
- 关系型数据库(SQL)
二维表基本单位
- 非关系型数据库(NoSQL)
key-value存储
(mongodb,redis…)- 应用范围:
缓存、高并发...
- 应用范围:
数据库中的操作
创建库
create database tedu; |
查看库
show databases; |
使用库
use 数据库名; |
表的操作
创建表
create table lrl(id int,name varchar(20),age int(10),job varchar(30));//其中id占用11个字节,age占用1个字节, |
查看表结构
show create table lrl; |
表的引擎(engine)限制表中数据的操作
- innodb:表中的数据支持高级操作(表、事务、外键、约束etc)
- myisam:表中的数据只能进行增删改查的基本操作。
查看表的字段
desc lrl; |
删除表
drop table 表名; |
修改表
rename table 原名 to 新名; |
修改引擎和字符集
alter table 表名 engine = utf8/gbk(不是utf-8) |
表中添加字段
字段类型 after ***(某一个字段名) |
删除一个字段
alter table 表名 drop 字段名 |
作业
1.创建数据库newdb并使用,里面创建员工表emp,只有name字段,引擎为myisam,字符集为gbk
2.修改表名为temp;
3.修改引擎为innodb
4.添加部门编号字段deptno在最后面
5.添加salary字段在name的后面
6.修改salary字段的字段名为sal,并把sal放在deptno后面
7.删除字段sal
数据的操作
插入数据
全字段插入
Codeinsert into emp values(1,'tom',22,6000,'程序猿');
指定字段插入
Codeinsert into emp(name,salary,job) values ('jack',5000,'美工')
批量插入
Codeinsert into emp values
(1,'唐僧',36,10000,'领导'),
(2,'悟空',610,7000,'打手'),
(3,'悟能',960,8000,'卧底'),
(4,'悟净',780,5000,'后勤')
;查询数据
Codeselect name from emp where salary <8000 and/or age<600;
修改数据
Codeupdate 表名 set 修改数据
where 修改条件;Code修改tom工资为3333
update emp set salary=3333 where name ='tom';
修改800岁以下的工资为4000
update emp set salary = 4000 where age<800;
将id=3的人名字改为吕布
update emp set name="吕布" where id = 3;
修改年龄为Null的人年龄为40
update emp set age = 40
where age is null;数据约束
id:每一条数据的唯一标识符,特性:唯一性、非空性
约束:主键约束:primary key非空性、唯一性
非空约束:not null
外键约束:foreign key
检查约束:check
自增值:auto_increment
create table empl(id int primary key, |
数据冗余
如果表设计不合理,保存大量的数据同时可能会随之出现大量的重复数据,这些重复的现象称为冗余。
通过拆分的方式可以消除冗余
create table emp3 ( |
马化腾 8000->市场开拓部->市场部->销售部
insert into emp3 values(1,’马化腾’,8000,3);
insert into dept values(1,’销售部’,null);
insert into dept values(2,’市场部’,1);
insert into dept values(3,’市场开拓部’,2);
insert into dept values(4,’教学部’,null);
insert into dept values(5,’教研部’,4);
insert into dept values(6,’java教研部’,5);
教学部->教研部->java教研部->开金羊 7000
insert into emp3 values(2,’开金羊’,7000,6);
select emp3.name,salary ,dept.name from emp3,dept where emp3.deptId = dept.id ;
day002
数据类型
- int: 整数类型
- double:浮点类型
- 时间类型
- date保存年月日
- datetime:保存年月日时分秒
- time: 保存时分秒
- timestamp(时间戳):保存年月日时分秒
create table t2( |
事务
数据科中执行sql语句的最小工作单位,保证多条sqls语句全部成功或者全部失败
数据库有一个自动提交的过程,查看自动提交是否打开(show variables like ‘%autocommit%’)
事务的状态:提交、被提交
- 提交(commit)
- 查看自动提交(show variables like ‘%autocommit%’);
- 1/on:打开
- 0/ff:关闭
MariaDB [tedu]> show variables like ‘%autocommit%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| autocommit | ON |
+—————+——-+
1 row in set (0.01 sec)
create table t3( |
关闭自动提交
set autocommit = 0
sql语句一开始是存放在缓冲区中的,一个窗口一个缓冲区,如果关闭自动提交。必须使用手动提交(commit)
窗口1(马云) 马云转出1000-查询-提交-查询,
update t3 set money = money-1000 |
窗口2(开金阳)我转入1000-查询-提交-查询,
update t3 set money = money + 1000 |
回滚
当数据没有提交到数据库之前,执行的所有操作都可以回滚;
设置回滚点: rollback to s1;
savepoint s1;
讲数据
模糊查询
like
- %:表示0-n个字符
- _:表示1个字符
Codeselect * from t3 where name like '%金%';
排序:order by
- 升序:asc
- 降序:desc
select * from emp order by salary; |
聚合函数
- sum(求和)
- min(最小值)
- max(最大值)
- avg(平均值)
- count(统计个数)
select count(*) from emp; |
作业:
1.select ename from emp where sal>2500;
2.select max(comm) from emp where sal >= 1000 and sal <= 3000;
3.select max(comm),max(sal),avg(sal),sum(sal) from emp where deptno=30;
- select count(*) from emp where ename like ‘%a%’;
5.select empno,ename,sal from emp where mgr is null;
6.select ename , sal from emp where comm is null;
7.select * from emp where comm is not null and comm != 0;
in
查询emp表中工资是1500,5000,3000的员工信息
select * from emp where sal=1500 or sal = 3000 or sal = 5000 |
查询工资在2000-3000之间的所有员工信息
查询员工表中工资降序的第三页的4条数据
分页查询
limit:跳过的条数,请求的数量(每页的数量)
select * from emp order by sal desc; |
查询10号部门和30号部门的员工工资在前三名的员工信息;
select * from emp where deptno in(10,30) order by sal desc limit 0,3;
与字符串相关的函数
- 获取字符串的长度: charlength(str);
- 获取所有员工的名字和没名字的字符长度
select ename,charlength(ename) from emp; |
- 获取字符串在另一个字符串中第一次出现的位置instr(str,substr)查找b在abcde中的位置
select instr(‘abcde’,’b’);
- 插入字符串
insert(str,start,length,newstr); |
与数学相关函数
3.84向下取整(3),四舍五入(4),非四舍五入(3)
select floor (3.84);//3
select round(3.84);//4
select truncate(3.84567,3);3.845;若取整必须写0;
分组查询
分组查询一般和聚合函数结合使用,以组为单位进行统计
1.select max(sal) from emp group by deptno ;
2.select avg(sal) from emp group by deptno;
3.select count(*),deptno from emp where sal > 1500 group by deptno ;
4.select count(*) from emp where mgr is not null group by mgr;
别名
select ename name(别名) from emp e;
作业
查询emp表中的每个部门的编号,人数,工资总和,最后根据人数进行升序排列,如果人数一致,根据工资总和降序排列;
select deptno,count(empno) c,sum(sal) s from emp group by deptno order by c ,s desc;
表设计管理:权限管理
关联查询
select e.ename,d.deptno,d.loc from emp e join dept d on e.deptno = d.deptno; |
实现权限管理功能需要三张主表和两张关系表
create table user(uid int,uname varchar(20)); //用户表 |