常見的資料SQL查詢問題
阿新 • • 發佈:2018-11-28
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);