mysql8 查询关键字
一、查询关键字
1、数据准备
> create table emp(
-> id int primary key auto_increment,
-> name varchar(20) not null,
-> sex enum('male','female') not null default 'male',
-> age smallint(3) unsigned not null default 28,
-> hire_date date not null,
-> post varchar(50),
-> post_comment varchar(100),
-> salary double(15,2),
-> office int,
-> depart_id int
-> );
插入数据
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('tom','male',78,'20150302','teacher',1000000.31,401,1),#以下是教学部
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('乐乐','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);
2、
模糊查询:没有明确的筛选条件
关键字:like
关键符号:
%:匹配任意个数任意字符
_:匹配单个个数任意字符
show variables like '%mode%se';
1. 查询id大于等于3小于等于6的数据
> select * from emp where id >= 3 and id <=6; > select * from emp where id between 3 and 6;
2. 查询薪资是20000或者18000或者17000的数据
> select * from emp where salary=20000 or salary = 18000 or salary =17000; > select * from emp where salary in (20000,18000,17000);
3. 查询员工姓名中包含o字母的员工姓名和薪资
> select name, salary from emp where name like '%o%'; > select name, salary from emp where name like 'o%'; > select name, salary from emp where name like '%o';
4. 查询员工姓名是由四个字符组成的员工姓名与其薪资
> select name, salary from emp where name like '____'; > select name, salary from emp where char_length(name)=4;
5. 查询id小于3或者大于6的数据
> select * from emp where id < 3 or id > 6; > select * from emp where id not between 3 and 6;
6. 查询薪资不在20000,18000,17000范围的数据
> select * from emp where salary not in (20000, 18000, 17000);
7. 查询岗位描述为空的员工名与岗位名 针对null不能用等号,只能用is
> select name,post from emp where post_comment = NULL; # 查询为空 > select name,post from emp where post_comment is NULL; > select name,post from emp where post_comment is not NULL;
'''在sql中,NULL和''不一样'''
# 假如字段想设置为空,该如何设置?
最好设置为'',不要使用NULL
尤其是两者混用
3、查询关键字之group by分组
GROUP BY 是一种用于对查询结果进行分组的语句,通常与聚合函数(如 sum max min avg count 等)一起使用,以便在每个组中计算聚合值。
当使用 GROUP BY 语句时,查询结果将根据指定的列或表达式进行分组。相同的值将被分配到同一组中。然后,可以对每个组应用聚合函数,以计算该组的聚合结果。
分组之后,得到的每一个分组中的第一条数据
1. 按部门分组
select post from emp group by post;
2. 每个部门的最低工资
> select post, min(salary) from emp group by post;
3. 每个部门的平均工资
select post, avg(salary) from emp group by post;
4. 每个部门的工资总和
select post, sum(salary) from emp group by post;
5. 每个部门的人数
> select post, count(*) from emp group by post; > select post, count(id) from emp group by post; > select post, count(1) from emp group by post;
注意:
* 表示取最长的一列 id 表示取id那一列 1 表示取第一列
6、配合分组使用的其他函数,分组之后只能获取到分组的依据,获取分组之外的字段
group_concat: 用在分组之后
GROUP_CONCAT()是 MySQL 8 中的一个聚合函数,用于将多行数据中的某一列的值拼接成一个字符串。
GROUP_CONCAT([DISTINCT] expr [, expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
实例:
SELECT GROUP_CONCAT(name,age SEPARATOR ',') AS names FROM emp; +---------------------------------------------------------------------------------------------------------------------------------+ | names | +---------------------------------------------------------------------------------------------------------------------------------+ | tom78,kevin81,tony73,owen28,jack18,jenny18,sank48,哈哈48,呵呵38,西西18,乐乐18,拉拉28,僧龙28,程咬金18,程咬银18,程咬铜18,程咬铁18 | +---------------------------------------------------------------------------------------------------------------------------------+
concat:不分组使用
CONCAT()是 MySQL 8 中的一个字符串函数,用于将多个字符串拼接在一起
> select concat(name, sex) from emp; > select concat(name,'|', sex) from emp; +-----------------------+ | concat(name,'|', sex) | +-----------------------+ | tom|male | | kevin|male | | tony|male | | owen|male | | jack|female | | jenny|male | | sank|male | | 哈哈|female | | 呵呵|female | | 西西|female | | 乐乐|female | | 拉拉|female | | 僧龙|male | | 程咬金|male | | 程咬银|female | | 程咬铜|male | | 程咬铁|female | +-----------------------+
concat_ws()
CONCAT_WS()是 MySQL 8 中的一个字符串函数,用于将多个字符串拼接在一起,并使用指定的分隔符分隔它们。 语法: CONCAT_WS(separator, str1, str2, ..., strN)
CONCAT_WS()还可以用于连接表中的列, SELECT CONCAT_WS('-', first_name, last_name) AS full_name FROM employees;
示例:
> SELECT CONCAT_WS('-', name, age) AS full_name FROM emp;
+-----------+
| full_name |
+-----------+
| tom-78 |
| kevin-81 |
| tony-73 |
| owen-28 |
| jack-18 |
| jenny-18 |
| sank-48 |
| 哈哈-48 |
| 呵呵-38 |
| 西西-18 |
| 乐乐-18 |
| 拉拉-28 |
| 僧龙-28 |
| 程咬金-18 |
| 程咬银-18 |
| 程咬铜-18 |
| 程咬铁-18 |
+-----------+
select post,concat_ws('|', name, age, gender) from emp group by post;
7、查询每个部门的最高工资
> select post as '部门',max(salary) as '最高工资' from emp group by post; +-----------+------------+ | 部门 | 最高工资 | +-----------+------------+ | teacher | 1000000.31 | | sale | 4000.33 | | operation | 20000.0 | +-----------+------------+
4、关键字之having过滤,
having也是用来筛选数据的,功能上跟where是一样的,where 用在分组之前,having用在分组之后再筛选
统计各部门年龄在30岁以上的员工平均薪资,并且保留平均薪资大于10000的部门。
4.1 各部门年龄在30岁以上的员工平均薪资
> select avg(salary) from emp where age >30 group by post; +-------------+ | avg(salary) | +-------------+ | 255450.0775 | | 2500.24 | +-------------+
4.2 保留平均薪资大于10000的部门(having 用在分组之后再筛选)
> select avg(salary) from emp where age > 30 group by post having avg(salary) > 10000; +-------------+ | avg(salary) | +-------------+ | 255450.0775 | +-------------+
5、
对有重复的展示数据进行去重操作
> select distinct id,age from emp; +----+-----+ | id | age | +----+-----+ | 1 | 78 | | 2 | 81 | | 3 | 73 | | 4 | 28 | | 5 | 18 | | 6 | 18 | | 7 | 48 | | 8 | 48 | | 9 | 38 | | 10 | 18 | | 11 | 18 | | 12 | 28 | | 13 | 28 | | 14 | 18 | | 15 | 18 | | 16 | 18 | | 17 | 18 | +----+-----+ > select distinct post from emp; +-----------+ | post | +-----------+ | teacher | | sale | | operation | +-----------+
6、
1、升序和降序
> select * from emp order by salary ; # 默认就是升序ASC > select * from emp order by salary desc; # 降序
2、先按照age降序排,在年轻相同的情况下再按照薪资升序排
order by 排序字段1 desc, 排序字段2;
> select * from emp order by age desc, salary;
3、统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
> select avg(salary) as avg_salary from emp where age > 10 group by post having avg(salary) > 1000 order by avg(salary) desc ; +---------------+ | avg_salary | +---------------+ | 151842.901429 | | 16800.026 | | 2600.294 | +---------------+
7、
查询工资最高的人的详细信息
> select * from emp order by salary desc limit 1;
limit 的分页参数
select * from emp limit 0,5; # 第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置 select * from emp limit 5,5; # 第一个参数代表的是起始位置,第二个参数是总的要查条数
8、
> select * from emp where name regexp '^j.*(n|y)$'; +----+-------+------+-----+------------+---------+--------------+---------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-------+------+-----+------------+---------+--------------+---------+--------+-----------+ | 6 | jenny | male | 18 | 1900-03-01 | teacher | <null> | 30000.0 | 401 | 1 | +----+-------+------+-----+------------+---------+--------------+---------+--------+-----------+
二、
三、