使用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);
#去重查询
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;
使用聚合函数必须要加group by 分组的条件要进行筛选,要选用多个重复值的列,过滤条件要用having语句过滤条件。
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行
通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关的结果查询出来 通配符和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 '__婷';
#表示查找单个字符_
#下划线只能是单个字符
在MySQL 查询时,表的名字或者字段太长,可以使用别名来进行代替,方便书写,增加可读性
别名时不可以使用已有的表名
select name as 姓名,score as 成绩 from info;
#as可加可不加
create table test as select * from info;
#使用as语句复制表的时候约束不会被复制过来
使用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还可以用在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);
关键字子查询,主要用于判断只查询的结果是否为空。不为空,返回true ,为空返回flase
#根据info表,查询大于80分的同学,然后统计有多少个
select count(*) from info a where exists(select id from info where score >80 and info.id=a.id);
null值和空值: null就是什么都没有,可理解为真空 空值不是什么都没有,可以理解为空气
MySQL视图是一个虚拟的表,它是从一个或多个MySQL表中导出的。视图在实际表中并不存储任何数据,但它们看起来就像普通表一样,可以被查询和操作。视图可以简化复杂的查询操作,同时也提高了数据的安全性,对敏感数据进行了保护。
使用视图,你可以:
创建视图的语法如下:
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值不被统计,空值可以被统计
视图表和真表之间的区别:
视图的主要缺点是,对于非常大的数据集,会对性能产生影响。因为每次使用视图都需要查询底层表,所以在设计和使用视图时要注意性能问题。
基于查询的结果集,原表的数据变化,视图表的数据也会发生变化
修改了视图表的数据,原表的数据也会发生变化。一般情况下不对视图表进行改的操作。视图表一般就一个作用就是查
真表占了80%,视图适用于安全新要求比较高的场景,尤其是对外访问基本上都是视图
是把两张表或者多张表(三张),同时符合特定条件的数据记录的组合。 多个表之间有一个或者多个列的相同值,才会有相同的查询结果。
语法: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后面跟的是判断条件
只有两张表有相同的值才会集合
结果
LEFT JOIN
左外连接,在left join关键字来表示。在左连接当中,
左侧表式基础表接收左边的所有行,然后和右表(参考表) 记录进行匹配,不匹配的记录null值。
匹配坐标当中的所有行,以及右表中符合条件的行
select * from test01 a left join info b on a.name=b.name;
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;
#当给表起了别名之后前面查询也需要给查询条件加上别名