DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where 等
select * from 表名;
语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
基础查询
一、多个字段的查询
select 字段名1,字段名2,... from 表名;
注意:
如果查询所有字段,可以用 * 来代替字段列表
二、去除重复
distinct
eg: SELECT DISTINCT 列名 FROM 表名;
多列名时,保证每行对应列名处完全一样才可以去除
三、计算列
一般可以使用四则运算计算一些列的值。
eg:SELECT name,math,english,math+english FROM 表名;
math + english即是运算,并且新建别名
IFNULL(表达式1,表达式2):NULL参与的运算,计算结果都为NULL
表达式1:哪个字段需要判断为NULL
表达式2:替换为哪个值
SELECT name,math,english,math+ IFNULL(english,0) FROM 表名;
四、起别名
SELECT name,math,english,math+ IFNULL(english,0) AS 总分 FROM 表名;
AS 也可以省略,一定要有空格
条件查询
1.where字句后跟条件
2.运算符
、< 、<= 、>= 、= 、<>(不等于)
BETWEEN...AND...
IN( 集合)
LIKE:模糊查询
占位符:在 where like 的条件查询中,SQL 提供了四种匹配方式。 '%':表示任意 0 个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中 文,请使用两个百分号('%%')表示。 '_':表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。 '[]':表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 '[^]' :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 查询内容包含通配符时,由于通配符的缘故,导致我们查询特殊字符 “%”、“_”、“[” 的语句无法正常实现,而把特殊字符用 “[ ]” 括起便可正常查询。 '_' //单个任意字符 '%' //多个任意字符 '%a' //以a结尾的数据 'a%' //以a开头的数据 '%a%' //含有a的数据 '_a_' //三位且中间字母是a的 '_a' //两位且结尾字母是a的 'a_' //两位且开头字母是a的
IS NULL
and 或 &&
or 或 ||
not 或 !
-- 查询年龄大于20岁
SELECT * FROM student WHERE age > 20;
SELECT * FROM student WHERE age >= 20;
-- 查询年龄等于20岁
SELECT * FROM student WHERE age = 20;
-- 查询年龄不等于20岁
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;
-- 查询年龄大于等于20 小于等于30
SELECT * FROM student WHERE age >= 20 && age <=30;
SELECT * FROM student WHERE age >= 20 AND age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
-- 查询年龄22岁,18岁,25岁的信息
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM student WHERE age IN (22,18,25);
-- 查询英语成绩为null
SELECT * FROM student WHERE english = NULL; -- 不对的。null值不能使用 = (!=) 判断
SELECT * FROM student WHERE english IS NULL;
-- 查询英语成绩不为null
SELECT * FROM student WHERE english IS NOT NULL;
LIKE的模糊查询例子
-- 查询姓马的有哪些? like
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询姓名第二个字是化的人
SELECT * FROM student WHERE NAME LIKE "_化%";
-- 查询姓名是3个字的人
SELECT * FROM student WHERE NAME LIKE '___';
-- 查询姓名中包含德的人
SELECT * FROM student WHERE NAME LIKE '%德%';
一.排序查询
语法:order by 字句
order by 排序字段1 排序方式1,排序字段2 排序方式2,..排序字段n 排序方式n;
排序字段:目标列
排序方式:
ASC:升序,默认
DESC:降序
注意:
如果有多个排序条件,则只有前面条件值一样时,才执行后面的条件
二.聚合函数
将一列数据作为一个整体,进行纵向的计算(排除了非空的值)
SELECT 聚合函数(列名) FROM 表名;
如果把null纳入计算,要把null的值替换后再计算
解决方案:
①:IFNULL函数
SELECT 聚合函数(IFNULL(列名,替换后的值)) FROM 表名;
②:使用不包含NULL的列进行计算
1、count:计算个数
1. 一般选择非空的列:主键
2. count(*):一般不推荐写 * ,一般写主键
2、max:计算最大值
3、min:计算最小值
4、sum:计算和
5、avg:计算平均值
三.分组查询
语法:
group by 分组字段;
注意:
1.分组之后查询的字段:分组字段、聚合函数
2.
where 和 having的区别
where:在分组之前限定,如果不满足条件,不参与分组
having:在分组之后限定,如果不满足条件,不会被查询出来(意味着,having有时候在分组后基础上再筛选)
where:后面不可以跟聚合函数
having:后可以进行聚合函数的判断如果是筛选和排序,需要先进行筛选,再排序
简化写法,在聚合函数后取一个别名,判断时用别名(一般取英文)进行判断
四.分页查询
语法:
<kbd>limit 开始的索引, 每页的条数;(仅仅在MySQL语句)
公式:开始的索引 = (当前的页码-1)* 每页显示的条数
分页操作时一个MySQL的“方言”
联表查询
操作 | 描述 |
---|---|
Inner join | 如果表中至少有一个匹配,就返回行 |
left (Outer)join | 从左表中返回所有的值,即使右表中没有匹配 |
right (Outer)join | 从右表中返回所有的值,即使左表中没有匹配 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。