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;