首页 > 代码库 > MySQL_05-Select查询详解

MySQL_05-Select查询详解

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子查询: existssubquery),不提供数据,相当于一个布尔表达式,判断是否获取到了数据。

 

 

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.假设两个表分别为teammatch

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,所以需要连接team2次!!!

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;

MySQL_05-Select查询详解