常见的数据SQL查询问题
程序员文章站
2024-03-23 19:57:16
...
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);
推荐阅读
-
常见的数据SQL查询问题
-
数据库的分页技术 博客分类: 数据库 SQL Serveroraclemysql
-
帆软报表FineReport中数据连接的JDBC连接池属性问题 博客分类: 技术,解决方案 JDBC连接池数据连接FineReport
-
游标中嵌套有其他查询时要注意的问题 博客分类: Mysql MySQL游标存储过程
-
MYSQL-----按百分比查询数据(limit关键字的使用问题)
-
使用JdbcTemplate调用输出参数为结果集(REF游标)的集合 博客分类: 常见问题 常见问题
-
前后端数据交互的问题
-
(九)Django学习——一对一,一对多,多对多关系表的各种数据操作;跨关联关系的多表查询!
-
php中查询数据库含通配符时需要转义的问题
-
海量数据处理的 Top K算法(问题) 小顶堆实现