SQL语句多表查询:【多表连查】和【子查询】

SQL语句多表查询:【多表连查】和【子查询】

说明:insert、update、delete只针对【一张表】执行操作。
说明:select可以查询一张表、也可以查询多张表。
说明:多表查询分为:【多表连查】和【子查询】。

(一)多表连查:至少指定【m-1】个公共列条件

(1)错误写法:笛卡尔积

A表m条记录、B表n条记录、m*n条记录。
SELECT * FROM com, emp;

(2)正确写法:

如果查询m张表、至少指定【m-1】个公共列条件、否则就会产生笛卡尔积。
SELECT * FROM com, emp WHERE com.id = emp.comid;

(3)公共列:多个表中都有的字段

公司表com id 公司id
员工表emp comid 公司id
说明:通过A表查B表、通过B表查A表、必须通过公共列作为条件来查询的。

(4)多表查询中别名的运用

查询小张的公司名

SELECT com.name 
FROM com, emp 
WHERE com.id = emp.comid AND emp.name = '小张';

SELECT c.name
FROM com c, emp e
WHERE c.id = e.comid AND e.name = '小张';

SELECT age
FROM com, emp
WHERE com.id = emp.comid;

查询HP的员工名字

SELECT emp.name 
FROM com, emp 
WHERE com.id = emp.comid AND com.name = 'HP';

说明:表别名不是必须的、但是列的别名如果出现相同情况必须要有的。

SELECT com.id cid, com.name cname, emp.id eid, emp.name ename, emp.age
FROM com, emp 
WHERE com.id = emp.comid;

(5)左连接(左外连接):LEFT JOIN … ON

理解:左表中不满足条件的数据也被查询出来。

理解:左表中数据全部查询出来

理解:以写在前面的表为准,比如 com LEFT JOIN emp,com表写在前面,则com表是左表

SELECT *
FROM com LEFT JOIN emp ON com.id = emp.comid;

SELECT *
FROM com LEFT OUTER JOIN emp ON com.id = emp.comid;

(6)右连接(右外连接):RIGHT JOIN … ON

说明:右表记录全部显示

SELECT *
FROM emp RIGHT JOIN com ON com.id = emp.comid;

SELECT *
FROM emp RIGHT OUTER JOIN com ON com.id = emp.comid;

(7)内连接(和(2)等价结果):INNER JOIN … ON

说明:只显示满足条件的记录。

SELECT *
FROM com INNER JOIN emp ON com.id = emp.comid;

(二)子查询(select语句的嵌套)

说明一:先掌握多表连接的写法、再掌握子查询的写法。
说明二:多表连接用的多、子查询用的少(特定场合)。
说明三:这两种互补写法。
多表连接思想:一次查询多张表、把所有条件都添加到where中。
子查询思想:分步。

(1)SELECT子查询

举例:小张所在公司

SELECT (SELECT name FROM com WHERE id = comid) cname
FROM emp 
WHERE name = '小张';

(2)WHERE子查询

举例:小张所在公司

SELECT name
FROM com
WHERE id in (SELECT comid FROM emp WHERE name in ('小张','小王'));

(3)FROM子查询

说明:select子查询和where子查询结果是:数据
说明:from子查询结果是:【表格和数据】
说明:from子查询主要用于【3表】以上的查询。
举例:A、B、C、D、E。
思路:from (from (from (A和B) t01, C) t02, D) t03, E

SELECT com.name
FROM (SELECT comid cid FROM emp WHERE name = '小张') t01, com
WHERE t01.cid = com.id;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YD_1989

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值