DQL:查询表数据
单表查询
查询表中的记录
select * from 表名;
1. 语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2. 基本查询
1). 多个字段的查询,用逗号分隔
select 字段名1,字段名2... from 表名;
* 注意:
如果查询所有字段,则可以使用*来替代字段列表。
2). 去除重复:
distinct
3). 计算列
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
表达式1:哪个字段需要判断是否为null
如果该字段为null后的替换值。
4). 起别名:
as:as也可以省略
基本查询综合案例:
创建表插入8条数据:CREATE TABLE stu (
id INT, -- 编号
NAME VARCHAR(20),-- 姓名
age INT,-- 年龄
sex VARCHAR(4),-- 性别
address VARCHAR(100),-- 地址
math INT, -- 数学
english INT -- 英语
);
INSERT INTO stu (id,NAME,age,sex,address,math,english) VALUES (1, '孙悟空',100,
'男','杭州',88,90),(2, '唐僧',100,'男','北京',98,99),(3, '猪八戒',80,'男','四川',78,69),
(4, '沙僧',100,'男','浙江',66,59),(5, '白龙马',29,'男','山东',60,61),(6, '哪吒',16,
'男','陕西',42,20),(7, '龙王',65,'男','天津',56,66),(8, '嫦娥',22,'女','杭州',90,79);根据以上表做基础查询:
1)查询所有: select * from stu;
2)查询 姓名 和 年龄: select name,age from stu;
3) 去除重复的结果集(需要保证结果集完全一样)
select distinct address from stu; 去除重复的地址
4) 计算math和english的分数之和
select name,math,english,math+english from stu;
注意 如果有null参与的运算, 计算结果都为null ,解决办法是 用ifnull 判断字段, 如果为null用0替代
格式: ifnull(字段,替换值)
-- 解决办法 判断可能出错的问题, 如果是null用0代替
SELECT NAME,math,english,math+IFNULL(english,0) FROM stu;
4) 起别名 as 可以省略
3. 条件查询
1). where子句后跟条件
2). 比较运算符
比较运算符 | 说明 |
>、 <、 <=、 >=、 =、 <> | <>在 SQL 中表示不等于,在 mysql 中也可以使用!= 没有== |
BETWEEN...AND | 在一个范围之内,如: between 100 and 200 相当于条件在 100 到 200 之间,包头又包尾 |
IN(集合) | 集合表示多个值,使用逗号分隔 |
LIKE '张%' | 模糊查询 |
IS NULL | 查询某一列为 NULL 的值,注:不能写=NULL |
3). 逻辑运算符
逻辑运算符 | 说明 |
and 或 && | 与, SQL 中建议使用前者,后者并不通用。 |
or 或 || | 或 |
not 或 ! | 非 |
4) 占位符:
_:单个任意字符
%:多个任意字符
综合案例
-- 查询年龄大于50岁
SELECT * FROM stu WHERE age > 50;
SELECT * FROM stu WHERE age >= 50;
-- 查询年龄等于50岁
SELECT * FROM stu WHERE age = 50;
-- 查询年龄不等于50岁
SELECT * FROM stu WHERE age != 50;
SELECT * FROM stu WHERE age <> 50;
-- 查询年龄大于等于20 小于等于50
SELECT * FROM stu WHERE age >= 20 && age <=50;
SELECT * FROM stu WHERE age >= 20 AND age <=50;
SELECT * FROM stu WHERE age BETWEEN 20 AND 50;
-- 查询年龄22岁,100岁,80岁的信息
SELECT * FROM stu WHERE age = 22 OR age = 100 OR age = 80
SELECT * FROM stu WHERE age IN (22,100,80);
-- 查询英语成绩为null
SELECT * FROM stu WHERE english = NULL; -- 不对的。null值不能使用 = (!=) 判断
SELECT * FROM stu WHERE english IS NULL;
-- 查询英语成绩不为null
SELECT * FROM stu WHERE english IS NOT NULL;
-- 查询姓孙的有哪些? like
SELECT * FROM stu WHERE NAME LIKE '孙%';
-- 查询姓名第二个字是八的人
SELECT * FROM stu WHERE NAME LIKE "_八%";
-- 查询姓名是3个字的人
SELECT * FROM stu WHERE NAME LIKE '___';
-- 查询姓名中包含僧的人
SELECT * FROM stu WHERE NAME LIKE '%僧%';