联合查询、表连接查询、子查询三种查询的特点和注意事项各是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了联合查询、表连接查询、子查询三种查询的特点和注意事项各是啥相关的知识,希望对你有一定的参考价值。
参考技术A 我来冒个泡哈 题主的问题也是困惑我好久 以下是我的个人见解 只供参考哈联合查询是使用union/union all来连接多个查询结果的结果集(相当于把多个查询结果给复制到另一种表中) 联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号
表连接为通过各个表之间共同列的关联性来查询 分为内连接和外连接
子查询:子查询嵌入的语句称作主查询或父查询。主查询可以是SELECT语句,也可已用于其他有条件的各种SQL语句 常见的有 增删改查 子查询可以代替如何的连接查询 而表连接不可以
希望对题主有帮助本回答被提问者采纳
MySQL进阶 — 联合查询(外连接内连接子连接合并查询)
- 联合查询:对两张及两张以上的表进行查询,就叫联合查询。
- 联合查询的原因:所要获得的数据来自于多张表,联合查询才能得到。
首先在数据库中我们创建四张表:班级表、学生表、课程表以及分数表
mysql> desc classes;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| desc | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.08 sec)
mysql> desc student;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| sn | int(11) | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| qq_mail | varchar(30) | YES | | NULL | |
| classes_id | int(11) | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)
mysql> desc course;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> desc score;
+------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| score | decimal(10,0) | YES | | NULL | |
| student_id | int(11) | YES | | NULL | |
| course_id | int(11) | YES | | NULL | |
+------------+---------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
内连接
当两张或两张以上的表进行查询,不指定查询条件时,查到的就是表的笛卡尔积,指定了条件之后,查到的就是表之间的交集。
语法:
select 字段 from 表1 别名1 inner join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
比如我们查询许仙同学的成绩,此时需要关联学生表和分数表:
select * from student inner join score on student.id = score.student_id and student.id=4;
mysql> select * from student inner join score on student.id = score.student_id and student.id = 4;
+----+------+--------+---------------+------------+----+-------+------------+-----------+
| id | sn | name | qq_mail | classes_id | id | score | student_id | course_id |
+----+------+--------+---------------+------------+----+-------+------------+-----------+
| 4 | 31 | 许仙 | xuxian@qq.com | 1 | 10 | 67 | 4 | 1 |
| 4 | 31 | 许仙 | xuxian@qq.com | 1 | 11 | 23 | 4 | 3 |
| 4 | 31 | 许仙 | xuxian@qq.com | 1 | 12 | 56 | 4 | 5 |
| 4 | 31 | 许仙 | xuxian@qq.com | 1 | 13 | 72 | 4 | 6 |
+----+------+--------+---------------+------------+----+-------+------------+-----------+
4 rows in set (0.09 sec)
如果只是查询指定的字段,就可以写成:
select student.name, score.score from student inner join score on student.id = score.student_id and student.id = 4;
假如还要查找分数对应的课程名(学生表、分数表与课程表三张表联合):
mysql> select student.name, score.score, course.name from student inner join score on student.id = score.student_id inner join course on score.course_id = course.id and student.id = 4;
+--------+-------+-----------------+
| name | score | name |
+--------+-------+-----------------+
| 许仙 | 67 | Java |
| 许仙 | 23 | 计算机原理 |
| 许仙 | 56 | 高阶数学 |
| 许仙 | 72 | 英文 |
+--------+-------+-----------------+
4 rows in set (0.00 sec)
此时我们发现结果虽然查出来了,但是有两个name字段,这样容易混淆,因此别名就派上用场了!
mysql> select stu.name 学生名, sco.score, cou.name 课程名 from student stu inner join score sco on stu.id = sco.student_id inner join course cou on sco.course_id = cou.id and stu.id = 4;
+-----------+-------+-----------------+
| 学生名 | score | 课程名 |
+-----------+-------+-----------------+
| 许仙 | 67 | Java |
| 许仙 | 23 | 计算机原理 |
| 许仙 | 56 | 高阶数学 |
| 许仙 | 72 | 英文 |
+-----------+-------+-----------------+
4 rows in set (0.00 sec)
我们对表和字段都设置了别名,查询结果看起来一目了然!
此外使用第二种内连接查询方式也是可以的,比如下面的SQL语句:
select stu.name, sco.score, cou.name 课程名 from student stu, score sco, course cou where stu.id = sco.student_id and sco.course_id = cou.id and stu.name = “许仙”;
mysql> select stu.name, sco.score, cou.name 课程名 from student stu, score sco, course cou where stu.id = sco.student_id and sco.course_id = cou.id and stu.name = "许仙";
+--------+-------+-----------------+
| name | score | 课程名 |
+--------+-------+-----------------+
| 许仙 | 67 | Java |
| 许仙 | 23 | 计算机原理 |
| 许仙 | 56 | 高阶数学 |
| 许仙 | 72 | 英文 |
+--------+-------+-----------------+
4 rows in set (0.08 sec)
注意:
1.在对多张表进行联合查询时,去找每个表之间的关系,也就是表之间的关联字段;
2.inner可以省略;
3.设置别名时的as可以省略;
练习:查询每个同学的总成绩以及同学的个人信息
假如没有写连接条件:
mysql> select stu.id, stu.name, sum(sco.score) from student stu inner join score sco group by stu.id;
+----+-----------------+----------------+
| id | name | sum(sco.score) |
+----+-----------------+----------------+
| 1 | 黑旋风李逵 | 1307 |
| 2 | 菩提老祖 | 1307 |
| 3 | 白素贞 | 1307 |
| 4 | 许仙 | 1307 |
| 5 | 不想毕业 | 1307 |
| 6 | 好好说话 | 1307 |
| 7 | tellme | 1307 |
| 8 | 老外学中文 | 1307 |
+----+-----------------+----------------+
8 rows in set (0.00 sec)
这样查询到的每个学生的总成绩就是成绩表中所有人的总成成绩了。。。
mysql> select stu.id, stu.name, sum(sco.score) from student stu inner join score sco on stu.id = sco.student_id group by stu.id;
+----+-----------------+----------------+
| id | name | sum(sco.score) |
+----+-----------------+----------------+
| 1 | 黑旋风李逵 | 301 |
| 2 | 菩提老祖 | 120 |
| 3 | 白素贞 | 200 |
| 4 | 许仙 | 218 |
| 5 | 不想毕业 | 118 |
| 6 | 好好说话 | 178 |
| 7 | tellme | 172 |
+----+------------<以上是关于联合查询、表连接查询、子查询三种查询的特点和注意事项各是啥的主要内容,如果未能解决你的问题,请参考以下文章