MySQL的高阶语句

查询语法

使用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;

MySQL的高阶语句_第1张图片

MySQL的高阶语句_第2张图片

MySQL的高阶语句_第3张图片

MySQL的高阶语句_第4张图片

MySQL的高阶语句_第5张图片

MySQL的高阶语句_第6张图片

#练习题:用地址分组,id倒叙排列求成绩平均值>50
select avg(score),id,address from info group by address desc having avg(score) > 50 order by id desc;

MySQL的高阶语句_第7张图片

#练习题:统计name的行数,计算出学生的个数,把成绩也查出来,按照统计出来的学生个数,升序排列。按照地址分组,学生的成绩>=70
select count(name),score,sex,address from info group by address having score >=70 order by count(name);

MySQL的高阶语句_第8张图片

#练习题:按照性别分组,求出男生女生的最大成绩,最大成绩是否超过75分满足条件的过滤出来
select max(score),sex from info group by sex having max(score) >75;

MySQL的高阶语句_第9张图片

使用聚合函数必须要加group by 分组的条件要进行筛选,要选用多个重复值的列,过滤条件要用having语句过滤条件。

limit 限制输出的结果记录

limit 限制输出的结果记录,查看表中的指定行

使用聚合函数必须要加group by 分组的条件要进行筛选,要选用多个重复值的列,过滤条件要用having语句过滤条件。

## limit 限制输出的结果记录

limit 限制输出的结果记录,查看表中的指定行

MySQL的高阶语句_第10张图片

select * from info limit 5,3;
#查看6到8行

select * from info order by id desc limit 3;
#倒叙查看后3行

MySQL的高阶语句_第11张图片

通配符

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关的结果查询出来 通配符和like一起使用,使用where语句一起来完成查询。

%:表示0个,1个或者多个

_:表示单个字符

select * from info where address like '山%';
#以山为开头

select * from info where address like '山%';
#以山为开头

select * from info where address like '%路%';
#表示内容包含 %c%

MySQL的高阶语句_第12张图片

select * from info where name like '刘__';
#表示查找单个字符_

select * from info where name like '杨_婷';
#表示查找单个字符_

select * from info where name like '__婷';
#表示查找单个字符_

#下划线只能是单个字符

MySQL的高阶语句_第13张图片

#练习题:以山开头匹配后面2个字符
select * from info where address like '山%__';

MySQL的高阶语句_第14张图片

通配符可以结合在一起使用

## 别名

设置别名:alias >> as
在MySQL 查询时,表的名字或者字段太长,可以使用别名来进行代替,方便书写,增加可读性

select name as 姓名,score as 成绩 from info;
#as可加可不加

MySQL的高阶语句_第15张图片

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数据

MySQL的高阶语句_第16张图片

表2数据

MySQL的高阶语句_第17张图片

建立内连接

MySQL的高阶语句_第18张图片

左连接

在left join 关键字来表示。在左连接当中,左侧表是基础表。他会接收左表的所有行,然后和右表(参考表)记录进行匹配。 匹配左表当中的所有行,以及右表中符合条件的行。

不匹配的部分记录null值

select * from test01 a left join info b on a.name=b.name;

MySQL的高阶语句_第19张图片

右连接

右外连接,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;
#当给表起了别名之后前面查询也需要给查询条件加上别名

你可能感兴趣的:(mysql,数据库)