在实际开发中,咱们会联合多个表来实现查询,好比把班级表和学生表联合起来就同时能够看到班级、老师和学员的信息,一个班级表:mysql
IDsql |
名称数据库 |
班主任spa |
101code |
一班blog |
Martinip |
102ci |
二班开发 |
Rockio |
103 |
三班 |
Janny |
一个班级对应着多个学生,如下是与之对应的学生表”:
ID |
姓名 |
班级ID |
性别 |
年龄 |
1 |
小花 |
101 |
M |
9 |
2 |
小红 |
102 |
F |
8 |
3 |
小军 |
102 |
M |
8 |
4 |
小白 |
101 |
F |
9 |
将两个表中ID 相同的记录关联起来组成一个新的“列表”,这就是联合查询:
CLASS_ID |
名称 |
班主任 |
姓名 |
ID |
性别 |
101 |
一班 |
Martin |
小花 |
1 |
M |
102 |
二班 |
Rock |
小红 |
2 |
F |
102 |
二班 |
Rock |
小军 |
3 |
M |
101 |
一班 |
Martin |
小白 |
4 |
F |
这种只有2张表匹配的行才能显示的链接方式在Mysql 中称之为内链接: INNER JOIN
在MySQL中内链接数据查询经过“INNER JOIN…ON”语句来实现,语法形式以下所示。
SELECT field1,field2,…,fieldn FROM tablename1 INNER JOIN tablename2 [INNER JOIN tablenamen] ON CONDITION
其中
参数fieldn表示要查询的字段名,来源于所链接的表 tablename1 和 tablename2,
关键字 INNER JOIN 表示表进行内链接,
参数CONDITION表示进行匹配的条件。
1 mysql> create database school; #建立数据库school 2 mysql> use school; #选择数据库school 3 mysql> CREATE TABLE class ( 4 `id` int NOT NULL AUTO_INCREMENT, 5 `name` varchar(128) DEFAULT NULL, 6 `teacher` varchar(64) DEFAULT NULL, 7 UNIQUE KEY `id` (`id`) 8 ); #建立班级表 class 9 mysql> insert into class values(101, '一班', 'Martin'),(102, '二班', 'Rock'),(103, '三班', 'Janny'); #建立成绩表 grade 10 mysql> CREATE TABLE `student` ( 11 `id` int NOT NULL AUTO_INCREMENT UNIQUE, 12 `name` varchar(64) DEFAULT NULL, 13 `class_id` int DEFAULT NULL, 14 `sex` enum('F','M') DEFAULT NULL 15 ); 16 mysql> insert into student values(1,'小花',101,'M'),(2,'小红',102, 'F'),(3,'小军',102,'F'),(4,'小白',101,'F'); #插入多条记录 17 mysql> select * from class inner join student on class.id = student.class_id; #查询class 表和student 表中班级字段相同的记录并进行内链接 18 mysql> select * from class as a inner join student as b where a.id = b.class_id; #同上,使用别名查询
当表名特别长时,直接使用表名很不方便,或者在实现自链接操做时,直接使用表名没法区别表。为了解决这一类问题,MySQL提供了一种机制来为表取别名,具体语法以下:
SELECT field1, field2, ...,fieldn [AS] otherfieldn FROM tablename1 [AS] othertablename1, ..., Tablenamen [AS] othertablenamen ... where othertablename1.fieldx = othertablenamen.fieldx ... ;
其中,参数tablename*为表原来的名字,参数othertablename*为新表名,之因此要为表设置新的名字,是为了让SQL语句代码更加直观、更加人性化和实现更加复杂的功能。
内链接查询中存在一种特殊的等值链接——自链接。所谓自链接,就是指表与其自身进行链接。
如:查询学生 ”小红 ”所在班级的其余学生,SQL语句以下:
1 mysql> use school; #选择数据库school 2 mysql> select t1.id, t1.name, t1.class_id from student t1 inner join student t2 on t1.class_id = t2.class_id and t2.name= '小红'; #查询学生 ”小红 ”所在班级的其余学生
内链接查询中的等值链接就是在关键字ON后的匹配条件中经过等于关系运算符(=)来实现等值条件。
1 mysql> select * from class as a inner join student as b where a.id = b.class_id;
内链接查询中的不等链接就是在关键字ON后的匹配条件中经过除了等于关系运算符来实现不等条件外,还可使用关系运算符,包含“>”“>=”“<”“<=”和“!=”等运算符号。
mysql> select * from class as a inner join student as b where a.id != b.class_id;
当咱们在查询数据时,要求返回所操做表中至少一个表的全部数据记录,经过SQL语句“OUTER JOIN…ON”来实现。外链接数据查询语法形式以下:
SELECT field1,field2,…,fieldn FROM tablename1 LEFT|RIGHT [OUTER] JOIN tablename2 ON CONDITION
在上述语句中,参数fieldn表示所要查询的字段名字,来源于所链接的表tablename1和tablename2,关键字OUTER JOIN表示表进行外链接,参数CONDITION表示进行匹配的条件。
外链接查询能够分为如下二类:
外链接查询中的左外链接,就是指新关系中执行匹配条件时,以关键字LEFT JOIN左边的表为参考表。左链接的结果包括LEFT OUTER字句中指定的左表的全部行,而不单单是链接列所匹配的行,若是左表的某行在右表中没有匹配行,则在相关联的结果行中,右表的全部选择列表均为空值。
例如:查询全部学生的学号、姓名、班级编号、性别、班级名、班主任信息,具体SQL语句以下:
1 mysql> use school; #选择数据库school 2 mysql> select * from student as a left join class as b on a.class_id = b.id; #左链接查询全部学生对应的班级信息 3 mysql> select * from class as a left join student as b on a.id = b.class_id; #左链接查询全部班级的学员信息
(左链接查询一 全部学员对应的班级信息)
(左链接查询二 全部班级对应的学员信息)
外链接查询中的右外链接在新关系中执行匹配条件时,以关键字RIGHT JOIN右边的表为参考表,若是右表的某行在左表中没有匹配行,左表将返回空值。
例如:查询全部班级的全部学生信息。具体SQL语句以下:
1 mysql> use school; #选择数据库school 2 mysql> select * from student as a right join class as b on a.class_id = b.id; #右链接查询全部班级对应的学员信息 3 mysql> select * from class as a right join student as b on a.id = b.class_id; #右链接查询全部学员对应的班级信息
在MySQL中经过关键字UNION来实现合并操做,便可以经过其将多个SELECT语句的查询结果合并在一块儿,组成新的关系。在MySQL软件中,合并查询数据记录可经过SQL语句UNION来实现,具体语法形式以下:
SELECT field1,field2,…,fieldn FROM tablename1 UNION | UNION ALL SELECT field1,field2,…,fieldn FROM tablename2 UNION | UNION ALL SELECT field1,field2,…,fieldn ;
注意: 多个选择语句select 的列数相同就能够合并,union和union all的主要区别是union all是把结果集直接合并在一块儿,而union 是将union all后的结果再执行一次distinct,去除重复的记录后的结果。
1 mysql> use school; #选择数据库school 2 mysql> select teacher from class union all select name from student; #查询班级表全部老师和学生表中全部学生姓名 3 mysql> select teacher as people from class union all select name as people from student; #同上,使用别名查询 4 mysql> select teacher,id from class union all select name,class_id from student; #查询班级表全部(老师、班级ID)和学生表中全部学生(姓名、班级ID)
所谓子查询,是指在一个查询中嵌套了其余的若干查询,即在一个SELECT查询语句的WHERE或FROM子句中包含另外一个SELECT查询语句。在查询语句中,外层SELECT查询语句称为主查询,WHERE子句中的SELECT查询语句被称为子查询,也被称为嵌套查询。
经过子查询能够实现多表查询,该查询语句中可能包含IN、ANY、ALL和EXISTS等关键字,除此以外还可能包含比较运算符。理论上,子查询能够出如今查询语句的任意位置,可是在实际开发中子查询常常出如今WHERE和FROM子句中。
子查询可使用比较运算符。这些比较运算符包括=、!=、>、>=、<、<=和<>等。其中,<>与!=是等价的。比较运算符在子查询中使用得很是普遍,如查询分数、年龄、价格和收入等。
例如:查询student 表中“小花”所在班级班主任的名字。SQL语句以下:
mysql> use school; #选择数据库school mysql> select teacher from class where id = (select class_id from student where name='小花'); #查询“小花”所在班级班主任的姓名
注意:使用比较运算符时,select 子句得到的记录数不能大于1条!!!
一个查询语句的条件可能落在另外一个SELECT语句的查询结果中,这时可使用IN关键字,SQL示例以下:
NOT IN的用法与IN相同。
例如:查询student 表中“小花”所在班级班主任的名字。SQL语句以下:
1 mysql> use school; #选择数据库school 2 mysql> select teacher from class where id in (select class_id from student where name='小花'); #查询student 表中“小花”所在班级班主任的名字 3 mysql> select teacher from class where id in (select class_id from student where name like '小%'); #查询姓名以“小”字开头的学生所在班级班主任的姓名
关键字EXISTS表示存在,后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行;若是至少返回一行,那么EXISTS的结果为true,此时外层语句将进行查询;若是子查询没有返回任何行,那么EXISTS返回的结果是false,此时外层语句将不进行查询。
例如:若是102班存在学生记录,就查询102班的班级信息的记录。SQL示例语句以下:
mysql> use school; #选择数据库school mysql> select * from class where id=102 and exists (select * from student where class_id=102); #若是102班存在学生记录,就查询102班的班级信息
关键字ANY表示知足其中任一条件。使用关键ANY时,只要知足内层查询语句返回的结果中的任何一个就能够经过该条件来执行外层查询语句。例如,须要查询哪些学生能够获取奖学金,那么首先要有一张奖学金表,从表中查询出各类奖学金要求的最低分,只要一个同窗的乘积大于等于不一样奖学金最低分的任何一个,这个同窗就能够得到奖学金。关键字ANY一般和比较运算符一块儿使用。例如,“>ANY”表示大于任何一个值,“=ANY”表示等于任何一个值。
例如:查询数据库school的表student中哪些学生能够得到奖学金。学生的成绩达到其中任何一项奖学金规定的分数便可,SQL语句示例以下:
mysql> use school; #选择数据库school mysql> create table scholarship (score int, level varchar(64)); mysql> insert into scholarship values(240, '二等奖'),(257,'一等奖'); mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ANY (select score from scholarship); #查询能得到奖学金的学院记录
关键字ALL表示知足全部条件。使用关键字ALL时,只有知足内层查询语句返回的全部结果才能够执行外层查询语句。例如,须要查询哪些同窗可以得到一等奖学金,首先要从奖学金表中查询出各类奖学金要求的最低分。由于一等奖学金要求的分数最高,只有当成绩高于全部奖学金最低分时,这个同窗才可能得到一等奖学金。关键字ALL也常常与比较运算符一块儿使用。例如,“>ALL”表示大于全部值,“<ALL”表示小于全部值。
例如:查询数据库school的表student中哪些学生能够得到一等奖学金,即学生的总成绩要达到一等奖学金规定的分数,而一等奖学金是最高奖学金。SQL语句示例以下:
mysql> use school; #选择数据库school mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ALL (select score from scholarship); #查询能得到一等奖学金的同窗记录 mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) < ALL (select score from scholarship); #查询不能得到奖学金的同窗记录
========================================================================================================================