使用select语句。用order by语句来对表进行排序。 ASC:升序排列。默认就是升序,可以不加 DESC:降序排列。需要添加。
#asc升序
select id,name from info order by [列名]
select id,name from info order by id;
#desc降序:
select id,name from info order by [列名] desc
select id,name from info order by id desc;
#排序尽量用数字来排序。字符串排序没有效果,只是归类。
#order by 结合where条件过滤
select name,score from info where address='南京西路' order by score desc;
#练习题:查id 姓名 成绩,根据性别都是等于女的然后按照id进行降序排列
select id,name,score from info where sex='女' order by id desc;
select id,name,score from info where sex='女' order by score desc,id desc;
#只有第一个参数出现相同值的时候,第二个参数才会按照指定要求进行排序,否则不生效。
and/or 且 或
select * from info;
select * from info where score > 70 and score <=90;
#练习题:>80 或者 <90
select * from info where score >80 or score <90;
#嵌套条件
select * from info where score > 70 and (score >75 and score <90);
select * from info where score > 70 or (score >75 and score <90);
#练习题:嵌套条件,满足性别是男,在次基础上筛选成绩在80-90之间
select * from info where sex='男' and (score >70 and score <90);
#去重查询
select distinct address from info;
select distinct sex from info;
#练习题:根据地址去重,过滤出成绩等于90且性别是男
select distinct address from info where sex='男' and (score =90);
group by语句 一般是结合聚合函数一起使用
count()
#统计有多少行
sum()
#列的值相加求和
avg()
#对列的值求平均数
max()
#过滤出列的最大值
min()
#过滤出列的最小值
分组的时候可以按照一个字段,也可以按照多个字段对结果进行分组处理。
语法:
select count(name),sex from info group by sex;
#练习题:根据where条件筛选, score >=80
select count(name),score,sex,name from info where score >=80 group by sex;
#练习题:以地址为分组,对score求和
select sum(score),address from info group by address;
#练习题:算出男生女生的平均成绩
select avg(score),sex from info group by sex;
#练习题:分别求出男生组和女生组的成绩最低的人
select min(score),name,sex from info group by sex,name;
select min(score) as min_score,sex,name a from info group by sex,name;
#group by 实现条件过滤
#group by 不可用使用where只能使用having语句实现条件过滤
select avg(score),address from info group by address having avg(score) > 60;
#练习题:用地址分组,id倒叙排列求成绩平均值>50
select avg(score),id,address from info group by address desc having avg(score) > 50 order by id desc;
#练习题:统计name的行数,计算出学生的个数,把成绩也查出来,按照统计出来的学生个数,升序排列。按照地址分组,学生的成绩>=70
select count(name),score,sex,address from info group by address having score >=70 order by count(name);
#练习题:按照性别分组,求出男生女生的最大成绩,最大成绩是否超过75分满足条件的过滤出来
select max(score),sex from info group by sex having max(score) >75;
使用聚合函数必须要加group by 分组的条件要进行筛选,要选用多个重复值的列,过滤条件要用having语句过滤条件。
limit 限制输出的结果记录,查看表中的指定行
使用聚合函数必须要加group by 分组的条件要进行筛选,要选用多个重复值的列,过滤条件要用having语句过滤条件。
## limit 限制输出的结果记录
limit 限制输出的结果记录,查看表中的指定行
select * from info limit 5,3;
#查看6到8行
select * from info order by id desc limit 3;
#倒叙查看后3行
通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关的结果查询出来 通配符和like一起使用,使用where语句一起来完成查询。
%:表示0个,1个或者多个
_:表示单个字符
select * from info where address like '山%';
#以山为开头
select * from info where address like '山%';
#以山为开头
select * from info where address like '%路%';
#表示内容包含 %c%
select * from info where name like '刘__';
#表示查找单个字符_
select * from info where name like '杨_婷';
#表示查找单个字符_
select * from info where name like '__婷';
#表示查找单个字符_
#下划线只能是单个字符
#练习题:以山开头匹配后面2个字符
select * from info where address like '山%__';
通配符可以结合在一起使用
## 别名
设置别名:alias >> as
在MySQL 查询时,表的名字或者字段太长,可以使用别名来进行代替,方便书写,增加可读性
select name as 姓名,score as 成绩 from info;
#as可加可不加
create table test as select * from info;
#使用as语句复制表的时候约束不会被复制过来
select * from test;
desc test;
desc info;
使用as复制表,约束不会被复制过来
可以给表起别名,但是注意别名不能和数据库中的其他表重名,可能会有冲突。
列的别名在结果中可以显示,但是表的别名在结果中没有显示,只能用于查询。
内查询,嵌套查询
select-----(select)
括号里面的查询语句会先于著查询语句执行。然后再把子查询的结果作为条件返回给主查询条件进行过滤
select name,score from info where id in (select id from info where score >80);
#子查询语句返回的结果,只能是一列不能是多列。多列会报错
前后条件需要一致
where条件in什么,子查询的列就是什么。
select id,name,score from info where name in (select name from ky32);
多表联查,不要超过三张
select id,name,score from info where id not in (select id from info where score >70);
#not in:取反。需要加上where条件进行过滤。
子查询语句除了可以用于select还可以用在insert update delete
#插入一个数据,要求按地址,包含南京插入到test
insert into test1 select * from info where address in (select address from info where address like '%南京%');
update info set score=50 where id in (select id from ky32 where id =2);
update同理
exists:关键字子查询
#根据info表,查询大于80分的同学,然后统计有多少个
select count(*) from info a where exists(select id from info where score >80 and info.id=a.id);
view:视图在MySQL当中是一个虚拟表。基于查询结果得出的一个虚拟表。 在工作当中,我们查询的表未必是真表。有可能就是视图表。有可能是基于真表查询结果的一个虚拟表。 可以简化复杂的查询语句,隐藏表的细节。提供安全的数据访问。
创建视图表可以是一张表的结果集,也可也是多个表共同查询的结果集。
创建命令:
create view test2 as select * from info where score >=80;
#创建一个视图表
select * from test2;
#查询视图表是根据真实表的结果集形成的
desc test2;
#视图表也是有表结构的。
视图表和真表之间的区别:
1、 存储方式不一样。真表存储实际数据,真正写上磁盘当中的。视图不存储任何数据。仅仅是一个查询结果集的虚拟表。
2、 数据更新的区别:从数据更新的角度来说表可以增删改查,但是试图一般情况只能用于查,展示数据。
3、 占用空间的区别:真表真是占用空间,视图不占用数据库空间。
show full tables in kgc where table_type like 'view';
#查询当前库中有多少类型是view的表
drop view v_score;
#删除view表
#练习题:infohe test01 根据info的id,name,score,加上给你test01的age
create view v_info(id,name,score,age) as select a.id,a.name,a.score,b.age from info a,test01 b where a.name=b.name;
基于查询的结果集,原表的数据变化,视图表的数据也会发生变化
修改了视图表的数据,原表的数据也会发生变化。一般情况下不对视图表进行改的操作。视图表一般就一个作用就是查
真表占了80%,视图适用于安全新要求比较高的场景,尤其是对外访问基本上都是视图
null值和空值: null就是什么都没有,可理解为真空 空值不是什么都没有,可以理解为空气
如何鉴别空值和null
select * from info where address is not null;
select count(address) from info;
null值不被统计,空值可以被统计
是把两张表或者多张表(三张),同时符合特定条件的数据记录的组合。 多个表之间有一个或者多个列的相同值,才会有相同的查询结果。
语法:select a.id,a.name from 表名1 别名 inner join 表名2 别名 on 判断条件;
select a.id,a.name from test01 a inner join info b on a.id=b.id;
#a表和b表做内连接。name相同的列做连接。on后面跟的是判断条件
只有两张表有相同的值才会有结果集
查看表1数据
表2数据
建立内连接
在left join 关键字来表示。在左连接当中,左侧表是基础表。他会接收左表的所有行,然后和右表(参考表)记录进行匹配。 匹配左表当中的所有行,以及右表中符合条件的行。
不匹配的部分记录null值
select * from test01 a left join info b on a.name=b.name;
右外连接,right join 关键字来表示。在右连接中,右侧表是基础表。他会接受右侧表的所有记录,然后和左侧(参考表)记录进行匹配。 不匹配的部分记录null值
select * from test01 a right join info b on a.name=b.name;
#其中info是右表。右连接就是右边是主表。
select * from test01 a right join info b on a.id=b.id;
select a.id,a.name,b.id,b.name from test01 a right join info b on a.id=b.id;
#当给表起了别名之后前面查询也需要给查询条件加上别名