博主用的是MySQL数据库。
一、单表查询
1、不带条件查询
单表查询是数据库中最基本的查询方式之一,其语法是:select * from 表;示例如下:
SELECT * from sys_user
2、某几列的查询
如果想查询其中的某几列,此时就不能用*号了,* 号表示查询该表所有列。此时就要选择列的名字进行有选择的查询。 其语法是:select 列名1,列名2,列名3 from 表;示例如下:
SELECT user_id,user_name ,email ,phonenumber from sys_user
3、某一行的查询
如果想查询某一行时,此时我们就需要在表尾加条件,其语法是:select * from where 列名 = ?
SELECT user_id,user_name ,email ,phonenumber from sys_user WHERE user_id =1
4、某几行的查询
如果想查询多行时,此时我们需要在上面的条件进行改动,需要把=换成in,其语法是:select * from 列名1 in ( 条件1,条件2,条件3)
SELECT user_id,user_name ,email ,phonenumber from sys_user WHERE user_id in (1,2)
或者用or关键字进行替换,其语法是: select * from 列名1 =? or 列名2 =?
SELECT * from sys_user WHERE user_id =1 or user_id =2
或者用关键字union进行替换,这种写法比较繁琐,不推荐这种写法,一般推荐第一种。 其语法是:select * from 列名1 =? union select * from 列名2 =?
SELECT * from sys_user WHERE user_id =1 UNION SELECT * from sys_user WHERE user_id =2
二、多表查询
1、基本的多表查询
如果要执行多表查询,如果不需要过滤其中的重复选项,用逗号分开多个表。此时表于表之间是并集的关系。其语法: select * from 表1,表2,表3,表4;示例如下:
SELECT * from sys_user,sys_dept
2、内连接查询
内连接查询的是两张表交集部分的数据。
内连接的语法分为两种: 隐式内连接、显式内连接。
1)、隐式内连接查询
其语法是:select * from 表1 ,表2 where 条件 ? 示例如下:
SELECT * from sys_user as u ,sys_dept as d WHERE d.dept_id =u.dept_id
2)、显示内连接
显示内连接需要用到inner join...on 这关键字 其语法是:SELECT * FROM 表1 INNER JOIN 表2 ON 条件 = ? ;示例如下:
SELECT * from sys_user as u INNER JOIN sys_dept as d on u.dept_id =d.dept_id
SELECT user_id,u.dept_id,d.dept_name from sys_user as u INNER JOIN sys_dept as d on u.dept_id =d.dept_id
3、外连接查询
外连接分为两种,分别是:左外连接和右外连接。
1)、左外链接查询
左外链接需要用到 left outer join ...on 这几个关键字,outer这个关键字可要可不要,一般可以不要, 其语法如下:SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 条件 = ? ;示例如下:
SELECT user_id,u.dept_id,d.dept_name from sys_user as u LEFT OUTER JOIN sys_dept as d on u.dept_id =d.dept_id
如果查询两个一样的字段,记住一定要取别名
SELECT * from sys_user u LEFT JOIN sys_dept d on u.dept_id =d.dept_id
2)、右外链接查询
友外链接需要用到 rigt outer join ...on 这几个关键字,outer这个关键字可要可不要,一般可以不要, 其语法如下:SELECT * FROM 表1 RIGHT OUTER JOIN 表2 ON 条件 = ? ;示例如下
SELECT user_id,u.dept_id,d.dept_name from sys_user as u RIGHT OUTER JOIN sys_dept as d on u.dept_id =d.dept_id
如果查询两个一样的字段,记住一定要取别名
SELECT * from sys_user u RIGHTJOIN sys_dept d on u.dept_id =d.dept_id
3)、两种查询的区别
1,数据集的区别
左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。
右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。
2,计算方式的区别
左外连接:计算方法是,A左连接B记录=表3的公用记录集C +表A的记录集A1。
右外连接:计算方法是,A右连接B记录=图3公共部分记录集C +表B记录集B1。
注意:左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺
序就可以了。而我们在日常开发使用时,使用比较多的是左外连接。
4、联合查询
联合查询要用到union关键字,把两张表并起来;其语法是:select * from 列名1 =? union select * from 列名2 =?;示例如下:
SELECT * from sys_user UNION SELECT * from sys_user
5、子查询
1)、概念
所谓的子查询就是SQL语句里面嵌套查询语句。
根据子查询结果不同,分为:标量子查询(子查询结果为单个值)、列子查询(子查询结果为一列、行子查询(子查询结果为一行)、表子查询(子查询结果为多行多列)。
他们之间的返回集,如下图描述所示:
查询名称 | 描述 |
标量子查询 | 一行一列 |
列子查询 | 一行多列 |
行子查询 | 多行一列 |
表子查询 | 多行多列 |
2)、标量子查询
标量子查询就是查询其中的一行,简单来说,查询某条信息。子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式(一行一列),这种子查询称为标量子查询。
常用的操作符:= <> > >= < <=
比如查询某个部门的所有员工。第一步可以查询所有所有查询该部门的id
select dept_id from sys_dept where dept_name ='济南市'
第二步根据这个部门查询的id,然后查询用户的信息
SELECT * from sys_user WHERE dept_id = (select dept_id from sys_dept where dept_name ='济南市')
3)、列子查询
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询(一列多行)。
常用的操作符:IN 、NOT IN 、 ANY 、 ALL
操作符 | 描述 |
IN | 包含其中,在某个范围内 |
NOT IN | 不包含其中,不在某个范围的里面 |
ANY | 子查询的返回集,只要一个满足就可以。 |
ALL | 子查询的返回集,需要所有的都满足 |
比如查询某两个地区的用户,第一步,我们查询到这两个地区的id,如下所示
select dept_id from sys_dept where dept_name ='济南市' or dept_name = '武汉市'
第二步,根据所查的集合的id,查询用户的信息
SELECT * from sys_user where dept_id in (select dept_id from sys_dept where dept_name ='济南市' or dept_name = '武汉市')
其他四个的逻辑,也如上所示。
3)、行子查询
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。简单的来说就是,指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。
常用的操作符:= 、<> 、IN 、NOT IN
查询与 “李四” 的薪资及直属领导相同的员工信息 ;
这个需求同样可以拆解为两步进行:
第一步、查询 “李四” 的薪资及直属领导
select salary, managerid from sys_user where sys_name = '李四';
第二步、查询与 “李四” 的薪资及直属领导相同的员工信息 ;
select * from sys_user where (salary,managerid) = (select salary, managerid from sys_user
where sys_name = '李四');
4)、表子查询
子查询返回的结果是多行多列,这种子查询称为表子查询。表子查询的返回集是多行多列,可以当一个表使用
常用的操作符:IN
A. 查询与 “张三” , “王二” 的职位和薪资相同的用户信息
分解为两步执行:
第一步、首先查找张三、王二的职业和薪资
select job, salary from sys_user where sys_name = '张三' or sys_name = '王二';
第二步、查询与 “张三” , “王二” 的职位和薪资相同的用户信息
select * from sys_user where (job,salary) in ( select job, salary from sys_user where sys_name ='张三' or sys_name = '王二' );