多表连接查询子查询多种查询语句(只要你想,这里都有)

Posted 别Null.了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多表连接查询子查询多种查询语句(只要你想,这里都有)相关的知识,希望对你有一定的参考价值。

目录

实例

多表连接查询

内连接

自然连接

等值连接

不等连接

外连接

左外连接

右外连接

全外连接

子查询 

实例

其他查询语句

模糊查询

字段查询

排序

聚合函数

分组查询

having子句

LIMT分页查询


实例

首先,我们有三张表: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%';

字段查询

  1. 去掉重复记录:DISTINCT
  2. 将NULL转换为指定的值 :IFNULL(列名,新的值)
  3. 给列名添加别名: 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;

聚合函数

  1. Count()   统计指定列不为null的数量
  2. Count(列名)   统计指定列名里不为null的数量
  3. Max/min    查询列的最大/最小值
  4. Sum(列名)   查询列的总和
  5. 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;

以上是关于多表连接查询子查询多种查询语句(只要你想,这里都有)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库多表查询

MySQL数据库多表查询

SQL中,多表连接查询和不相关子查询从查询效率上来说,哪种查询的效果更好?为啥 ?

mysql-数据库查询语句汇总

MySQL--5子查询与连接小结

MySQL 表关系及多表操作(联合查询连接查询子查询)