标签:
SQL查询详解
1.Orderby
a) Order by 字段 asc | desc
b) 允许多字段排序: 先按第一个字段排序,如果不能区分,再使用第二个字段排序;以此类推
2.Limit(限制获得的记录数量)
a) 语法: limit offset, row_count (offset:偏移量,下标从0开始;row_count:总记录数)。例如:limit 2,3 表示从第二条开始,取三条(即第2条到第4条记录)
3.Distinct
a) 去除重复记录。
b) 语法: select distinct 字段 from .......
4.Union
a) 将两个不同关系中的查询联合起来返回
b) 例:查询1班和2班的授课老师
(Select teacher from t_class where class_id=’1’)
Union (all)
(Select teacher from t_class where class_id=”2”)
c) 注意:如果union的结果有重复数据,会自动消除重复,查询结果会丢失数据!解决:通过union的选项all来实现。 Union all...
d) 注意:union操作中子语句结果的排序问题
i. 将子语句包裹在括号内,非必需,但是便于阅读,逻辑更加清晰!
ii. 子语句的order by只有配合limit时才会生效!没有limit时排序是不起作用的!
e) 对union的最终结果进行排序(在语句最后添加order by ... 即可)
(Select teacher from t_class where class_id=’1’)
Union (all)
(Select teacher from t_class where class_id=”2”)
Order by stu_number desc;
5.子查询(*)
a) 子查询语句用括号括起来
b) 子查询分类
i. 子查询出现的位置:where型(出现在where后)、from型、exists型
ii. 子查询的返回值形式: 单一值(标量)、列、表
c) 子查询例子
i. 从教师表中查出授课天数最多的老师的姓名:Select t_name from t_teacher where teach_days=(select max(teach_days) from t_teacher);
注意:使用下列语句也可能达到效果
Select t_name from t_teacher order by teach_days desc limit 1;
但是,可能出现问题。如果有几个老师的授课天数都最大并且一样,这样会漏掉结果!
ii. 子查询返回集合: in ,not in, any, all
iii. 若子查询返回结果是一行(行子查询一般使用不多,但是要掌握!!!):使用(filed1,field2,...)这种形式构建一行来和子查询返回的结果进行比较!!!
例:要求从教师表中查询出和老师张三性别相同,并且也教过张三所教班级的其他老师的信息。
Select t_name, gender, age, course_name from t_teacher
where (gender, course_name) = //构建一行于子查询结果比较(使用最多的是 = 和 in)
(select distinct gender, course_name from t_teacher where t_name=’张三’ and course_name=’MySql数据库教程’);
iv. 子查询返回一个表(通常用于from型子查询,即子查询返回的结果在from关键字后使用)。将一个复杂的逻辑分步处理。
v. Exists子查询: exists(subquery),不提供数据,相当于一个布尔表达式,判断是否获取到了数据。
6.连接查询(*)
a) Inner:数据内部的连接,要求参与连接的数据都存在才能执行的连接。
i. Inner join 内连接
ii. Cross join 交叉链接(笛卡尔链接):没有连接条件,结果集的大小等于两个参与连接的表的结果集笛卡尔乘积。
b) Outer:参与连接的一个或多个数据不真实存在的连接。
i. Left [outer] join 左外连接(开发中使用最多!!!): 左外连接时,如果出现左边表数据连接不到右边表的数据,则左边表的数据最终被保留在结果内,右表对应字段填充NULL; 而如果出现右边表的数据连接不到左边表数据的情况,右边数据被丢弃。
ii. Right [outer] join 右外连接
iii. Full join 全连接(暂不支持)
c) Natural 自然连接(natural join, natural left join, natural right join): 通过mysql自己的判断完成连接过程,不需要指定连接条件。Mysql自动使用多表内相同的字段作为连接条件。
Select * from t_one natural join t_two;
d) 连接条件
i. On: 连接条件
ii. Where: 对连接的数据过滤.
iii. Using: 连接条件,只有当两个表中连接的字段相同时才使用using,一般情况下很少使用,通常使用on。例如有两个表:t_student_main_info(学生常用属性)和t_student_other_info(学生不常用信息),它们的主键名称相同,都叫id,此时才能使用using关键字。 Select * from t_student_main_info join t_student_other_info using(id);
注:连接操作支持多表连接,可以一直无限连接下去,但是极少使用。例如:
Select t_two.* ,t_three.* from t_one left join t_two on ... Left join t_three on ... where...
两个例子:
1.假设两个表分别为team和match
Id |
Team_name |
2 |
Php0331 |
5 |
Php0228 |
1 |
Php0115 |
7 |
Php0505 |
id |
Host_id |
Guest_id |
time |
result |
1 |
2 |
1 |
10:00 |
34:28 |
2 |
2 |
7 |
15:00 |
35:45 |
3 |
|
|
|
|
4 |
|
|
|
|
要求查询得到如下结果:
主队 |
客队 |
比赛时间 |
比赛结果 |
Php0331 |
Php0115 |
10:00 |
34:28 |
Php0331 |
Php0505 |
15:00 |
35:45 |
由于结果中每行记录有两个team_name,所以需要连接team表2次!!!
Match left join team on match.host_id=team.id left join team on match.guest_id=team.id
2.自身连接
有如下课程表course
cno |
cname |
cpno |
credit |
1 |
数据库 |
5 |
4 |
2 |
数学 |
|
2 |
3 |
信息系统 |
1 |
4 |
4 |
操作系统 |
6 |
3 |
5 |
数据结构 |
7 |
4 |
6 |
数据处理 |
|
2 |
7 |
C语言 |
6 |
4 |
要求查询每门课的间接先修课:
Select first.cno, second.cpno from course first, course second where first.cpno=second.cno;
标签:
原文地址:http://blog.csdn.net/yijianbo_/article/details/42340361