版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GavinLi2588/article/details/79965260
1. 等值查询
SELECT e.empId, e.username, e.salary, d.deptId, d.deptName
FROM employee e, department d
WHERE e.deptId = d.deptId;
2. 三表等值连接询
SELECT e.empId, e.username, ei.realName, e.password, ei.age, e.email, e.salary, d.deptId, d.deptName
FROM employee e, employeeInfo ei ,department d
WHERE e.empId=ei.empId AND e.deptId=d.deptId;
3. 内连接:内连接返回两个表中所有满足连接条件的数据记录。
-- 以下三种查询方式查询结果相同:
SELECT e.empId, e.username, e.salary, d.deptId, d.deptName
FROM employee e, department d
WHERE e.deptId = d.deptId;
SELECT e.empId, e.username, e.salary, d.deptId, d.deptName
FROM employee e
JOIN department d
ON e.deptId = d.deptId;
ELECT e.empId, e.username, e.salary, d.deptId, d.deptName
FROM employee e
INNER JOIN department d
ON e.deptId = d.deptId;
4. 外连接:不仅返回满足连接条件的记录,还将返回不满足连接条件的记录。
(1) 左外连接:以左表为驱动,检索右表,检索结果是:显示左表的所有数据和右表中满足where条件的数据,右表中不满足条件的位置用null填充。
SELECT e.empId, e.username, e.gender, e.email, e.salary, e.comm, e.shift, e.deptId, d.deptName
FROM employee e
LEFT OUTER JOIN department d
ON e.deptId = d.deptId;
(2) 右外链接:以右表为驱动,检索左表,检索结果是:显示右表的所有数据和左表中满足where条件的数据,左表中不满足条件的位置用null填充。
SELECT e.empId, e.username, e.gender, e.email, e.salary, e.comm, e.shift, e.deptId, d.deptName
FROM employee e
RIGHT OUTER JOIN department d
ON e.deptId = d.deptId;
SELECT e.empId, e.username, e.gender, e.email, e.salary, e.comm, e.shift, e.deptId, d.deptName
FROM employee e
FULL OUTER JOIN department d
ON e.deptId = d.deptId;
自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接。
语法结构:
SELECT t1.C1, t1.C2, t1.C3, t2.C1, t2.C2, t2.C3
FROM table t1
JOIN table t2
ON t1.Cx = t2.Cx;
典型查询问题:通过员工用户名(工号)查询员工信息表中某一员工上司的信息。
思路分析:为所要查询的表分别取两个不同的别名,一个表示员工信息表,一个表示上司信息表;
然后通过条件:员工信息表中员工上司编号=上司信息表中的员工编号,并且员工信息表中的用户名=要查询的员工的用户名(工号),实现查询。
SELECT emps.empno, emps.ename, manager.empno, manager.ename, manager.sal, manager.comm
FROM emp emps, emp manager
WHERE emps.mgr=manager.empno
AND lower(emps.ename)='gavin';
SELECT m.empid, m.username, m.password, m.gender, m.email, m.salary, m.comm, m.title, m.superior, m.deptid, m.shift
FROM employee e, employee m
WHERE e.superior=m.empid
AND e.username='Zhang Long';
6. 查询一张表中某一字段出现重复的数据值:
-- 根据员工信息表(employee)查询企业都有哪些职位(title)。
SELECT title FROM employee GROUP BY title HAVING COUNT(*)>1;
7. 查询一张表中某一字段出现重复的数据值,并统计重复次数:
-- 查询员工信息表(employee)中所有职位(title),以及各职位有多少人。
SELECT COUNT(empId), title FROM employee GROUP BY title;
8. 查询一种表中某一字段出的现重复数据值对应的所有数据:
-- 查询员工信息表(employee)中所有职位(title)重复的员工的全部信息。
SELECT * FROM employee WHERE title in (SELECT title FROM employee GROUP BY title HAVING COUNT(title)>1);