文章目录
一、概念
DQL为数据查找
/*
1.根据需要对数据进行筛选
2.确定数据以什么样的方式显示
3.使用select语句来查找数据
*/
二、基本查询指令 select
1.select
/*语法格式
select
[all|distinct]
<目标列表达式1>[别名],
<目标列表达式2>[别名]...
from <表名或视图名> [别名],<表名或视图名>
[where<条件表达式>]
[group by <列名>]
[having <条件表达式>]
[order by <列名> [asc|desc]]
[limit <数字或列表>]
*/
#简化: select *|列名 from 表 where 条件
现创建名为emp的员工列表,包含性别,id ,姓名等信息如
VALUES (2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
-- 1.查询所有员工
select * from emp;
-- 2.查询员工名以及员工年龄
select name,age from emp;
2.别名查询
-- 表别名:
select *
from emp as p;
#多表查询时会使用别名来区分
-- 列别名
select pname as '商品名',price '商品价格' from product;
3.去除重复值
select distinct gender from emp;
4.查询结果是表达式(运算查询)
select name,concat(gender,'孩子') '性别' from emp;
#字符串拼接 concat(str1,str2)
三、运算符
/*
- 算数运算符
- 比较运算符
- 逻辑运算符
- 位运算符
*/
1.算数运算符(略)
2.比较运算符
1.<=> 安全等于,两个操作码均为NULL其所得为1;一个为NULL时所得值为零
2.is NULL 判断值是否为NULL
3.LEAST 返回最小值
4.GREATEST 最大值
5.BETWEEN AND 两数值之间
6.IN 列表中一个值
7.LIKE 通配符匹配 -- %为通配符
8.REGEXP 正则表达式匹配
3.逻辑运算符
1. NOT/! 逻辑非
2. AND/&& 逻辑与
3. OR/|| 逻辑或
4. XOR 逻辑异或
4.位运算符
1. | 按位或
2. & 按位与
3. ^ 按位异或
4. << / >> 按位左移 / 右移
5. ~ 按位取反
四、综合使用示例
-- 查找表emp内所有信息
select *
from emp;
-- 查找姓名为李静的员工的所有信息
select *
from emp
where name = '李静';
-- 查询编号大于6的员工
select *
from emp
where id > 6;
-- 查找名字带'牛'的员工
select *
from emp
where name like '%牛%'; # '%'匹配任意字符串
-- 查找姓名以丰结尾的三字名员工
select *
from emp
where name like '__丰'; # '_'匹配单个字符
-- 查找性别为NULL的员工
select *
from emp
where gender is NULL; # 不能使用=匹配NULL 需要使用is
-- 求最小/大值
select least(10,2,5) #返回2
select least(10,NULL,5) #返回NULL :无法比较NULL
select greatest(10,2,5);#返回10
五、高级查询指令
1.排序查询 order by
-- 字段名1 [asc]升序(默认) , 字段名2[desc]降序
例1.按照身份证号降序查询
select *
from emp
order by idcard desc;
例2.按照性别升序排列的基础 按照序号降序排列
select *
from emp
order by gender,id desc;
2.聚合查询
/* 1.常见的聚合函数
count() 统计指定列不为NULL的记录行数
count()参数为* 时统计所有记录的个数(包含NULL)
sum() 计算指定列的数值和 非数值类型结果为0
max() 计算指定列最大值 字符串类型进行排序运算
min() 计算最小值 同上
avg() 计算指定列的平均值
上述四条函数忽视NULL值的存在
*/
示例
-- 1.查询员工总人数
select count(name) as '员工人数'
from emp;
-- 同时也可写为下列形式
select count(*) as '员工人数'
from emp;
-- 查询男性员工数目
select count(*)
from emp
where gender = '男';
-- 查询员工年龄总和
select sum(age) as '总年龄'
from emp;
-- 查询年龄最小的员工
select min(age) as '员工最小年龄'
from emp;
-- 查询员工平均年龄
select avg(age) as '员工平均年龄'
from emp;
3.分组查询 group by
# 格式:select 字段1,字段2... from 表名 group by 分组字段 having 分组条件
示例
-- 1.统计各个性别的员工个数
select gender,count(idcard)
from emp
group by gender;
-- 2.可以多个字段匹配各字段相同的元素
select gender,id<13,count(idcard)
from emp
group by gender,id<13;
4.分组之后的条件筛选 having
/*
不能使用where筛选分组之后的统计结果
需要使用having
select 字段1,字段2... from 表名 group by 分组字段 having 分组条件;
*/
示例
-- 分性别统计员工个数,且只显示大于6的结果
select gender, count(name) bg
from emp
group by gender
having bg > 6;
5.分页显示 limit
/*
-- 方式1,显示前n条
select 字段1,字段2... from 表名 limit n
-- 方式2,分页显示
select 字段1,字段2...from 表名 limit m,n
查询从m到n的序号的内容
-注意序号从0开始
*/
例
-- 查询emp表前5条记录
select *
from emp
limit 5;
-- 查询从第四条开始 显示五条
select *
from emp
limit 3,5;
6.数据表导入 insert into select
/*
将数据表1的内容导入到数据表2中
insert into Table2 select * from Table1
*/
示例
-- 将emp中的员工名称单独导入到emp_name的表中
insert into emp_name (name)
select name from emp;