常见的数据SQL查询问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;


(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); 	

猜你喜欢

转载自blog.csdn.net/GavinLi2588/article/details/79965260