MySQL/MariaDB DML操作之Select
前言
上文我们已经讲解了MySQL/MariaDB的基础知识和DDL相关操作,接下来我们来说一下MySQL/MariaDB的DML操作,因select查询较复杂也较重要,所以本文主要是对select查询的详解。
DML操作
DML之select
投影查询
1
2
3
4
|
select col_name,[col_name1,...] from table_name;
select * from table_name ; #显示全表
遍历整张数据表,但对系统资源消耗较大,再进行大数据量的查询时,禁止使用这类操作 |
条件查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
select col_name,[col_name1,...] from table_name where where_definition
#条件比较操作符 = #等值比较
<=> #等值比较,包括与NULL的安全比较
<>或!= #不等值比较
<,<=,>,>= #其它比较符
IN #指定范围内值的存在性测试
BETWEEN … AND … #在某取值范围内
IS NULL #是否为空值
IS NOT NULL #是否为非空
LIKE #可使用通配符:%, _
RLIKE或REGEXP #可使用正则表达式的模式
#逻辑操作符 AND OR NOT |
聚合查询
1
2
3
4
5
|
AVG():平均值 SUM():总和 MAX():最大值 MIN():最小值 COUNT():记录总数 |
子句修饰符
1
2
3
4
|
GROUP BY #对符合条件的结果进行分组
HAVING: 对聚合查询的结果做过滤 ORDER BY col1[,col2] {ASC|DESC} #排序
LIMIT [Offset,]count #限制输出行数
|
select执行流程
1
|
FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY --> SELECT --> LIMIT |
连接查询
事先将两张或多张表执行相应的join操作,而后根据join结果做查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
CROSS JOIN:笛卡尔积,交叉连接 select * from tab1,tab2;
INNER JOIN:内连接 #等值连接 select * from tab1 inner join tab2 on tab1.col_name = tab2.col_name
OUTER JOIN:外连接 LEFT OUTER JOIN:左外连接 select s.name as student,t.name as teacher from students as s lift join teachers as t
on s.TeacherID = t.TID; RIGHT OUTER JOIN:右外连接 select s.name as student,t.name as teacher from students as s right join teachers as t
on s.TeacherID = t.TID; NATURAL JOIN:自然连接,等值连接 select tab1.col_name,tab2.col_name from tab1,tab2 where tab1.col_name = tab2.col_name;
|
子查询
基于某查询语句的结果再次进行的查询
用于where子句的子查询
1
2
3
4
5
6
7
|
①用于比较表达式中的子查询 要求子查询只能返回单个结果 select Name,Age from students where Age > ( select AVG(Age) from students);
②用于 in 中的子查询
判断是否存在于指定的列表中 select Name from students where StuID in ( select TID from teschers);
③用于exists中子查询 |
用于from中的子查询
1
2
3
|
select alias .col,... from ( select statement) as alias where clause
select s.Name from ( select * from students where Age > 20) as s where s.Name like 's%' ;
|
注:MySQL/MariaDB在子查询优化方面并不成熟,所以尽量避免使用子查询
联合查询
将两外或多个返回值字段相同的查询的结果合并输出
1
2
3
|
select statement union select statement
select Name,Age from teachers where Age>=40 union select Name,Age from students where Age>=40;
|
select实战
1
|
表结构 |
1
|
以ClassID分组,显示每班的同学的人数 |
1
|
以Gender分组,显示其年龄之和 |
1
|
以ClassID分组,显示其平均年龄大于25的班级 |
1
|
以Gender分组,显示各组中年龄大于25的学员的年龄之和 |
1
|
显示前5位同学的姓名、课程及成绩 |
1
|
显示其成绩高于80的同学的名称及课程 |
1
|
求前8位同学每位同学自己两门课的平均成绩,并按降序排列 |
1
|
显示每门课程课程名称及学习了这门课的同学的个数 |
1
|
显示其年龄大于平均年龄的同学的名字 |
1
|
统计各班级中年龄大于全校同学平均年龄的人数 |
The end
好了,select查询就先说到这里了,看起来select就这么点东西,其实要真正用好并不容易,所以小伙伴们多加练习吧,后续文章还会继续讲解MySQL/MariaDB系列的知识,有兴趣的可继续关注哦。以上仅为个人学习整理,如有错漏,大神勿喷~~~
本文转自 北城书生 51CTO博客,原文链接:http://blog.51cto.com/scholar/1643563