DDL(数据定义语言)
对数据库的
创建
create database student_name_list;
删除
drop database student_name_list;
查询
show databases;
使用
use 数据库名;
对表的
类型
整形
- int(6)只表示可以0填充的最大位数
- tinyint
- smallint
- tinyint
浮点数
- double
- float
- decimal(5,2)
- numeric
字符
- char
- varchar
- text
- tinytext
- mediumtext
- longtext
时间
- datetime
- date
- timestamp
二进制大对象
- tinyblob
- blob
- mediumblob
- longblob
约束
类型 | 使用 |
---|---|
非空 | not null |
默认 | default vvv |
主键 | primary key(一个表中,只能有一个主键)相当于not null unique 联合主键 |
唯一 | unique (key) |
自增 | auto_increment |
外键 | foreign key |
无符号 | unsigned |
0填充 | zerofill |
创建
create table sjt2101_2(
id int(11) primary key auto_increment,
name char(20) not null,
)engine=innodb default charset=utf8;
修改
修改字段:
- alter table sjt2101_1 modify school varchar(255) not null;
- alter table sjt2101_1 change column ‘school’ ‘new school’ varchar(255) not null;
增加字段:
- alter table sjt2101_1 add column age int(11) default 1;
修改引擎:
- alter table sjt2101_1 engine=innodb;
修改表名:
- alter table sjt2101_1 rename to students;
增加外键:
- alter table students add foreign key (class_cno) references classes(cno);
删除
drop table sjt2101_1;
查询
show tables;
DML(数据管理语言)
对表
增加数据
输入全部字段
- insert into sjt2101_1 value(0,‘张三’,‘家里顿’,‘宅’,‘男’);
- insert into sjt2101_1 values(0,‘李四’,‘家里顿’,‘啃老’,‘女’),(0,‘王五’,‘家里呆不下’,‘疯’,‘男’);
输入指定字段
- insert into sjt2101_1(name,gender) values(‘赵六’,‘男’);
- insert into sjt2101_1(name,gender) values(‘小七’,‘男’),(‘大八’,‘女’);
修改数据
- update sjt2101_1 set school=‘吓大’,major=‘被吓大’ where id=4;
- update sjt2101_1 set age=19 where id=2;
删除数据
- delete from sjt2101_1 where gender=‘男’;
DQL(数据查询语言)
展示表结构
- desc sjt2101_1;
展示建表语句
- show create table sjt2101_1;
单表查询
查询所有字段
- select * from sjt2101_1;
查询指定字段
- select id,name from sjt2101_1;
去除重复数据
- select distinct id, name, price from food;
起别名
- select id 序号,name as 姓名 from sjt2101_1;
条件查询
where子句
- select * from sjt2101_1 where id <4;
比较和逻辑
比较符号:<,>,=,!=,<=,>=,<>不等于
逻辑符号:and,or,not
- select * from sjt2101_1 where id <4 && gender=‘男’;
- select * from sjt2101_1 where id <4 and gender=‘男’;
- select * from sjt2101_1 where id <4 or gender=‘男’;
- select *from sjt2101_1 where school is not null;
范围查询
- select * from sjt2101_1 where id >1 and id <6;
- select * from sjt2101_1 where id between 2 and 5;
- select * from sjt2101_1 where id in(1,3,5);
模糊查询
LIKE
占位符:
符号 | 意义 |
---|---|
_ | 单个任意字符 |
% | 零个或多个任意字符" |
- select* from food where id like ‘%004%’;
- select* from food where name like ‘__牛%’;
- select* from food where name like ‘%牛%’;
排序查询(默认正序)
单列排序
- select * from sjt2101_1 order by age asc;
组合排序
- select * from sjt2101_1 order by age desc,id desc;
分组查询
聚合函数
count、max、min、avg、sum,group_concat(可能有问题).
单字段分组
- select gender,count(id) from roommate group by gender;
多字段分组
- select gender,count(id) from roommate group by gender,id;
分组筛选
- select gender,count(id) from roommate while id>1 group by gender having count(id)>2;
在while语句中不能有聚合函数
限制(分页)查询
默认从0的下一个开始,连续3个
- select * from sjt2101_1 limit 3;
- select * from sjt2101_1 order by id asc limit 3 ;
- select * from sjt2101_1 order by id desc limit 3;
从 limit a,b :从a的下一个开始,连续b个
- select * from sjt2101_1 limit 2,3;
多表查询
表关系
- 关系型数据库(二维表) :MySQl、Oracle、SQL Server
- 非关系型数据库:Redis、MongoDB、Memcache
表联系
- 一对一:在前一方加后一方的外键
- 一对多:在一的一方 加 多的一方的外键(比如一个学生 表的班级字段,这个班级字段是多个里边选一个)
- 多对一
- 多对多:建立中间表,拆分成2个一对多
范式
下边的一定符合上边的
- 第一范式:列不可分
- 第二范式:一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
- 第三范式:每一个非主属性都不传递依赖于该范式的候选键,则称为第三范式,即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
- BC范式:
(1)所有非主属性对每一个码都是完全函数依赖;
(2)所有的主属性对于每一个不包含它的码,也是完全函数依赖;
(3)没有任何属性完全函数依赖于非码的任意一个组合。
嵌套查询
- select * from users where uid in (select uid from telphones where tnumber=‘14774174742’);
内连接
- select t.*,u.name,u.idcard from telphones t inner join users u on t.uid=u.uid;
左外连接
- left outer outer可忽略
右外连接
- right outer outer可忽略
交叉连接(笛卡尔积)
- select t.*,u.name,u.idcard from telphones t cross join users u;
- select * from telphones,users;
自然连接
- select t.*,u.name,u.idcard from telphones t natural join users u;
多表查询
- select t.*,u.name,u.idcard from users u,telphones t where u.uid = t.uid;
联合查询
- select uid,name from users union all select uid,name from users;
- select uid,name from users union distinct select uid,name from users;
嵌套插入
- insert into users(name,idcard,birthday) select name,idcard,birthday from users;
注意
char和varchar区别
- char必须固定长度,使用时直接给定长度,可能会造成空间浪费,多写会截断数据。
- varchar只是规定长度上限为255,在使用时会检测长度,不会造成空间浪费。效率低,以时间换空间,多写不会截断数据。
字符集区别
- utf8包含utf8mb4中常用的大多数字符。utf8mb4是最全的字符集,和java中的utf-8一模一样。
- GBK 更多比 GB2313
- CJK 中日韩
innodb和myisam区别
- myisam不支持事务,不支持外键,表级锁。文件有三:.frm,.MYD,.MYI
- innodb支持事务,支持外键,行级锁。文件有二:.ibd,.frm