前言
初步学习了数据库与MySQL,接下来就一起了解SQL语言中的DQL语言的相关知识,数据查询语言(DQL)全称是Data Query
Language,主要分为八个大类,是用来进行数据库中数据的查询的,即最常用的select语句。
一、基础查询
注意事项!
1.建议在最开始先启用库 use 库名
2.着重号 (``):避免字段名与关键字冲突而使用的标识符
3.执行,格式化
- - - 前提 选中的命令行时合法的
- - - 执行 - - - F9
- - - 格式化 - - - F12
特点 :
1.查询列表可以是表中的字段、常量值、表达式、函数
2.查询结果是一个虚拟的表格
语法:
select 查询列表 from 表名 ;
分类
1.查询单个字段
select 字段名(列名)from 表名 ;
2.查询多个字段
select 字段名1,字段名2... from 表名 ;
3.查询所有字段
1)select 双击选中要查询的字段,选完即可 from 表名 ;
双击选中字段,会自动使用着重符``修饰,``是为了避免字段名于关键字冲突
2)select * from 表名 ;
规定了顺序,与表一致
4.查询常量值
格式:
selcet 常量值 ;
常量值
100、'john'
5.查询表达式
select 100*98 ;
6.查询函数
select 函数名() ;
补充 :
1.起别名
注意:
别名与关键字冲突时 使用 ""or'' 修饰,推荐使用 ""
表也可以起别名,但之后查询不能使用原来的表名
好处:
1.便于理解,增强可读性
2.如果查询的字段遇到重名的情况,使用别名可以区分开来
方法:
1. 使用 as 关键字
select 100%98 as 别名 ;
select 字段名 as 别名 from 表名 ;
2.直接用空格分隔,紧跟字段名
select 字段名1 别名1,字段名2 别名2 from 表名 ;
2.去重
案例:
查询员工表涉及的部门编号(即有重复值的应用场景)
select distinct 字段名 from 表名 ;
3.+号作用
补充:
concat() 函数
- - - 功能:拼接
- - - 使用:select concat(字段名1,字段名2.....) as 别名 from 表名 ;
Java 中的 + 号:
1.运算符:两个被操作数据都是数值型
2.连接符:只要有一个被操作数据为字符串
mysql 中的 + 号:
仅仅只有一个功能:运算符
不同场景
1.select 100+90 ;
两个被操作数都是数值型,则做加法运算
2.select '123'+90 ;
其中一个为字符型,尝试将其转换为数值型
成功,继续做加法运算
失败,则字符型数值转为0
3.selcet null+90 ;
只要其中一方为null,则结果肯定为null
二、条件查询
含义:
使用 WHERE 子句来指定查询条件,从 FROM 子句的中间结果中选取适当的数据行,达到数据过滤的效果。
语法:
select 查询列表 from 表名 where 筛选条件 ;
筛选条件 - - - 类似于java 中的if判断语句
分类:
1.按条件表达式筛选(>,<,>=,<=,=,!=/<>)
2.按逻辑表达式筛选(&& || !)--- (and or not)
3.模糊查询
like 判断是否相似
between and 判断是否在给定区间
in 判断在集合中
is null 判断是否为空
三、排序查询
含义:
将查询的结果集按照指定的字段升序或降序显示。
语法:
select 查询列表 from 表 【where 筛选条件】 order by 排序列表 【asc(升) (可省略) |
desc(降)】
特点:
1.asc 代表升序,desc 代表降序,如果( order by 排序列表 )之后不写,默认升序
2.order by 子句中可以支持单个字段,多个字段,表达式,函数,别名
3.order by 子句 一般是放再查询语句的最后面,limit子句除外
四、分组查询
含义:
将查询结果按照1个或多个字段进行分组,字段值相同的为一组其实就是按照某一列进行分类。
语法:
select
分组函数,列(要求出现在group by 后)
from 表
【where 筛选语句】
group by 分组的列表
【order by 子句】
特点:
1.分组查询种少选条件【两类】
分组前:
数据源 —— 原始表
位置 —— group by 前
关键字 —— where
分组后:
数据源 —— 分组后的结果集
位置 —— group by 后
关键字 —— having
补充:1)分组函数做条件,放在having子句中
2)能用分组前筛选的,优先考虑分组前筛选【考虑性能】
2.group by 子句 ,支持 单个/多个 字段分组 ( ','分隔 ,顺序没有要求),支持表达式或函数(使用较少)
3.可排序(order by 添加到 句末)
五、连接查询
含义:
连接查询是关系数据库中最主要的查询,主要包括 内连接 、 外连接 和交叉连接等。 通过
接 运算符 可以实现多个表查询。 连接是 关系数据库模型 的主要特点,也是它区别于其它
型 数据库管理系统 的一个标志。
补充:
笛卡尔乘积现象
表现:表1 有 m行 ;表2 有n行 , 结果 = m*n 行
如何避免: 添加有效连接条件
分类:
1.按版本(年份)
sql192标准:在 mysql中 仅支持 内连接,和一部分外连接
sql199标准:支持内连接+外连接(左外+右外)+交叉连接
比较:sql199标准 功能更多/可读性较高
2.按功能
内连接:等值连接/非等值连接/自连接
外连接:左外连接/右外连接/全外连接
交叉连接:连接结果是笛卡尔乘积形式
六、子查询
含义:
子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested
Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。特点:
分类:
按子查询出现的位置:
select后面
支持标量子查询
from后面
表子查询
where或haveing后面
标量子查询/列子查询/行子查询(较少)
exists后面(相关子查询)
表子查询
判断是否有结果 --- 返回 1/0
案例:
查看所有员工的部门名
判断结果为true,就执行
:
select department _name
from department d
where exists(
select *
from employees e
where d.did = e.did ) ;
按结果集的行列数不同:
标量子查询(结果只有一行一列)
又称单行子查询
列子查询(结果只有一列多行)
又称多行子查询
行子查询(有一行多列)(有结果为多行多列的情况)
表子查询(结果一般多行多列)
七、分页查询
应用场景:
当需要展示数据量过大,不适合直接展示,需要分页提交sql请求
语法:
select 查询列表
from 表
【jointype join 表
on
where
group by
having
order by 】
limit offset,size;
size --- 要显示的条目个数
特点:
1.放在查询语句最后 --- (语句位置,和执行顺序都是)
2.offset 索引 是从 0 开始的
3.公式
要显示页数 page
每页的条目数 size
limit (page -1 )* size,size
八、union联合查询
含义:
将多条查询语句的结果合并成一个结果
应用场景:
要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息类型一致
特点:
1.要求多条查询语句的查询列数是一致的
2.要求多条查询语句的查询的每一列的类型和顺序最好一致
3.union 关键字默认去重,如果使用 union all 可包含重复项
语法:
select ******
union
select ******* ;