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 = id;
(3)公共列:多个表中都有的字段
公司表com id 公司id
员工表emp comid 公司id
说明:通过A表查B表、通过B表查A表、必须通过公共列作为条件来查询的。
(4)多表查询中别名的运用
查询小张的公司名SELECT com.name FROM com, emp WHERE com.id = id AND emp.name = '小张';SELECT c.nameFROM com c, emp eWHERE c.id = id AND e.name = '小张';SELECT ageFROM com, empWHERE com.id = id;查询HP的员工名字SELECT emp.name FROM com, emp WHERE com.id = id AND com.name = 'HP';说明:表别名不是必须的、但是列的别名如果出现相同情况必须要有的。SELECT com.id cid, com.name cname, emp.id eid, emp.name ename, emp.ageFROM com, emp WHERE com.id = id;
(5)左连接(左外连接):LEFT JOIN … ON
理解:左表中不满足条件的数据也被查询出来。
理解:左表中数据全部查询出来。
理解:以写在前面的表为准,比如 com LEFT JOIN emp,com表写在前面,则com表是左表
SELECT *FROM com LEFT JOIN emp ON com.id = id;SELECT *FROM com LEFT OUTER JOIN emp ON com.id = id;
(6)右连接(右外连接):RIGHT JOIN … ON
说明:右表记录全部显示。
SELECT *FROM emp RIGHT JOIN com ON com.id = id;SELECT *FROM emp RIGHT OUTER JOIN com ON com.id = id;
(7)内连接(和(2)等价结果):INNER JOIN … ON
说明:只显示满足条件的记录。
SELECT *FROM com INNER JOIN emp ON com.id = id;
(二)子查询(select语句的嵌套)
说明一:先掌握多表连接的写法、再掌握子查询的写法。
说明二:多表连接用的多、子查询用的少(特定场合)。
说明三:这两种互补写法。
多表连接思想:一次查询多张表、把所有条件都添加到where中。
子查询思想:分步。
(1)SELECT子查询
举例:小张所在公司
SELECT (SELECT name FROM com WHERE id = comid) cnameFROM emp WHERE name = '小张';
(2)WHERE子查询
举例:小张所在公司
SELECT nameFROM comWHERE 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.nameFROM (SELECT comid cid FROM emp WHERE name = '小张') t01, comWHERE t01.cid = com.id;