• Python基础学习(38) 数据的操作 单表查询 where条件 分组聚合


    Python基础学习(39) 数据的操作 单表查询 where条件 分组聚合

    一、今日内容大纲

    • 数据的操作
    • 单表查询
    • where条件
    • 分组聚合

    二、数据的操作

    首先我们创建一个表以供增删改操作:

    create table t1(
        id int primary key auto_increment,
        username char(12) not null,
        sex enum('male', 'female') default 'male',
        hobby set('上课', '写作业', '考试') not null
    );
    

    1. 增加

      # 增加数据
      insert into t1 values(1, '大壮', 'male', '上课');
      insert into t1 values(2, '都详细', 'male', '写作业,考试');
      insert into t1 values(3, 'b个', 'male', '写作业'), (4, '装波', 'male', '考试');
      insert into t1(username, hobby) values('样的杠','上课,写作业,考试');
      
      # 也可以从其它表中调取数据
      # 创建t2
      create table t2(
          id int,
          name char(12)
      );
      # 从t1调取数据加入t2
      insert into t2(id, name) select id, username from t1;
      
    2. 删除

      # 删除
      delete from t1 where id = 3;
      delete from t2;  # 会删除表,但不会删除自增字段的偏移量
      truncate table t1;  # 会清空表和自增偏移量
      
    3. 修改

      # 修改
      update t1 set id=1, hobby='写作业,考试' where id = 2;
      
      # 另外也可以依靠navicat可视化工具实现对数据的可视化,利用pymysql模块实现对数据的操作
      

    三、单表查询

    首先进行建表数据准备:

    company.employee
        员工id      id                  int
        姓名        emp_name            varchar
        性别        sex                 enum
        年龄        age                 int
        入职日期     hire_date           date
        岗位        post                varchar
        职位描述     post_comment        varchar
        薪水        salary              double
        办公室       office              int
        部门编号     depart_id           int
    
    
    
    #创建表
    create table employee(
    id int not null unique auto_increment,
    emp_name varchar(20) not null,
    sex enum('male','female') not null default 'male', #大部分是男的
    age int(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
    );
    
    
    #查看表结构
    mysql> desc employee;
    +--------------+-----------------------+------+-----+---------+----------------+
    | Field        | Type                  | Null | Key | Default | Extra          |
    +--------------+-----------------------+------+-----+---------+----------------+
    | id           | int(11)               | NO   | PRI | NULL    | auto_increment |
    | emp_name     | varchar(20)           | NO   |     | NULL    |                |
    | sex          | enum('male','female') | NO   |     | male    |                |
    | age          | int(3) unsigned       | NO   |     | 28      |                |
    | hire_date    | date                  | NO   |     | NULL    |                |
    | post         | varchar(50)           | YES  |     | NULL    |                |
    | post_comment | varchar(100)          | YES  |     | NULL    |                |
    | salary       | double(15,2)          | YES  |     | NULL    |                |
    | office       | int(11)               | YES  |     | NULL    |                |
    | depart_id    | int(11)               | YES  |     | NULL    |                |
    +--------------+-----------------------+------+-----+---------+----------------+
    
    #插入记录
    #三个部门:教学,销售,运营
    insert into employee(emp_name,sex,age,hire_date,post,salary,office,depart_id) values
    ('egon','male',18,'20170301','老男孩驻沙河办事处外交大使',7300.33,401,1), #以下是教学部
    ('alex','male',78,'20150302','teacher',1000000.31,401,1),
    ('wupeiqi','male',81,'20130305','teacher',8300,401,1),
    ('yuanhao','male',73,'20140701','teacher',3500,401,1),
    ('liwenzhou','male',28,'20121101','teacher',2100,401,1),
    ('jingliyang','female',18,'20110211','teacher',9000,401,1),
    ('jinxin','male',18,'19000301','teacher',30000,401,1),
    ('成龙','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)
    ;
    
    #ps:如果在windows系统中,插入中文字符,select的结果为空白,可以将所有字符编码统一设置成gbk
    

    单表查询具体操作如下:

    # 表单查询
    select * from employee;
    select id, emp_name from employee;
    
    # 重命名关键字
    select id, emp_name as name from employee;
    select id, emp_name name from employee;
    select id i, emp_name name from employee;
    
    # 去重查询
    select distinct post from employee;
    select distinct age, sex from employee;  # 只有两个字段同时相同才会被去重
    
    # 四则运算
    select emp_name, salary*12 as annual_salary from employee;
    
    # 拼接
    select concat(emp_name,':',salary) from employee;  # 显示为 emp_name:salary
    select concat_ws('|', id, emp_name, salary) from employee;  # 显示为 id|emp_name|salary
    
    # 条件判断:case语句(无法筛选数据使其不显示)
    select
        (
            case
            when emp_name = 'jingliyang' then
                emp_name
            when emp_name = 'alex' then
                concat(emp_name,'_BIGSB')
            else
                concat(emp_name,'_SB')
            end
        ) as new_name
    from
        employee;
    
    # 练习:
    # 1.查出所有员工的名字、薪资,格式为:
    # <名字:egon>   <薪资:3000>
    # 2.查出所有的岗位(去掉重复)
    # 3.查出所有员工的名字以及他们的年薪,年薪的字段名为annual_year
    select concat('<名字:', emp_name, '>   <薪资:', salary, '>') from employee;
    select distinct post from employee;
    select emp_name, salary*12 as annual_salary from employee
    

    四、where条件

    where主要用于筛选所有符合条件的行,主要支持:

    • 比较运算符:> < >= <= <> != 等;
    • 值区间:between 50 and 100表示"值在50到100之间";
    • 多个值:in(80, 90, 100)表示“值为80、90或100”;
    • 模糊查找:
      • like 'a%'表示“以a为开头的字符”,统配符%表示任意多字符,_表示一个字符;
      • regex 'regex'表示“所有正则表达式对应为'regex'的字符串”;
    • 逻辑运算符:not or and 优先级递减;
    # 练习
    # 查看岗位是teacher且薪资不是10000或9000或30000的员工姓名、年龄、薪资
    select emp_name, age, salary from employee where post = 'teacher' and salary not in(10000, 9000, 30000);
    # 查看岗位是teacher且名字不是jin开头的员工姓名、年薪
    select emp_name, salary from employee where post = 'teacher' and emp_name not like 'jin%';
    

    五、分组聚合

    1. 分组(group by)

      分组会删除所有重复情况。根据分组,可以求得这个组的总人数、最大值、最小值、平均值、求和,但是求出来的值只和分组字段对应,不和其他任何字段对应,这个时候查出来的所有其他字段都不生效;

      如我们按照post分组:

      select * from employee group by post;
      

      返回结果如下:

      image-20201011224148764

    2. 聚合函数

      聚合函数主要和分组搭配食用,可以求取分组的各种统计情况:

      • count():求个数;
      • max():求最大值;
      • min():求最小值;
      • sum():求和;
      • avg():求平均值;
      • group_concat():将所有分组所查元素拼接;
      # group_concat()可以将所有查到的元素拼接到一起看
      select post, group_concat(emp_name) from employee group by post;
      

      返回结果如下:

      image-20201011224648913

      # 小练习:
      # 1.查询岗位名及岗位包含的所有员工名字
      select post, group_concat(emp_name) from employee group by post;
      # 2.查询岗位名及各岗位内包含的员工个数
      select post, count(id) from employee group by post;
      # 3.查询公司内男员工和女员工的个数
      select sex, count(id) from employee group by sex;
      # 4.查询岗位名及各岗位的平均薪资
      select post, avg(salary) from employee group by post;
      # 5.查询岗位名及各岗位的最低薪资
      select post, min(salary) from employee group by post;
      # 6.查询岗位名及各岗位的最高薪资
      select post, max(salary) from employee group by post;
      # 7.查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
      select sex, avg(salary) from employee group by sex;
      
    3. 过滤语句(having)

      having主要使用也是用于过滤select from 的输出结果,但是与where不同的是,having可以使用聚合函数而where不可以;适合去筛选符合条件的某一组数据,而不是某一行数据;需要先分组再过滤,如求薪资大于xx的部门,求人数大于xx的性别,求人数大于xx的年龄等;

      # 查询平均薪资大于10000的岗位名及平均薪资
      select post, avg(salary) from employee group by post having avg(salary) > 10000;
      # 查询各岗位内包含的员工个数小于2的岗位名,岗位内包含员工名字、个数
      select post, group_concat(emp_name), count(id) from employee group by post having count(id) < 2;
      
    4. 查询排序(order by)及limit的用法

      主要用于查询结果的排序,时间也可参与排序:

      # order by 查询排序(时间也可以参与排序)
      # 从小到大排序薪资
      select * from employee order by salary;
      # 从大到小排序薪资
      select * from employee order by salary desc;
      # 先从小到大排年龄,年龄相同的情况下从大到小排序薪资
      select * from employee order by age, salary desc;
      # 取薪资最高的人
      select * from employee order by salary desc limit 1;
      # 取薪资前三的人
      select * from employee order by salary desc limit 3;
      # 取薪资第三的人
      select * from employee order by salary desc limit 2, 1;
      # limit m, n:从m+1项开始,取n项;如果不写m,m默认为0;(limit m offset n与之同义)
      
  • 相关阅读:
    Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
    Springmvc bean依赖注入为空
    protocol Buffer
    SSO单点登录
    .gitignore 不生效问题
    IntelliJ IDEA 背景色以及字体设置
    zookeeper 集群
    zookeeper 下载安装
    springboot 连接redis
    xshell 连接redis
  • 原文地址:https://www.cnblogs.com/raygor/p/13800023.html
Copyright © 2020-2023  润新知