内容回顾:
1.数据类型
-整型
tinyint
int
bigint
-浮动型
float
double
decimal
-字符
定长:char char()
变长:varchar
text
-datetime
YYYY-MM-DD HH:mm:ss
-enum
多选一
-set集合
多选一或多选多
2.约束
作用:保证数据的完整性和一致性
-not null 和 default
不能为空值 设置默认值
-unique 不同的 唯一的
-primary key 主键 化学反应===not null + unique
-auto_increment 自增长 主要应用在主键字段上
-foreign key 外键
作用:让两张表产生关系
今日内容:
1.外键
(1)创建被关联(主表)
create table dep(
id int primary key auto_increment,
name varchar(20) not null,
descripe char(40) not null
);
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
age int not null,
dep_id int,
constraint fk_dep foreign key(dep_id) references dep(id)
on delete cascade
on update cascade
);
2.外键的变种
-一对多或多对一
书和出版社
一对多(或多对一):一个出版社可以出版多本书。看图说话。
关联方式:foreign key
create table press(
id int primary key auto_increment,
name varchar(20)
);
create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
constraint fk_book_press foreign key(press_id) references press(id)
on delete cascade
on update cascade
);
-多对多
作者和书籍的关系
多对多:一个作者可以写多本书,比本书也可以有很多作者
关联方式:foreign key+一张新的表
# 创建被关联表author表,之前的book表在讲多对一的关系已创建
create table author(
id int primary key auto_increment,
name varchar(20)
);
#这张表就存放了author表和book表的关系,即查询二者的关系查这表就可以了
create table author2book(
id int not null unique auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key(author_id) references author(id)
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id,book_id)
);
一对一
用户和博客
一对一:一个用户只能注册一个博客
关联方式:foreign key+unique
#两张表: 用户表 (user)和 博客表(blog)
# 创建用户表
create table user(
id int primary key auto_increment,
name varchar(20)
);
# 创建博客表
create table blog(
id int primary key auto_increment,
url varchar(100),
user_id int unique,
constraint fk_user foreign key(user_id) references user(id)
on delete cascade
on update cascade
);
3.单表查询
select 字段1,字段2... FROM 表名
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数
重点中的重点:关键字的执行优先级
from
where
where子句中可以使用
1.比较运算符:>、<、>=、<=、<>、!=
2.between 80 and 100 :值在80到100之间
3.in(80,90,100)值是10或20或30
4.like 'xiaomagepattern': pattern可以是%或者_。%小时任意多字符,_表示一个字符
5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
group by
#1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的
#2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
#3、为何要分组呢?
取每个部门的最高工资
取每个部门的员工数
取男人数和女人数
小窍门:‘每’这个字后面的字段,就是我们分组的依据
#4、大前提:
可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
聚合函数
max()求最大值
min()求最小值
avg()求平均值
sum() 求和
count() 求总个数
having
HAVING与WHERE不一样的地方在于
#!!!执行优先级从高到低:where > group by > having
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
select
distinct
order by
按单列排序
SELECT * FROM employee ORDER BY age;
SELECT * FROM employee ORDER BY age ASC;
SELECT * FROM employee ORDER BY age DESC;
按多列排序:先按照age升序排序,如果年纪相同,则按照id降序
SELECT * from employee
ORDER BY age ASC,
id DESC;
limit
示例:
SELECT * FROM employee ORDER BY salary DESC
LIMIT 3; #默认初始位置为0
SELECT * FROM employee ORDER BY salary DESC
LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
SELECT * FROM employee ORDER BY salary DESC
LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条
1.找到表:from
2.拿着where指定的约束条件,去文件/表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.去重
7.将结果按条件排序:order by
8.限制结果的显示条数