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 |
+--------------+------+

时间: 2024-10-12 04:42:52

MySQL多表查询和子查询的相关文章

Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

MySQL 外连接、内连接,连接查询、多表查询、子查询、视图

MySQL连接查询.多表查询.子查询: 连接查询:事先将两张或多张表join,根据join的结果进行查询: [导入hellodb.sql数据库],输入密码即可 [[email protected] home]# mysql -uroot -p  mydb < /home/hellodb.sql     hellodb.sql数据库下载链接:http://pan.baidu.com/s/1pJKK4w7 密码:a0re [查看students表] mysql> select * from stu

mysql查询语句 和 多表关联查询 以及 子查询

原文地址: http://blog.csdn.net/github_37767025/article/details/67636061 1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 frome 表名 where 条件表达式: 例:select * from t_studect where id=1; select * from t_student wh

单表查询、多表查询和子查询

查询语句: select SELECT-LIST from  TB where QYAKUDUCATION; 简单查询: select * from TB_NAME; select FIED1,FIED2 from TB_NAME; 投影 select [distinct] * from TB_NAME where QYAKUDUCATION;选择  #distinct重复的值只显示一次 from子句:要查询的关系   表,多个表,其他的select语句 where子句:指定布尔关系表达式, =

mysql的查询、子查询及连接查询

一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数)  1.where常用运算符: 比较运算符 > ,  < ,=  , != (< >),>=   ,   <= in(v1,v2..vn) between v1 and v2    在v1至v2之间(包含v1,v2) 逻辑运算符 not ( ! )  逻辑非 or ( || )    逻辑或 and ( &&am

mysql学习笔记之连接查询与子查询

mysql连接查询与子查询 1.子查询是指在另一个查询语句中的SELECT子句. 例句: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement), SELECT column1 FROM t2 称为Sub Query[子查询]. 所以,我们说子查询是嵌套在外查询内部.而事实上它有可能在子查询内部再嵌套子查询. 子查

mysql:error 1093 update子查询

一. 需求 要将base_info.name以wl_开头的数据的status字段更新为2 二.执行 Update base_info Set a.status=2 Where (select id from base_info where name like '%xx%') 执行时,提示1093错误, ERROR 1093 (HY000): You can't specify target table 't' for update in FROM clause . mysql不支持修改一个表的时

mysql查询、子查询、连接查询

mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count().sum()等聚合函数一起使用. having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出. order by子句(排序):按照“属性名”指定的字段进行排序.排序方式由“asc”和“desc”两个参数指出,默

ORACLE 多表连接与子查询

Oracle表连接 SQL/Oracle使用表连接从多个表中查询数据 语法格式: select 字段列表from table1,table2where table1.column1=table2.column2; 说明: 在where子句中指定连接条件 当被连接的多个表中存在同名字段时,必须在该字段前加上"表名"作为前缀. 连接的类型 Oracle8i之前的表连接: 等值连接(Equijoin) 非等值连接(Non-Equijoin) 外连接(Outer join):-->左外连