MySQL多表查询和子查询

多表查询
    交叉链接:笛卡尔乘积
    自然连接:两个表建立等值关系
    外连接:两个表没有等值关系
        左外连接:以左边的表为准,不管右边的表有没有值
            ...IEFT JOIN... ON ...
        右外链接:以右边的表为准,不管左边的表有没有值
            ...RIGHT JOIN... ON ...
    自连接:自己连接自己
    
子查询:所有的数据都来自于一张表
    比较操作中使用子查询:子查询只能返回单个值;
    IN(): 使用子查询;
    在FROM中使用子查询;


实例:
显示students表和courses表的数据,默认是笛卡尔乘积显示
mysql> SELECT * FROM students,courses;
显示量太大,结果略。

显示students表中CID1字段等于courses表中CID字段的数据

mysql> SELECT * FROM students,courses WHERE students.CID1 = courses.CID;
+-----+--------------+------+--------+------+------+------+---------------------+-----+------------------+-----+
| SID | Name         | Age  | Gender | CID1 | CID2 | TID  | CreateTime          | CID | Cname            | TID |
+-----+--------------+------+--------+------+------+------+---------------------+-----+------------------+-----+
|   1 | GuoJing      |   19 | M      |    2 |    7 |    3 | 2012-04-06 10:00:00 |   2 | TaiJiquan        |   3 |
|   2 | YangGuo      |   17 | M      |    2 |    3 |    1 | 2012-04-06 10:00:00 |   2 | TaiJiquan        |   3 |
|   3 | DingDian     |   25 | M      |    6 |    1 |    7 | 2012-04-06 10:00:00 |   6 | Qishangquan      |   5 |
|   4 | HuFei        |   31 | M      |    8 |   10 |    5 | 2012-04-06 10:00:00 |   8 | Wanliduxing      |   8 |
|   5 | HuangRong    |   16 | F      |    5 |    9 |    9 | 2012-04-06 10:00:00 |   5 | Qianzhuwandushou |   4 |
|   6 | YueLingshang |   18 | F      |    8 |    4 | NULL | 2012-04-06 10:00:00 |   8 | Wanliduxing      |   8 |
|   7 | ZhangWuji    |   20 | M      |    1 |    7 | NULL | 2012-04-06 10:00:00 |   1 | Hamagong         |   2 |
|   8 | Xuzhu        |   26 | M      |    2 |    4 | NULL | 2012-04-06 10:00:00 |   2 | TaiJiquan        |   3 |
+-----+--------------+------+--------+------+------+------+---------------------+-----+------------------+-----+


显示选修第一门课的学生姓名和课程姓名
mysql> SELECT Name,Cname FROM students,courses WHERE students.CID1 = courses.CID;  
+--------------+------------------+
| Name         | Cname            |
+--------------+------------------+
| GuoJing      | TaiJiquan        |
| YangGuo      | TaiJiquan        |
| DingDian     | Qishangquan      |
| HuFei        | Wanliduxing      |
| HuangRong    | Qianzhuwandushou |
| YueLingshang | Wanliduxing      |
| ZhangWuji    | Hamagong         |
| Xuzhu        | TaiJiquan        |
+--------------+------------------+

使用表别名做多表连接
mysql> SELECT s.Name,c.Cname FROM students AS s,courses AS c WHERE s.CID1=c.CID;
+--------------+------------------+
| Name         | Cname            |
+--------------+------------------+
| GuoJing      | TaiJiquan        |
| YangGuo      | TaiJiquan        |
| DingDian     | Qishangquan      |
| HuFei        | Wanliduxing      |
| HuangRong    | Qianzhuwandushou |
| YueLingshang | Wanliduxing      |
| ZhangWuji    | Hamagong         |
| Xuzhu        | TaiJiquan        |
+--------------+------------------+


使用左外链接显示每名同学选修的第一门课程,如果没有选修的课程,那么显示空
mysql> SELECT s.Name,c.Cname FROM students AS s LEFT JOIN courses AS c ON s.CID1=c.CID;
+--------------+------------------+
| Name         | Cname            |
+--------------+------------------+
| GuoJing      | TaiJiquan        |
| YangGuo      | TaiJiquan        |
| DingDian     | Qishangquan      |
| HuFei        | Wanliduxing      |
| HuangRong    | Qianzhuwandushou |
| YueLingshang | Wanliduxing      |
| ZhangWuji    | Hamagong         |
| Xuzhu        | TaiJiquan        |
| LingHuchong  | NULL             |
| YiLin        | NULL             |
+--------------+------------------+


右外链接显示没门课程选择的同学名称,如果没有人选择那么显示空值
mysql> SELECT s.Name,c.Cname FROM students AS s RIGHT JOIN courses AS c ON s.CID1=c.CID;    
+--------------+------------------+
| Name         | Cname            |
+--------------+------------------+
| ZhangWuji    | Hamagong         |
| GuoJing      | TaiJiquan        |
| YangGuo      | TaiJiquan        |
| Xuzhu        | TaiJiquan        |
| NULL         | Yiyangzhi        |
| NULL         | Jinshejianfa     |
| HuangRong    | Qianzhuwandushou |
| DingDian     | Qishangquan      |
| NULL         | Qiankundanuoyi   |
| HuFei        | Wanliduxing      |
| YueLingshang | Wanliduxing      |
| NULL         | Pixiejianfa      |
| NULL         | Jiuyinbaiguzhua  |
+--------------+------------------+

自链接学生和老师的名字都来自一张表
TID为SID的老师,条件TID=SID
mysql> SELECT c.Name AS student,s.Name AS teacher FROM students AS c,students AS s WHERE c.TID=s.SID;
+-----------+-------------+
| student   | teacher     |
+-----------+-------------+
| GuoJing   | DingDian    |
| YangGuo   | GuoJing     |
| DingDian  | ZhangWuji   |
| HuFei     | HuangRong   |
| HuangRong | LingHuchong |
+-----------+-------------+

查询同学的年龄大于平均年龄的
mysql> SELECT Name FROM students WHERE Age > (SELECT AVG(age)FROM students);
+-------------+
| Name        |
+-------------+
| DingDian    |
| HuFei       |
| Xuzhu       |
| LingHuchong |
+-------------+


FROM中使用子查询
mysql> SELECT Name,Age FROM (SELECT Name,Age FROM students) AS t WHERE t.Age >= 20;
+-------------+------+
| Name        | Age  |
+-------------+------+
| DingDian    |   25 |
| HuFei       |   31 |
| ZhangWuji   |   20 |
| Xuzhu       |   26 |
| LingHuchong |   22 |
+-------------+------+

复合查询,将学生表中的学生年龄和老师表中的老师年龄在一张表中显示出来
mysql> (SELECT Name,Age FROM students) UNION (SELECT Tname,Age FROM tutors);         
+--------------+------+
| Name         | Age  |
+--------------+------+
| GuoJing      |   19 |
| YangGuo      |   17 |
| DingDian     |   25 |
| HuFei        |   31 |
| HuangRong    |   16 |
| YueLingshang |   18 |
| ZhangWuji    |   20 |
| Xuzhu        |   26 |
| LingHuchong  |   22 |
| YiLin        |   19 |
| HongQigong   |   93 |
| HuangYaoshi  |   63 |
| Miejueshitai |   72 |
| OuYangfeng   |   76 |
| YiDeng       |   90 |
| YuCanghai    |   56 |
| Jinlunfawang |   67 |
| HuYidao      |   42 |
| NingZhongze  |   49 |
+--------------+------+

本文出自 “梅花香自苦寒来” 博客,请务必保留此出处http://wangjunkang.blog.51cto.com/8809812/1582666

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。