1. 程式人生 > >常見的資料SQL查詢問題

常見的資料SQL查詢問題

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;


(3) 全外連線:除了返回兩個表中滿足連線條件的記錄,還會返回不滿足連線條件的所有其它行
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;


5. 自連線:自連線是一種特殊的連線查詢,資料的來源是一個表,即關聯關係來自於單表中的多個列。表中的列參照同一個表中的其它列的情況稱作自參照表。
  自連線是通過將表用別名虛擬成兩個表的方式實現,可以是等值或不等值連線。
  語法結構:
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);