mysql进阶

1、as 与 distinct

as关键字

使用as给字段起别名

select id as 序号, name as 名字, gender as 性别 from student;

通过as给表起别名

select s.name, s.id, s.gender from student as s ;

消除重复 distinct

distinct 可以消除重复的行

select distinct 列1,... from 表名
select gender from student;  # 这样取到的结果是所有学员的性别列
select distinct gender from student;  # 取到的是性别这列的种类
2、where条件

  where 的作用是通过子句对表中的数据筛选,结果为True的行会出现在结果集中。where后面支持多种运算符,进行条件的处理:

  • 比较运算符
  • 逻辑运算符
  • 模糊查询
  • 范围查询
  • 空判断

2.1、比较运算(>, <, =, >=, <=, !=)

select * from student where age >= 20;
select * from student where name != "xiaoming";
select * from student wheere hight < 170.00;

2.2、逻辑运算符(and, or, not)

# 查询编号大于5的女同学
select * from student where id>5 and gender=0 ;
# 查询年龄小于20的同学,或者身高高于180.00
select * from student where age<20 or hight<180.00;
# 查询电话号码不为空的同学
select * from student where phone is not null;

2.3、模糊查询(like, %~, _~)

# 查询姓刘的学生
select * from student where name like '刘%';
# 查询姓刘名字为一个字的学生
select * from student where name like '刘_';
# 查询名为小明的学生
select * from student where name like '_小明';

2.4、范围查询(in, btween…and…)

# 查询编号为1或3或8的学生
select * from student where ID in (1,3,8);
# 查询编号在2到6的男生
select * from student where (ID between 2 and 6) and gender="男";

2.5、空判断

# 查询没有填写身高的同学
select * from student where hight is null;

2.6、优先级

  • 优先级从高到低是 小括号,not 比较运算符,逻辑运算符;
  • and 比 or 的优先级高,如果一起出现想要先算or 需要用括号括起来。
3、排序

3.1、排序的语法

select * from 表名 order by 列1 asp|desc[, 列2 asc|desc] 
把数据按列1进行排序,如果某些行的列1值相同时,则按照列2的值排序。
asc从小到大排列,即升序;
desc从大到小排列,即降序;
默认按照列值从小到大排序(即asc关键字)

# 查询未删除男生的信息,并按学号降序
select * from student where gender='男' and is_delete=0 order by id desc;
# 查询未删除学生的信息,按序号升序
select * from student where is_delete=0 order by id (asp);
# 显示所有学生信息,先按年龄从大到小排序,如果年龄相同按照身高从大到下排序
select * from student order by age desc, hight desc;
排序时要用order by 关键字,asc是升序,desc是降序
4、分页
select * from 表名 limit start=0,count
说明:从start开始,到count条数据,start默认值为0,也就是当需要前n条数据时可以直接写上xxx.limit n;
查看前3行男生的信息
select * from student where gender=1 limit 0, 3;
获取第n页数据的SQL语句
select * from student limit (n-1)*m, m;
5、聚合函数

5.1、总数

count(*)计算总行数,括号中写星或者列名,结果是相同

# 查询学生总数
select count(*) from students;

5.2、最小值min()

# 查询未删除学生的最小编号
select min(id) from student where is_delete=0;

5.3、最大值max()

# 查询女生编号的最大值
select max(id) from student where gender=1;

5.4、求和sum()

# 查询本班所有男生的总身高
select sum(hight) from student where gender=0;
# 查询本班所有男生的平均身高
select sum(hight)/count(*) from student where gender=0;

5.5、平均值avg()

# 查询未删除女生的平均年龄
select avg(age) from student where is_delect=0 and gender=1;

5.6、保留小数

round()不是聚合函数,作用是设置小数位

格式:round(值,小数位)
# 查询全班年龄的平均值,保留两位小数
select round(avg(age),2) from students;
6、分组

6.1 group by 分组

group by的使用特点:

  • 含义:将查询的结果按照一个或者多个字段进行分组,字段值相同的为一组。
  • 可用于单个字段分组,也可用于多个字段分组
# 查看全班性别的分组
select gender from student group by gender;  # --->分为4组,(男,女,中性,保密)

注意: MYSQL中默认情况下,select后面的字段只能出现在以下两种情况:

  • group by 后出现
  • 聚合函数中出现

6.2、group by + group_concat()

group_concat(字段名)根据分组结果,使用group_concat来放置每一个分组中某个字段

# 按性别对全班同学分组,并且列出各组中学生的姓名
select gender ,group_concat(name) from student group by gender;
# 按照班级分组,并列出每个班的学生编号
select cls_id ,group_concat(id) from student group by cls_id;

6.3、group by + 聚合函数

与group by一起使用时,聚合函数统计的对象是分组

# 按性别对全班同学分组,并且统计每组的平均年龄
select gender ,avg(age) from student group by gender;
# 按照班级分组,并列出每个班有多少人
select cls_id ,count(*) from student group by cls_id;

6.4、group by + having

  • having 条件表达式:用来过滤分组结果
  • having作用类似where,但是having只能用于group by 后面,而where是用来过滤表数据的
# 列出性别分组中,人数超过2人的分组,并且显示组内人数
select gender, count(*) from student group by gender having count(*)>2

6.5、group by + with rollup

with rollup作用:在最后添加一行来记录当前表中对该字段的操作结果,一般是统计总数。

# 列出性别分组,并且显示组内人数,统计汇总结果
select gender, count(*) from student group by gender with rollup;
# 列出班级分组,显示班级内学员ID,统计汇总结果
select cls_id,con_cat(id) from student group by cls_id with rollup;
7、连接

MySQL支持3种类型的连接查询:

  • 内连接查询:inner 求交集
  • 左连接查询:left 左边集合和左右两边的交集
  • 右连接查询:right 右边集合和左右两边的交集
连接查询的语法
select * from 表1 inner/right/left join 表2 on 表1.列1 运算符 表2.列2

# 使用内连接查询班级表与学生表
select * from students as s inner join classes as c on s.cls_id=c.id;
# 使用左连接查询班级表与学生表
select * from students as s left join classrs as c on s.cls_id=c.id;
# 使用右连接查询班级表与学生表
select * from students as s right join classes a sc on s.cls_id=c.id;

  笛卡尔运算,将左表和右表中每一行都分别进行拼接组合 — 交叉连接cross join
把学生表添加到班级表中。

  内连接在笛卡尔连接的基础之上,使用on 进行指定过滤笛卡尔积的数据条件。
注意: 在MySQL中join 和 inner join是等价的其他数据库中不一样。

8、自查询

  两个表中其他内容都基本相似时,只有很少几列的值不相同时,我们采用自连接。这样做的好处是存储的是结构基本相似的数据,没有必要多做一个表分别来存储,一般情况是做两个表,然后同过内连接找到想要的内容。而现在用自查询,把所有信息都放进一个表中,通过给这个表气不同的名字,把他当做内容相同的另一个表进行连接。

9、子查询

9.1、子查询的概念

  在一个select语句中,嵌入另一个select语句,那么被嵌入的select语句被称为子查询语句,外部的那个select 被称为主查询语句。

子查询和主查询的关系:

  • 子查询是嵌入到主查询之中的
  • 子查询是辅助主查询的,要么充当条件,要么充当数据源
  • 子查询是可以独立存在的语句,是一条完整的select语句。

9.2、子查询的分类

  • 标量子查询:返回的结果是一个数据(一行一列)
  • 列子查询:返回的结果是一列(一列多行)
  • 行子查询:返回的结果是一行(一行多列)

9.3、标量子查询

# 查询大于班级平均年龄的学生
select * from students where age>(select avg(age) from students);

9.4、列子查询

# 查询还有学生在班里的所有的班级的名称
select name from classes where id in (select cls_id from students);

9.5、行子查询

# 查找班级年龄最大,身高最高的学生
select 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值