数据库查询学习笔记

博主用的是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 = '王二' );
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值