• Day46 MySQL查询关键字


    Day46 MySQL 语句补充

    1、操作表的SQL语句补充

    修改表名

    alter table 表名 rename 新表名;
    
    • 1

    新增字段

    #默认新增在末尾
    alter table 表名 add 字段名 字段类型(数字) 约束条件;
    
    #新增在该已存在字段后面
    alter table 表名 add 字段名 字段类型(数字)约束条件 after 已经存在的字段;
    
    #新增在 第一列的字段
    alter table 表名 add 字段名 字段类型(数字) 约束条件 first;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    修改字段

    # 利用 changge
    alter table 表名 change 就自断 新字段 字段类型(数字) 约束条件;
    
    #利用 modify
    alter table 表名 modify 字段名 新的字段类型(数字) 约束条件;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除字段

    alter table 表名 drop 字段名;
    
    • 1

    2、查询关键字

    前期数据准备

    create table emp(
          id int not null unique auto_increment,
          name varchar(20) not null,
          gender 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
        );
        # 三个部门: 数学、销售、运营
    #添加数据
    insert into emp(name,gender,age,hire_date,post,salary,office,depart_id) values
        ('jason','male',18,'20170301','浦东第一帅形象代言',7300.33,401,1), #以下是教学部
        ('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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2.1、查询关键字之select与from

    SQL 语句的关键字编写顺序与执行顺序是不一致的!!

    select name from emp;
    # 先找到这张表 之后再去这张表里查找 name 字段
    
    • 1
    • 2

    编写SQL语句针对select 和 from 可以先写个固定模板

    select * from 表名 其他操作
    
    • 1

    select 后的字段可能是实际的 也可能是通过SQL动态产生的 所以可以先用*占位最后再修改
    select
    自定义查询表重字段对应的数据

    from
    指定操作的对象(到底是哪张表 也可能是多张)

    2.2、查询关键字之where筛选

    查询id 大于等于3小于等于6的数据

    # 方法一:
    select * from emp where id >= 3 and id <= 6;
    
    #方法二::
    select *  from emp where id between 3 and 6;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查询薪资是20000或者18000 或者17000的数据

    #方法一:
    select * from emp where salary = 20000 or salary = 18000 or salary = 17000;
    
    #方法二:
    select * from emp where salary in (20000,18000,17000); #支持成员运算
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查询员工姓名中包含o 字母的员工姓名和薪资
    刚开始编写mysql 查询不熟练的时候 可以暗中 查询的优先顺序 编写mysql语句

    %匹配任意个数的 任意该字符

    #模糊查询
    select name,salary from emp where name like'%o%'
    
    • 1
    • 2

    查询员工姓名是右四个字符组成的员工姓名和薪资

    匹配下划线个数的任意字符

    #方法一 模糊查询:
    select name,salary from emp where name like'____'  #四个下划线
    
    #方法二:
    select name,salary from emp where char_length(name) = 4;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查询 id 小于 3 或者大于6 的数据

    # 查询 id 小于 3 或者大于6 的数据
    select * from emp where id not between 3 and 6; # 不在3与6 之间的数据
    
    • 1
    • 2

    查询薪资不在 20000,18000,17000 范围的数据

    select * from emp where salary not in (20000,18000,17000);
    
    • 1

    **查询岗位描述为空的员工姓名与岗位名 **
    针对 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3、查询关键字之group分组

    分组:按照一些指定的条件将单个单个数据分为一个个整体
    分组周我们研究的对象应该是以组为单位 不应该再直接获取单个数据项 如果获取了应该直接报错
    select 后面可以直接填写的字段名 只能是分组的依据(其他字段需要借助于一些方法才可以获取)

    select posy from emp froup by post; # 获取的是单条数据项 每条 都是 该组的 第一个 是不对的 应该直接报错
    # 所以需要加限制
    set global sql_mode='strict_trans_tables,only_full_group_by';
    # 重启客户端
    
    • 1
    • 2
    • 3
    • 4

    以岗位分为一组

    select post from emp group by post;
    
    • 1

    一般 需求中 出现 每个、平均、最大、最小、等词汇 一般 就是 需要你用到分组

    配合分组使用的常见聚合函数

    聚合函数作用
    max最大值
    min最小值
    sum总和
    count计数
    avg平均
    • 以组为单位 统计组内数据>>> 聚合查询(聚集到一起得到一个结果)

    获取每个部门的最高薪资

    # 以 部门 为单位 分组 获取各组中(各部门) 中的最高薪资
    select post,max(salary) from emp group by post; 
    
    • 1
    • 2

    补充:在显示的时候 我们还可以给字段取别名

    select post as '部门',max(salary) as '最高工资' from emp group by post;
    
    • 1

    as 可以省略 但是不建议省 这样 命令开起来会很乱

    每个部门的最低工资

    select post,min(salary) from emp group by post;
    
    • 1

    每个部门的平均工资

    select post,avg(salary) from emp group by post;
    
    • 1

    每个部门的工资总和

    select post,sum(salary) from emp group by post;
    
    • 1

    每个部门的人数

    select post,count(id) from emp group by post;
    
    • 1
    2.3.1、group_concat

    group_concat(分组之后用) 不仅可以用来显示出分组完字段 还有拼接字符串的作用

    select post,group_concat(name) from emp group by post;
    
    # 可以在名字间添加 字符
    select post,group_concat(name,'_SB') from emp group by post;
    
    select post,group_concat(name,':',salary) from emp group by post;
    
    select post,group_concat(salary) from emp group by post;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.4、查询关键字之having过滤

    wherehaving 的功能其实是一样的 都是用来筛选数据
    只不过 where 用于分组之前的筛选 而having 用于分组之后的筛选
    为了人为的区分 所以叫where 是筛选 having 是过滤

    统计各部门年龄在30岁以上的员工 平均工资,并且保留平均工资大于10000的部门

    select post,age(salary) from emp
    where age >= 30 #分组前 
    group by post # group by 以部门 分组
    having avg(salary) > 10000 分组后
    
    • 1
    • 2
    • 3
    • 4

    2.5、查询关键字之distinct去重

    去重的前提是数据必须一模一样

    select distinct age from emp;
    
    • 1

    2.6、查询关键字之order by排序

    select * from emp order by salary asc; #默认升序排
    select * from emp order by salary desc; #降序排
    
    #先按照 age降序排,在年轻相同的情况下再按照薪资升序排
    select * from emp order by age desc,salary asc;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    先按照age降序排,在年纪相同的情况下 再按照薪资升序排

    select * from emp order by age desc,salary asc;
    
    • 1

    统计 各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序

    select post,avg(salary) from emp
    where age > 10 #筛选 年龄大于10
    group by post  # 以部门 分组
    having avg(salary) > 1000  # 筛选 薪资大于1000的 
    order by avg(salary);  # 最后 获取 薪资平均值
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.7、查询关键字之limit 分页

    限制 展示条数

    # 限制 展示条数
    select * from emp limit 3;
    # 查询工资 最高的人的详细 信息
    select * from emp order by salary desc limit 1;
    
    • 1
    • 2
    • 3
    • 4

    分页展示

    select * from emp limit 0 ,5 # 第一个参数表示 起始位置,第二个参数表示的是条数,不是索引位置
    
    select * from emp limit 5,5;
    
    • 1
    • 2
    • 3

    2.8、查询关键字之regexp正则

    select * from emp where name regexp '^j.*(n|y)$';
    
    • 1

    3、多表查询思路

    3.1、子查询

    将一张表的查询结果括号括起来当作另外一条SQL’语句的条件
    类似以日常生活中解决问题的方式
    第一步干什么
    第二步基于第一步的结果在做操作…

    查询jason的部门名称

    #先获取jason的部门编号
    select dep_id from emp1 where name = 'jason'; #200
    #根据部门编号获取部门名称
    select name from dep1 where id = 200;
    
    #子查询 
    select name from dep1 where id = (select dep_id from emp1 where name = 'jaosn');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.2、连表操作

    先将所有涉及到结果的表全部拼接到一起形成一张达标 然后从大表中查询数据

    select * from emp1,dep1;  #笛卡尔积
    
    • 1
    • 我们 不会使用笛卡尔积来求数据 效率太低 连表 有专门的语法

    建表

    create table dep1(
        id int primary key auto_increment,
        name varchar(20) 
    );
    
    create table emp1(
        id int primary key auto_increment,
        name varchar(20),
        gender enum('male','female') not null default 'male',
        age int,
        dep_id int
    );
    
    #插入数据
    insert into dep1 values
    (200,'技术'),
    (201,'人力资源'),
    (202,'销售'),
    (203,'运营'),
    (205,'安保')
    ;
    
    insert into emp1(name,gender,age,dep_id) values
    ('jason','male',18,200),
    ('dragon','female',48,201),
    ('kevin','male',18,201),
    ('nick','male',28,202),
    ('owen','male',18,203),
    ('jerry','female',18,204);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    关键字功能
    inner join内连接
    left join左连接
    right join右连接
    union全连接
    #内连接
    select * from dep1 inner join emp1 on emp1.dep_id = dep1.id
    #左连接
    select * from dep1 left join emp1 on emp1.dep_id = dep1.id
    #右连接
    select * from dep1 right join emp1 on emp1.dep_id = dep1.id
    #全连接
    select * from dep1 left join emp1 on emp1.dep_id = dep1.id union
    select * from dep1 right join emp1 on emp1.dep_id = dep1.id;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    作业

    查询岗位名以及岗位包含的所有员工名字
    在这里插入图片描述
    查询岗位名以及各岗位内包含的员工个数
    在这里插入图片描述
    查询公司内男员工和女员工的个数
    在这里插入图片描述
    查询岗位名以及各岗位的平均薪资
    在这里插入图片描述
    查询岗位名以及各岗位的最高薪资
    在这里插入图片描述
    查询岗位名以及各岗位的最低薪资
    在这里插入图片描述查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
    在这里插入图片描述
    统计各部门年龄在30岁以上的员工平均工资

    在这里插入图片描述

    统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序

    在这里插入图片描述

  • 相关阅读:
    【C++】基础语法(中)
    建站系列(三)--- 网络协议
    G1 垃圾收集器深入剖析(图文超详解)
    SpringBoot - 在IDEA中如何引入本地JAR包?
    关于Nacos启动报错 Unable to start embedded Tomcat
    QT基础教程(Hello QT)
    leetcode64 最小路径和
    超标量处理器设计 姚永斌 第8章 指令发射 摘录
    如何用 JMeter 编写性能测试脚本?
    Lambda表达式在C++中的定义
  • 原文地址:https://blog.csdn.net/weixin_71967396/article/details/126394339