1 创建表
 2 
 3 create table emp(
 4     id int not null unique auto_increment,
 5     name varchar(20) not null,
 6     sex enum('male','female') not null default 'male',
 7     age int(3) unsigned not null default 28,
 8     hire_date date not null,
 9     post varchar(50),
10     post_comment varchar(100),
11     salary double(15,2),
12     office int,
13     depart_id int
14     );
15 
16 查看表结构
17 
18 desc emp;
19 
20 -----------------------------------------------------------
21 插入值
22 
23 三个部门:教学,销售,运营
24 insert into emp(name, sex, age, hire_date, post, salary, office, depart_id)
25 values
26 ('jason', 'male', 18, '20170301', '张江第一帅形象代言人', 7300.33, 401, 1),
27 ('tom', 'male', 78, '20150302', 'teacher', 1000000.31, 401, 1),
28 ('kevin', 'male', 81, '20130305', 'teacher', 8300, 401, 1),
29 ('tony', 'male', 73, '20140701', 'teacher', 3500, 401, 1),
30 ('owen', 'male', 28, '20121101', 'teacher', 2100, 401, 1),
31 ('jack', 'female', 18, '20110211', 'teacher', 9000, 401, 1),
32 ('jenny', 'male', 18, '19000301', 'teacher', 30000, 401, 1),
33 ('sank', 'male', 48, '20101111', 'teacher ', 10000, 401, 1),
34 ('哈哈', 'female', 48, '20150311', 'sale', 3000.13, 402, 2),
35 ('呵呵', 'female', 38, '20101101', 'sale', 2000.35, 402, 2),
36 ('西西', 'female', 18, '20110312', 'sale', 1000.37, 402, 2),
37 ('乐乐', 'female', 18, '20160513', 'sale', 3000.29, 402, 2),
38 ('拉拉', 'female', 28, '20170127', 'sale', 4000.33, 402, 2),
39 ('僧龙', 'male', 28, '20160311', 'operation', 10000.13, 403, 3),
40 ('程咬金', 'male', 18, '19970312', 'operation', 20000, 403, 3),
41 ('程咬银', 'female', 18, '20130311', 'operation', 19000, 403, 3),
42 ('程咬铜', 'male', 18, '20150411', 'operation', 18000, 403, 3),
43 ('程咬铁', 'female', 18, '20140512', 'operation', 17000, 403, 3);
44 
45 查看表
46 select * from emp ,这时候表看起来很乱,有些字段甚至看不见,我们可以用另外一种方式查看表
47 select * from emp \G;

 。

【几个重要关键字的执行顺序:】

书写顺序:
    select id,name from emp where id>3;

执行顺序
    from
    where 筛选条件
    select

虽然执行顺序和书写顺序不一致,那我们可以:
    select * 先用*号占位
    之后补全后面的sql语句
    最后将*号替换成你想要的具体字段

where的使用

 1 作用:是对整体数据的一个筛选操作
 2     1.查询id大于等于3小于等于6的数据
 3         select id,name,age from emp where id>=3 and id<=6;
 4     或者:
 5         select id,name,age from emp where id between 3 and 6;
 6 
 7     2.查询薪资是2000或者18000或者17000的数据
 8         select * from emp where salary=20000 or salary=18000 or salary=17000;
 9     或者
10         select * from emp where salary in(20000,18000,17000);
11 
12     3.查询员工姓名中包含字母O的员工的姓名和薪资
13     模糊查询:
14         like
15             % 匹配任意多个字符
16             ——匹配任意单个字符
17         select name,salary from emp where name like '%o%';
18 
19     4.查询员工姓名是由四个字符组成的  姓名和薪资(查几个字符就用几个_)
20         select name,salary from emp where name like '____';
21     或者:
22         select name,salary from emp where char_length(name)=4;
23 
24     5.查询id小于3或者id 大于6的数据
25         select * from emp where id not between 3 and 6;
26 
27     6.查询薪资不在20000,18000,17000范围的数据
28         select * from emp where salary not in(20000,18000,17000);
29 
30     7.查询岗位描述为空的员工姓名和岗位名
31         select name,post from emp where post_comment =null;(提示这种不被允许)
32     用is:
33         select name,post from emp where post_comment is null;

【group by 分组】

分组实际应用场景   
   男女比例
部门薪资
国家之间数据统计
按照部门分组:
    select * from emp group by post;
    分组之后,最小可操作单位应该是组,不再是组内的单个数据
    上述命令在你没有设置严格模式的时候是可正常执行的,返回的是分组之后,每个组的第一条数据,
    但是这个不符合分组的规范;分组之后不应该考虑单个数据,而应该以组为操作单位(分组之后,没有办法直接获取组内单个数据)
    如果设置了严格模式,上述命令会报错,


那怎么设置严格模式呢?
    分组之后不能拿单个数据
    set global sql_mode='strict_trans_tables,only_full_group_by';
    show variables like '%mode';  到这里字段是没有生效的
    exit 退出然后重新进入才生效
    select * from emp group by post;    这时候会报错
    设置了严格模式以后,分组默认只能拿到分组的依据
    select post from emp group by post;
    按照什么分组就只能拿到分组,其他字段不能直接获取,需要借助一些方法:

那是哪些方法呢?

  聚合函数:
    count() 计数
    sum() 求和
    max() 最大值
    min() 最小值

   avg() 平均值

练习

 1 1.获取每个部门的最高薪资:
 2     select post,max(salary) from emp group by post;
 3     或者:
 4     select post as‘部门’,max(salary) as '最高薪资' from emp group by post;
 5     as可以给字段起别名,也可以省略不写
 6 
 7 2.获取每个部门的最低薪资
 8     select post,min(salary) from emp group by post;
 9 
10 3.获取每个部门的平均薪资
11     select post,avg(salary) from emp group by post;
12 
13 4.获取每个部门的薪资总和
14     select post,sum(salary) from emp group by post;
15 
16 5.获取每个部门的人数,null不行
17     select post,count(*) from emp group by post;
18     select post,count(id) from emp group by post;
19 
20 6.查询分组之后的部门名称和每个部门下所有的员工姓名:
21     group_concat(name):获取分组之后的每个字段值,还支持字段的拼接操作
22         select post,group_concat(name) from emp group by post;
23         select post,group_concat(name , '_DSB') from emp group by post;
24         select post,group_concat(name , ':',salary) from emp group by post;
25     concat:不分组的时候用
26         select concat('NAME:',name),concat('SAL:',salary) from emp;
27 
28 补充:as语法不单单可以给字段起别名,还可以给表起别名
29     select emp.id,emp.name from emp;
30     select e.id,e.name from emp as e; 正确
31 7.查询每个人的年薪
32     select name,salary*12 from emp;

===========================================================================分组注意事项

关键字where和group by同时出现时,group by必须在where之后
where 先对整体数据进行过滤之后再分组操作,where筛选条件不能使用聚合函数,聚合函数只能在分组之后使用
    select id,name,age from emp where max(salary)>3000;   报错
    select max(salary)from emp ;   正确,不分组默认整体就是一组

1.统计各部门年龄在30岁以上的员工平均薪资
    1)先求所有年龄大于30岁的员工
        select * from emp where age>30;
    2)在对结果进行分组
        select * from emp where age>30 group by post;
    整合:
        select post,avg(salary) from emp where age>30 group by post;

【having分组之后筛选】

having 的语法和 where是一致的
只不过having是在分组之后进行的过滤操作
即having是可以直接使用聚合函数的

1.统计各部门年龄在30岁以上的员工的平均薪资并且保留平均薪资大于10000的部门
    select post,avg(salary) from emp where age>30 group by post having avg(salary)>10000;
    或是
    select post,avg(salary) from emp
    where age>30
    group by post
    having avg(salary)>10000;

【distinct去重】

注意:必须是一样的数据才可以去重,带了主键(id)就去重不了
{'id':1,'name':'jason','age':20}
{'id':2,'name':'jason','age':20}
{'id':3,'name':'jn','age':20}
select distinct age from emp;

【order by排序】

用法:order by 默认是升序, asc 可以省略不写
    select * from emp order by salary;
    或者
    select * from emp order by salary asc;
也可以修改为降序:
    select * from emp order by salary desc;

order by比较是可以跟多个参数的
    select * from emp order by age desc,salary asc;
    先按照age降序排,如果碰到age相同,则再按照salary升序排

问题1.统计各部门年龄在10岁以上的员工平均薪资并且保留平均薪资大于1000的部门,然后对平均工资降序排序
    select post,avg(salary) from emp
    where age>10
    group by post
    having avg(salary)>1000 order by avg(salary) desc;

【limit限制展示条数】

select * from emp;     如果拿的数据过多,会造成计算机卡死
针对数据过多的情况,我们通常都是做分页处理:
    select * from emp limit 3;   限制展示3条数据
或者:还可以放2个数据
    select * from emp limit 0,5;   取0-5的数据
或者:
    select * from emp limit 5,5;
    第一个参数是其实位置,第二个参数是展示条数

【正则表达式】

 1 select * from emp where name regexp '^j.*(n|y)$';
 2 ^: 以什么开头      $:以什么结尾       |:或    *匹配多个
 3 正则是一门独立的语言在python中如果你想使用正则需要借助于re模块
 4 面试题
 5 1.re模块中常用的方法
 6 findall:分组优先展示
 7 ^j.*(nly)s
 8 不会展示所有正则表达式匹配到的内容
 9 而仅仅展示括号内正则表达式匹配到的内容
10 match:从头匹配
11 search:从整体匹配
12 2.贪婪匹配与非贪婪匹配
13 正则表达式默认都是贪婪匹配的
14 将贪婪变成非贪婪只需要在正则表达式后面加:?
15 .*贪婪
16 .*?非贪婪

 

 

 



posted on 2024-05-19 16:54  认真的六六  阅读(15)  评论(0编辑  收藏  举报