多表连接查询子查询多种查询语句(只要你想,这里都有)
Posted 别Null.了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多表连接查询子查询多种查询语句(只要你想,这里都有)相关的知识,希望对你有一定的参考价值。
目录
实例
首先,我们有三张表:dept表、emp表、staff表,依次是:
(staff表中s_id为外键)
多表连接查询
在一个查询语句中显示多张表的数据,这也叫多表数据记录的连接查询。在实现连接查询时,首先是将两个或两个以上的表按照某种关系连接起来(连接后形成一个新的关系表),然后再查询到所要求的的数据记录。连接查询分为外连接查询和内连接查询。
内连接
保留表关系中所有匹配的数据记录,舍弃不匹配的记录,注意,是只会保留符合匹配条件的记录,根据匹配条件分为:自然连接(NATURAL JOIN)、等值连接、不等连接。
自然连接
首先自动根据表关系中相同名称的字段进行记录匹配(即只保留两个同名的字段下值相同的这条记录),然后去除重复字段(重复的字段保留一个),使用关键字 NATURAL JOIN来进行自连接查询操作,自连接自动完成,无法指定连接条件。
等值连接
使用INNER JOIN...ON...的方式来实现,就是在关键字ON后面使用关系运算符“=”来指定等值条件,简单来说就是两个字段的值相等的条件。
--staff表和dept表的内连接
SELECT staff.name,dept.deptname FROM staff,dept WHERE staff.name=dept.name;
不等连接
使用INNER JOIN...ON...的方式来实现,就是在关键字ON后面可以使用>、<、>=、<=、!=这些运算符来指定不等值的条件,所以叫不等连接。
外连接
既包括两张表中匹配的记录也包括不匹配的记录。
左外连接
又称为左连接,包含左边表的所有记录,右边表的没有匹配的所有记录为null。
Select 列 from 表1 left join 表2 on 条件 (表1就是左表,表2就是右表)
--让staff表和dept表进行左连接
SELECT staff.name,dept.deptname FROM staff LEFT JOIN dept ON staff.name=dept.name;
右外连接
又称为右连接,包含右边表的所有记录,左边表的没有匹配的所有记录为null。
Select 列 from 表1 right join 表2 on 条件
--让staff表和dept表进行右连接
SELECT staff.name,dept.deptname FROM staff RIGHT JOIN dept ON staff.name=dept.name;
全外连接
在表关系的笛卡尔积中,除了相匹配的数据记录,还会包含左右两边表中不匹配的所有数据记录。
子查询
是多表连接查询的一种实现方式,在一个select语句的from子句或where子句中嵌套了另一个select语句,外层的select查询语句成为主查询,where或from语句中的查询语句成为子查询
where子句中的查询:子查询返回的值作为主查询的查询条件。
from子句中的子查询:子查询返回的是一张临时的表,主查询从该临时表中查询出满足条件的记录
实例
对应文章开头所给出的表
--查询部门编号不在部门表中的员工记录
SELECT * FROM emp WHERE depno NOT IN(
SELECT depno FROM dept);
--查询部门员工编号小于'mark'的员工编号,并且工资大于1500的员工
SELECT * FROM emp WHERE depno<(
SELECT depno FROM dept WHERE dname='mark')
AND sal>1500;
--给dept加别名d
--在部门表与员工表的内连接中查询部门表
SELECT d.depno,d.dname,d.loc
FROM dept d INNER JOIN(
SELECT depno,count(empno) AS '员工数',avg(sal) AS '平均工资'
FROM emp
ORDER BY depno
)employee;
其他查询语句
再增加一张表:stu表
模糊查询
查询语句: Select 列 from 表名 where 某列 like 条件;
‘%’ 表示0个或多个字符 ‘_’ 表示任意单个字符
--查询性别为女并且年龄小于50的记录
SELECT * FROM stu WHERE gender = 'female' and age<50;
--查询学号为s_1001并且姓名为lisi的记录
SELECT * FROM stu WHERE sid='s_1001' OR sname='lisi';
--查询学号是S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid IN('s_1001','s_1002','s_1003');
--查询学号不是S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid NOT IN('s_1001','s_1002','s_1003');
--查询年龄为null的记录
SELECT * FROM stu WHERE age IS NULL;
--查询年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age BETWEEN 20 and 40;
--查询姓贾的所有记录
SELECT * FROM stu WHERE sname LIKE '贾%';
--查询名字中包含‘玉’字的记录
SELECT * FROM stu WHERE sname LIKE '%玉%';
--查询姓名中有三个字并且最后一个字是‘玉’的记录
SELECT * FROM stu WHERE sname LIKE '__玉';
--查询姓名中第二个字母为i的学生记录
SELECT * FROM stu WHERE sname LIKE '_i%';
字段查询
- 去掉重复记录:DISTINCT
- 将NULL转换为指定的值 :IFNULL(列名,新的值)
- 给列名添加别名: as
--查询emp中的sal字段并去掉重复记录
SELECT DISTINCT sal FROM emp;
--查看雇员的月薪与佣金之和,将佣金的null转换为0
SELECT *,sal+IFNULL(comm,0) FROM emp;
--查看雇员的月薪与佣金之和,将佣金的null转换为0,并将列名改为'总工资'
SELECT *,sal+IFNULL(comm,0) as '总工资' FROM emp;
排序
对查询结果进行排序,关键字是order by
查询语句: Select 列 from 表名 [where 条件] order by 列名 asc/desc
(asc是升序 desc是降序)
--查询所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age ASC;
--查询所有性别为男的学生记录,按年龄降序
SELECT * FROM stu WHERE gender ='male' ORDER BY age DESC;
--查询所有雇员,按月薪降序排序,若月薪相同则按编号升序排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;
聚合函数
- Count() 统计指定列不为null的数量
- Count(列名) 统计指定列名里不为null的数量
- Max/min 查询列的最大/最小值
- Sum(列名) 查询列的总和
- Avg(列名) 查询列的平均值
--统计stu表中的记录数
SELECT count(*) as '总记录数' FROM stu;
--统计emp表中有佣金的记录数
SELECT count(comm) AS '有佣金' FROM emp;
--查询最高薪水
SELECT max(sal) AS '最高薪水' FROM emp;
--查询薪水大于2500的员工人数
SELECT count(sal) AS '人数' FROM emp WHERE sal >=2500;
--查询所有员工的薪水之和
SELECT sum(sal) AS '薪水总和' FROM emp;
--求所有员工的平均工资
SELECT avg(sal) AS '平均工资' FROM emp;
分组查询
主要用 group by
--查询每个部门的部门编号和每个部门的工资和
SELECT depno AS '部门编号',sum(sal) AS '工资总和' FROM emp GROUP BY depno;
--查询每个部门的部门编号以及每个部门的人数
SELECT depno AS '部门编号',count(*) AS '人数' FROM emp GROUP BY depno;
--查询每个部门的部门编号以及每个部门工资大于1500的人数
SELECT depno AS '部门编号',count(*) AS '大于1500的人数' FROM emp WHERE sal>1500 GROUP BY depno;
having子句
是对分组结果进行筛选的语句。
Where是对分组前的数据进行筛选,不满足条件的记录不进行分组;Having是对分组后的数据进行筛选,必须和group by结合起来使用,不能单独使用。
--查询工资总和大于9000的部门编号以及工资和
SELECT depno,sum(sal) FROM emp GROUP BY depno HAVING sum(sal)>9000;
LIMT分页查询
用来限定查询结果的起始行和查询行数。是mysql独有的语句。
查询语句: Select 列 from 表名 [where条件] limit 起始行索引,查询的行数。
--查询5行记录,起始行从0行开始
SELECT * FROM emp LIMIT 0;
以上是关于多表连接查询子查询多种查询语句(只要你想,这里都有)的主要内容,如果未能解决你的问题,请参考以下文章