MySQL
查询单列数据
select name from students
查询所有列的数据
select * from students
去重查询单列
去重只能显示能去重的那一列
select distinct gender from students;
如果查去重所有的,没办法显示去重的效果
select distinct * from students
条件查询where
①、比较运算符
> < = >= <= !=
②、逻辑运算符
and or not
③、模糊查询
like _和%
④、范围内查找
连续和不连续 between in
⑤、空判断查找
is null is not null
聚合查询
对某一列数据进行统计
count(列名) 求某一列的总行数 count(*) |count(列名)
sum(数字列名) 求某一列的和
avg (数字列名) 求某一列的平均值
max (列名) 求某一列的最大值
min(列名) 求某一列的最小值
分组 group by
分组是为了更好的去做聚合而出现的,把列的值相同的归为一组
根据一个字段分组之后,无法看到别的字段信息
根据id 字段分组之后,可以查看到分组后其它的字段信息
分组条件筛选having
group by 存在时,select中除了聚集函数外,所有的基本列必须是group by里面存在的;having基本上同group by一起使用的,having类似于where语句,只是having过滤是基于group by 分组后的数据,having一般通过select语句里面的聚集函数进行过滤。
排序 order by [列1],[列2]
先按照列1去排序,默认是按照asc排序(正序),如果要倒序,在后面加desc。
按照列1排序完成后,如果有顺序相同的,再按照列2进行排序。
Select *from students order by age desc,name asc;
desc 倒序
asc 正序
限制集(分页) limit [start] , [count]
每页显示m条数据,当前显示第n页
查询总条数p1
使用p1除以m得到p2
如果整除则p2为总数页
如果不整除则p2+1为总页数
求第n页的数据
select * from students
where isdelete=0
limit (n-1)*m,m
关系表(多表)
关系: 1对1 1对多 多对多
AB表1对1 A ——》 B 1:1
B ——》 A 1:1
AB表1对多 A ——》 B 1:1
B ——》 A 1:多
AB表多对多 A ——》B 1:多
B ——》A 1:多
关系怎么表示: 关系字段(外键)
关系表的创建
先创建表和关系字段,再对关系字段添加约束(了解)
alter table scores add constraint stu_score foreign key(stuid) references students(id);
级联操作的类型包括
使用方法
foreign key(subid) references subjects(id)on delete cascade
restrict(限制):默认值,抛异常
cascade(级联):如果主表的记录删掉,则从表中相关联的记录都将被删除
set null:将外键设置为空
no action:什么都不做
上面这四种方案都不是最好的,最好的还是,推荐使用逻辑删除
创建表的时候创建关系字段和外键约束
mysql> create table scores(
-> id int auto_increment primary key not null,
-> score decimal(5,2),
-> stuid int,
-> subid int,
-> is_delete bit default 0,
-> foreign key(stuid) references students(id),
-> foreign key(subid) references subjects(id));
关系表的查询
子查询
查询赵丽颖Python的分数
1、select id from students where name = '赵丽颖'
2、select id from subjects where name = 'python';
3、select score from scores where stuid = (select id from students where name = '赵丽颖')and subid =(select id from subjects where name = 'python');
内连接
select students.name as 姓名,subjects.name as 科目,scores.score as 分数 from scores inner join students on students.id = scores.stuid
inner join subjects on subjects.id = scores.subid;
select students.name as 姓名,subjects.name as 科目,scores.score as 分数 fromstudents inner join scores on scores.stuid = students.id
inner join subjects on scores.subid = subjects.id;
select students.name,subjects.name,scores.score from subjects
inner join scores on scores.subid = subjects.id
inner join students on students.id = scores.stuid;
左连接
select students.name,scores.score from
-> students left join scores on students.id = scores.stuid;
右连接
select students.name,scores.score from scores
-> right join students on students.id = scores.stuid;
查询单列数据
select name from students
查询所有列的数据
select * from students
去重查询单列
去重只能显示能去重的那一列
select distinct gender from students;
如果查去重所有的,没办法显示去重的效果
select distinct * from students
条件查询where
①、比较运算符
> < = >= <= !=
②、逻辑运算符
and or not
③、模糊查询
like _和%
④、范围内查找
连续和不连续 between in
⑤、空判断查找
is null is not null
聚合查询
对某一列数据进行统计
count(列名) 求某一列的总行数 count(*) |count(列名)
sum(数字列名) 求某一列的和
avg (数字列名) 求某一列的平均值
max (列名) 求某一列的最大值
min(列名) 求某一列的最小值
分组 group by
分组是为了更好的去做聚合而出现的,把列的值相同的归为一组
根据一个字段分组之后,无法看到别的字段信息
根据id 字段分组之后,可以查看到分组后其它的字段信息
分组条件筛选having
group by 存在时,select中除了聚集函数外,所有的基本列必须是group by里面存在的;having基本上同group by一起使用的,having类似于where语句,只是having过滤是基于group by 分组后的数据,having一般通过select语句里面的聚集函数进行过滤。
排序 order by [列1],[列2]
先按照列1去排序,默认是按照asc排序(正序),如果要倒序,在后面加desc。
按照列1排序完成后,如果有顺序相同的,再按照列2进行排序。
Select *from students order by age desc,name asc;
desc 倒序
asc 正序
限制集(分页) limit [start] , [count]
每页显示m条数据,当前显示第n页
查询总条数p1
使用p1除以m得到p2
如果整除则p2为总数页
如果不整除则p2+1为总页数
求第n页的数据
select * from students
where isdelete=0
limit (n-1)*m,m
关系表(多表)
关系: 1对1 1对多 多对多
AB表1对1 A ——》 B 1:1
B ——》 A 1:1
AB表1对多 A ——》 B 1:1
B ——》 A 1:多
AB表多对多 A ——》B 1:多
B ——》A 1:多
关系怎么表示: 关系字段(外键)
关系表的创建
先创建表和关系字段,再对关系字段添加约束(了解)
alter table scores add constraint stu_score foreign key(stuid) references students(id);
级联操作的类型包括
使用方法
foreign key(subid) references subjects(id)on delete cascade
restrict(限制):默认值,抛异常
cascade(级联):如果主表的记录删掉,则从表中相关联的记录都将被删除
set null:将外键设置为空
no action:什么都不做
上面这四种方案都不是最好的,最好的还是,推荐使用逻辑删除
创建表的时候创建关系字段和外键约束
mysql> create table scores(
-> id int auto_increment primary key not null,
-> score decimal(5,2),
-> stuid int,
-> subid int,
-> is_delete bit default 0,
-> foreign key(stuid) references students(id),
-> foreign key(subid) references subjects(id));
关系表的查询
子查询
查询赵丽颖Python的分数
1、select id from students where name = '赵丽颖'
2、select id from subjects where name = 'python';
3、select score from scores where stuid = (select id from students where name = '赵丽颖')and subid =(select id from subjects where name = 'python');
内连接
select students.name as 姓名,subjects.name as 科目,scores.score as 分数 from scores inner join students on students.id = scores.stuid
inner join subjects on subjects.id = scores.subid;
select students.name as 姓名,subjects.name as 科目,scores.score as 分数 fromstudents inner join scores on scores.stuid = students.id
inner join subjects on scores.subid = subjects.id;
select students.name,subjects.name,scores.score from subjects
inner join scores on scores.subid = subjects.id
inner join students on students.id = scores.stuid;
左连接
select students.name,scores.score from
-> students left join scores on students.id = scores.stuid;
右连接
select students.name,scores.score from scores
-> right join students on students.id = scores.stuid;