mysql中的查询和筛选查询

内容概要

  一、单表下的简单查询(筛选查询)

  二、多表下的联表查询

  三、子查询

 

1、单表下的简单查询

  -表的准备

create table department(
id int,
name varchar(20) 
);

create table employee(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);

  -记录的准备

insert into department values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

insert into employee(name,sex,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204)
;

 

  查询语句必要的语法部分

  select * from table_name

 

  concat() 方法

    将select查询得到的结果进行字符串拼接 

    -练习:将id值大于8的员工的名字加上_sb符号

select concat(name,"_sb") from employee where id > 8;

 

  group_concat() 方法

    将经过group_by分组的字段的聚合记录进行拼接

    -练习:展示分组后每组的员工的名字,用一个记录存储

select dep_id,group_concat(name,"__") from employee group by dep_id;

 

  筛选条件(优先级从上到下)

  where

    select name from t1 where id > 10;  # 查询id大于10的name字段对应的值

  group by

    select post avg(salary) from t1 group by post;  # 根据port的值,将多条记录进行聚合(一般以谁为条件就搜索谁)

    -group by 专门的分组函数

      sum() 显示聚合后指定字段的各记录的总和

      max() 显示聚合后指定字段的各记录的最大值

      min() 显示聚合后指定字段的各记录的最小值

      count() 显示聚合后指定字段的各记录的条数

      avg() 显示聚合后指定字段的各记录的平均值

 

  having

    select group_concat(name,":") from t1 group by port having avg(salary > 10000);

    按照部分字段记录进行分组后,筛选平均薪资大于10000元的名字

 

  order by

    select name from t2 order by salary asc(升序);

    select name from t2 order by salary desc(降序);

    将字段按照salary的记录值 升序 / 降序 排序

    select name from t2 order by salary asc , age desc;

 

  limit

    select name from t3 order by salary limit 1;

    限制记录的条数

    获取最高薪资的员工姓名

 

2、多表下的的连表查询

  - 左表 inner join 右表 on 条件

  select * from employee inner join department on employee.dep_id = department.id;

  使用inner join的联表查询,虚拟表中的记录必须是满足on后条件的,两张表中不满足的记录不会保留

在联表中

 

 

  - 左表 left join 右表 on 条件

  select * from employee left join department on employee.dep_id = department.id;

  使用left join的联表查询,虚拟表中的记录一定包含所有左表(employee)的记录,不满足条件的记录中右表的字段值为Null

 

  - 左表 right join 右表 on 条件

  select * from employee right join department on employee.dep_id = department.id;

  使用right join的联表查询,虚拟包中的记录一定包含所有右表(department)的记录,不满足条件的左表的字段值为Null

posted @ 2021-03-06 23:39  口乞厂几  阅读(330)  评论(0)    收藏  举报