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;
#只有第一个参数出现相同值的时候,第二个参数才会按照指定要求进行排序,否则不生效。

1、区间判断查询和去重查询

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);

2、去重查询

#去重查询
select distinct address from info;
select distinct sex from info;
 
#练习题:根据地址去重,过滤出成绩等于90且性别是男
select distinct address from info where sex='男' and (score =90);

3、如何对结果进行分组查询

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;

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

4、limit 限制输出的结果记录

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

使用聚合函数必须要加group by 分组的条件要进行筛选,要选用多个重复值的列,过滤条件要用having语句过滤条件。
 
## limit 限制输出的结果记录
 
limit 限制输出的结果记录,查看表中的指定行

select * from info limit 1,3;
输出2-4行

select * from info limit 5,3;
#查看6到8行
 
select * from info order by id desc limit 3;
#倒叙查看后3行

5、通配符

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关的结果查询出来 通配符和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 '__婷';
#表示查找单个字符_
 
#下划线只能是单个字符

6、别名

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

别名时不可以使用已有的表名

select name as 姓名,score as 成绩 from info;

#as可加可不加

create table test as select * from info;
#使用as语句复制表的时候约束不会被复制过来

使用as复制表,约束不会被复制过来

可以给表起别名,但是注意别名不能和数据库中的其他表重名,可能会有冲突。

列的别名在结果中可以显示,但是表的别名在结果中没有显示,只能用于查询。

7、子查询

内查询,嵌套查询

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还可以用在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);

8、exists:关键字子查询

关键字子查询,主要用于判断只查询的结果是否为空。不为空,返回true ,为空返回flase

#根据info表,查询大于80分的同学,然后统计有多少个
select count(*) from info a where exists(select id from info where score >80 and info.id=a.id);

9、null值和空值

null值和空值: null就是什么都没有,可理解为真空 空值不是什么都没有,可以理解为空气

视图

MySQL视图是一个虚拟的表,它是从一个或多个MySQL表中导出的。视图在实际表中并不存储任何数据,但它们看起来就像普通表一样,可以被查询和操作。视图可以简化复杂的查询操作,同时也提高了数据的安全性,对敏感数据进行了保护。

使用视图,你可以

  1. 隐藏表结构,只暴露你想要的数据;
  2. 简化复杂的查询,将多个查询合并成一张表;
  3. 重用常见的查询,避免重复的编写代码;
  4. 限制对敏感数据的访问权限,提高数据的安全性;
  5. 让用户只能访问特定的列,防止数据的泄露。

创建视图的语法如下:

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

其中,view_name 是视图的名称,column1,column2 是要选择的列,table_name 是要选择的表,condition 是筛选行的条件。

使用视图时,你可以像使用普通表一样进行查询和操作:

SELECT * FROM view_name;

如何鉴别空值和null
 
select * from info where address is not null;
 
select count(address) from info;
 
null值不被统计,空值可以被统计

视图表和真表之间的区别:

  1. 存储方式:真表是实际存储数据的表,而视图不存储实际数据,只是从真表中导出的虚拟表。
  2. 数据更新的区别:从数据更新的角度来说表可以增删改查,但是试图一般情况只能用于查,展示数据。
  3. 数据结构:真表有自己的数据结构,包括列名、数据类型和键等信息。而视图没有自己的数据结构,它的结构是从真表中导出的。
  4. 访问权限:通过授权,你可以限制对真表的访问权限,而视图可以进一步限制对真表的访问权限,通过只暴露部分数据来保护数据的安全性。
  5. 视图的使用灵活性:视图可以简化复杂的查询操作,将多个关联表的查询合并成一张表,从而提高数据库的查询效率,并且方便用户进行数据分析和处理

视图的主要缺点是,对于非常大的数据集,会对性能产生影响。因为每次使用视图都需要查询底层表,所以在设计和使用视图时要注意性能问题。

基于查询的结果集,原表的数据变化,视图表的数据也会发生变化

修改了视图表的数据,原表的数据也会发生变化。一般情况下不对视图表进行改的操作。视图表一般就一个作用就是查

真表占了80%,视图适用于安全新要求比较高的场景,尤其是对外访问基本上都是视图

连接查询

1、内连接

是把两张表或者多张表(三张),同时符合特定条件的数据记录的组合。 多个表之间有一个或者多个列的相同值,才会有相同的查询结果。

语法: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后面跟的是判断条件

只有两张表有相同的值才会集合

mysql高级语句_第1张图片

mysql高级语句_第2张图片

结果

mysql高级语句_第3张图片

2、左连接

LEFT JOIN
左外连接,在left join关键字来表示。在左连接当中,
左侧表式基础表接收左边的所有行,然后和右表(参考表) 记录进行匹配,不匹配的记录null值。
匹配坐标当中的所有行,以及右表中符合条件的行
 

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

mysql高级语句_第4张图片

3、右连接

RIGHT JOIN
右外连接,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,数据库)