MySQL DQL数据查询语言
DQL语言的学习
基础查询
语法:
SELECT 要查询的东西【FROM 表名】;
特点:
* 通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
* 要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数
起别名
* SELECT last_name AS 姓 FROM info;
* SELECT last_name 姓 FROM info;
便于理解
查询字段第一名情况,使用别名可以区分开来
字符串连接
SELECT CONCAT(last_name,first_name) AS 姓名 FROM info;
+会把字符串转数字,不成功则为0,然后相加
若其中一方为NULL,则结果为NULL,可以使用IFNULL(name,default),若name为NULL,则返回default
去重
SELECT DISTINCT last_name 姓 FROM info;
条件查询
条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法:
select
要查询的字段|表达式(计算+-*/%等)|常量值|函数(输出函数返回值)
from
表
where
条件 ;
关键字名作字段使用``包装
分类:
一、条件表达式
示例:salary>10000
条件运算符:
> < >= <= = != <>
**<=> 安全等于,可以用在NULL,上面的不行**
二、逻辑表达式
示例:salary>10000 && salary<20000
逻辑运算符:
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true
三、模糊查询
like:
where last_name like 'a%' ESCAPE '#'; 字符形要加引号,%表示任意多个字符,_表示一个,默认是\转义,可以使用ESCAPE指定
between and:
where a BETWEEN 20 AND 30; 包含两端,不可交换位置
in:
where last_name IN('','',...); 不支持通配符
is null:
where lastt_name IS [NOT] NULL;
排序查询
语法:
select
要查询的东西
from
表
where
条件
order by 排序的字段|表达式|函数|别名 【asc|desc】,...
* 可以用,进行多个条件复合
分组查询
语法:
select 分组函数,查询的字段
from 表
【where】
group by 查询的字段
【order by】
【having】
特点:
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、分组筛选针对的表位置关键字
分组前筛选: 原始表 group by的前面 where
分组后筛选: 分组后的结果集 group by的后面 having
4、可以按多个字段分组,字段之间用逗号隔开
5、可以支持排序
6、having后可以支持别名
多表连接查询
笛卡尔乘积:如果连接条件省略或无效则会出现
解决办法:添加上连接条件
一、传统模式下的连接 :等值连接、非等值连接
1.等值连接的结果 = 多个表的交集
2.n表连接,至少需要n-1个连接条件
3.多个表不分主次,没有顺序要求
4.一般为表起别名,提高阅读性和性能,用了原表名就不能用了
二、sql99语法:通过join关键字实现连接
含义:1999年推出的sql语法
支持:
等值连接、非等值连接 (内连接)
外连接
左外
右外
全外
交叉连接
语法:
select 字段,...
from 表1
【inner|left outer|right outer|full outer|cross】
join 表2 别名
on 连接条件
【inner|left outer|right outer|full outer|cross】
join 表3 别名
on 连接条件
【where 筛选条件】
【group by 分组字段】
【having 分组后的筛选条件】
【order by 排序的字段或表达式】
outer和inner可以省略
1. 内连接,找不到对应的,就不显示
2. 外连接,查询结果为主表中的所有记录。用于一个表有,另外一个表找不到对应的情况。主表中每行都显示出来,若找不到匹配的值用null。等于内连接结果+没匹配到的行和null
3. 左右连接,左连接表示左边是主表,右连接表示右边是主表
4. 全外连接,等于内连结果+主表没匹配到的行和null+从表没匹配到的行和null
5. 交叉连接,等于笛卡尔乘积
三、自连接
同一个表有多个意义,如员工表也可以表示为领导表,但是又不能用一个表就完成,需要自连接自己
案例:查询员工名和直接上级的名称
sql99
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;
sql92
SELECT e.last_name,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;
子查询
含义:
一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询
在外面的查询语句,称为主查询或外查询
特点:
1、子查询都放在小括号内,一般放在条件的右侧
2、子查询优先于主查询执行,主查询使用了子查询的执行结果
非法使用子查询的情况:
a、子查询的结果与对应的操作符不符
b、子查询的结果为空
3、子查询可以放在
select后面 仅标量子查询
from后面 支持表子查询,需要给查询一个表名
where、having后面 标量、列、行子查询
exists后面 表子查询,结果是1或0,表示子查询是否有结果集
4、子查询根据结果集不同分为以下几类:
* 标量子查询
结果集只有一行一列
一般搭配单行操作符使用:> < = <> >= <=
* 列子查询
结果集只有一列多行
一般搭配多行操作符使用:any、all、in、not in
in: 属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替
* 行子查询
结果集有一行多列,或多行多列(较少)
例 where (name,age) = (
selece name,age from info;
)
* 表子查询
结果集一般为多行多列
分页查询
应用场景:
实际的web项目中需要根据用户的需求提交对应的分页查询的sql语句
语法:
select 字段|表达式,...
from 表
【where 条件】
【group by 分组字段】
【having 条件】
【order by 排序的字段】
limit 【offset】size;
特点:
1.offset从0开始
2.limit子句放在查询语句的最后
3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每页显示条目数sizePerPage
要显示的页数 page
联合查询
引入:
union 联合、合并。将多条查询语句的结果合并成一个结果。要查询的结果来自多个表,且多个表没有直接的关联,且查询的信息类似。
语法:
select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】
select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】
select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】
.....
select 字段|常量|表达式|函数 【from 表】 【where 条件】
特点:
1、多条查询语句的查询的列数必须是一致的
2、多条查询语句的查询的列的类型和顺序几乎相同
3、union代表去重,union all代表不去重
本文标题:MySQL DQL数据查询语言
文章作者:whppmy
发布时间:2023-03-04
最后更新:2022-08-30
原始链接:http://bugnull.com/数据库/mysql-dql数据查询语言/
版权声明:个人记录,没有获取同意时,禁止转载!!