目录
DQL数据库查询语言
该语言用来查询记录,不会修改数据库和表结构。
单表查询
基本查询
基本语法
查询所有列:
select * from 表名;
select * from student;
查询指定的列:
select id,`name`,age,gender from student;
select id,`name`,age from student;
补充:开发中,严禁使用
select *
。
如果表中有完全重复的记录只显示一次,在查询的列之前加上distinct
。
select DISTINCT `name` from book;
别名
我们可以给列起【别名】,因为我们在查询过程中,列名很可能重复,可能名字不够简洁,或者列的名字不能满足我们的要求。
select id `编号`,`name` `姓名`,age `年龄`,gender `性别` from student;
select id as `编号`,`name` as `姓名`,age as `年龄`,gender as `性别` from student;
条件控制
按条件表达式筛选:
条件运算符:> < = != <> >= <=
按逻辑表达式筛选:
逻辑运算符:
逻辑运算符
& || !
and or not
该连接符主要用于连接表达式
作用:
1、&&和and:两个条件都为true,则结果为true,反之为false
2、||和or:只要有一个条件为true,则结果为true,反之为false
3、!和not:如果连接的条件本身为false,则结果为true,否则为false
模糊查询:
该类连接符分类:
like,between and,in,is null,<=>(安全等于)
like: 该连接符的应用场景大多用于查询某个字段中包含某个字符等,一般和通配符搭配使用
通配符
% 任意多个字符,包含0个字符
_ 任意单个字符
between and:
他所查询的就是某个区间的值大多应用场景:也可以用条件表达式去完成
特点: 1、可以提高语句简洁度
2、两个区间的值的顺序不可颠倒
3、包含临界值
in:判断某字段的值是否属于in列表中的某一项
注意特点:
①使用in提高了语句简洁度
②in列表的值必须是同一类型或兼容
③in字段不支持通配符
is null :用于判断字段值是否为null
注意: =或<>不能用于判断null值
is null 或 is not null可以判断null值
安全等于 <=>:
与 isnull进行比较
isnull仅仅可以判断null值,可读性较高,建议使用
安全等于既可以判断null值,又可以判断普通的数值,可读性较低
排序
排序方式:
- ASC:升序,默认的
- DESC:降序
特点
1.asc代表的是升序,desc代表的是降序
如果关键字不写,默认是升序
2.order by子句一般是放在查询语句的最后面,limit子句除外
3.order by子句中可以支持单个字段,多个字段,表达式,函数,别名
4.length函数表示返回字符串长度
常见函数
字符函数
concat: 拼接
substr: 截取子串
upper: 转换成大写
lower: 转换成小写
trim: 去前后指定的空格和字符
ltrim: 去左边空格
rtrim: 去右边空格
replace: 替换
lpad: 左填充
rpad: 右填充
instr: 返回子串第一次出现的索引
length: 获取字节个数
数学函数
rand: 随机数
floor: 向下取整
返回<=该参数的最大整数
ceil: 向上取整
返回>=该参数的最小整数
mod: 取余
truncate: 截断
rand:获取随机数,取值范围0-1
日期函数
now: 当前系统日期+时间
curdate: 当前系统日期
curtime: 当前系统时间
str_to_date: 将字符转换成日期
date_format: 将日期转换成字符
datediff:两个日期相差天数
monthname:以英文形式返回月
分组函数
* count:计算个数
* 一般选择非空的列:主键
* count(*)
表示统计表中所有行数,包括null
* max:计算最大值
* min:计算最小值
* sum:计算和
* avg:计算平均值
分组查询
语法:
select 查询的字段,分组函数
from 表
group by 分组的字段
特点:
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、可以按多个字段分组,字段之间用逗号隔开
4、可以支持排序
5、having后可以支持别名
注意:
分组函数做筛选不能放在where后面 能做分组前筛选的,尽量选择分组前筛选,以提高效率 分组可以按单个字段也可以按多个字段并且可以搭配着排序使用
面试题:where和having的区别?
- where是写在group by之前的筛选,在分组前筛选;having是写在group by之后,分组后再筛选。
- where只能使用分组的列作为筛选条件;having既可以使用分组的列,也可以使用聚合函数列作为筛选条件。
分页查询
limit
字句,用来限定查询结果的起始行,以及总行数。
limit是mysql
独有的语法。
select * from student limit 4,3;
select * from student limit 4;
-
如果只有一个参数,说明从起始位置查找4条记录。
-
如果两个参数,说明从第4行下一行,向后查找3条记录。
面试题:
- MySQL:limit
- Oracle:rownum
- SqlServer:top
分析:
student表中有10条数据,如果每页显示4条,分几页?3页
3页怎么来的?(int)(Math.ceil(10 / 4));
显示第一页的数据:select * from student limit 0,4;
第二页:select * from student limit 4,4;
第三页:select * from student limit 8,4;
一个问题:我想要判断在student表中有没有叫"小红"的这个人?
1.0版本
select * from student where name = '小红';
select id from student where name = '小红';
2.0版本
select count(id) from student where name = '小红';
3.0版本
select id from student where name = '小红' limit 1;
注意:Limit子句永远是在整个的sql语句的最后。
多表查询
笛卡尔积
发生原因:
- 省略连接条件
- 连接条件无效
- 所有表中所有行互相连接
如何解决:
添加有效的连接条件
注意:开发中,一定要避免出现笛卡尔积。
多表连接的方式有四种:
- 内连接
- 外连接
- 全连接
- 子查询
SQL92语法
它只支持内连接中的等值连接,非等值连接,自连接
语法:
SELECT 查询列表
FROM 表名1 别名1 ,表名2 别名2
WHERE 连接条件 【等值连接,非等值连接,自连接】
AND 筛选条件
GROUP BY 分组列表
HAVING 分组后筛选条件
ORDER BY 排序列表
SQL99语法
1999年的语法。
内连接
在我们刚才的sql当中,使用逗号分隔两张表进行查询,mysql进行优化默认就等效于内连接。
使用【join】关键字,使用【on】来确定连接条件。【where】只做筛选条件。
外连接(常用)
外连接:
应用场景:用于查询一个表中有,另一个表没有的记录
特点:
1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2、左外连接,left join左边的是主表
右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
左外连接:
select 字段列表
from 表名1
left[outer] join 表名2 on 条件
where 筛选条件
group by 分组条件
having 分组后的筛选条件
order by 排序字段
右外连接:
语法:
select 字段列表
from 表名1
right[outer] join 表名2 on 条件
where 筛选条件
group by 分组条件
having 分组后的筛选条件
order by 排序字段
全外由于MySQL不支持,因此这里只了解其语法:
select 字段列表
from 表名1
full[outer] join 表名2 on 条件
where 筛选条件
group by 分组条件
having 分组后的筛选条件
order by 排序字段
标签:day29,16,08,查询,分组,student,筛选,连接,select
From: https://www.cnblogs.com/wmh19990109/p/16593132.html