MySQL-核心查询(二)

第一节单表查询

1.1排序

1)单列排序

语法结构:

SELECET 字段名 FROM 表名 [WHERE 字段 = 值] ORDER BY 字段名 [ASC/DESC]

  • ASC表示升序排列(默认)
  • DESC表示降序排序
  • 不影响真实数据

 

代码示例:

select * from emp e where salary>6000 ORDER BY e.salary DESC;

select * from emp order by salary;

 

2)多列排序

  • 同时对多个字段进行排序,如果第一个字段相同,就按照第二个字段进行排序,依次类推
select * from emp order by salary desc, eid asc;
-- 排序完之后按照,另外一个条件进行排序

 

1.2聚合函数

  • 函数:方法,它封装了一些逻辑,比如给他一堆数据,特定函数可以返回最大值max(),avg()平均值
  • 聚合,也称为聚合统计或聚合查询,就需要使用select关键字,有select就得有from xxx

语法结构:

select 聚合函数(字段名) from 表名;

 

5个聚合函数:

聚合函数

作用

count(字段)

统计指定列不为NULL的记录行为

sum(字段)

计算指定列的数值和

max(字段)

计算指定列的最大值

min(字段)

计算指定列的最小值

avg(字段)

计算指定列的平均值

 

代码示例:

-- 1 查询员工的总数
select COUNT(DISTINCT eid) from emp;
select count(*) from emp;
select count(1) from emp; -- count函数会忽略掉空值

-- 2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
select sum(salary) as '总薪水', max(salary) '最大薪水', min(salary) '最小薪水', avg(salary) '平均薪水' from emp;

-- 3 查询薪水大于4000员工的个数
select count(*) from emp where salary>4000;

-- 4 查询部门为'教学部'的所有员工的个数
select count(*) from emp where dept_name='教学部';

-- 5 查询部门为'市场部'所有员工的平均薪水
select avg(salary) as '市场部平均薪资' from emp where dept_name='市场部';

 

1.3分组

group by 函数

  • 分组往往和聚合函数一起使用,对数据进行分组,分完组之后在各个组内进行聚合统计分析
  • 比如:求各个部门的员工数
  • 分组查询指的是使用GROUP BY 语句,对查询的信息进行分组,相同数据作为一组

语法格式:

SELECT 分组字段/聚合函数 FROM 表名 GROUP BY 分组字段 [HAVING 条件];

  • HAVING 是对聚合之后的结果进行进一步的过滤

 

代码示例:

需求1:

SELECT sex,avg(salary) from emp GROUP BY sex;
  • -- 注意:

1)GROUP BY 的字段必须出现在前面SELECT的位置;

2)前面SELECT的位置,除了GROUP BY 的字段、聚合函数,不能出现其他字段;但在MySQL中其实是可以的

  • 原句&原理:

需求2:

-- 0.查询所有部门的信息
select dept_name as '部门名称' from emp group by dept_name;

-- 1.查询每个部门的平均薪资
select dept_name,avg(salary) from emp GROUP BY dept_name;

-- 2.查询每个部门的平均薪资, 部门名称不能为null
select dept_name,avg(salary) from emp GROUP BY dept_name HAVING dept_name is not null;
-- where是GROUP BY之前过滤的
select dept_name, avg(salary) from emp where dept_name is not null GROUP BY dept_name;

需求3:

-- 查询平均薪资大于6000的部门
select dept_name, avg(salary) from emp WHERE dept_name is not NULL GROUP BY dept_name HAVING avg(salary)>6000;

where和having的区别

过滤方式

特点

where

where进行分组前的过滤

where后面不能写 聚合函数

having

having 是分组后的过滤

having后面可以写 聚合函数

 

1.4 limit 关键字--分页

  • limit是限制的意思,用于限制返回的查询结果的行数(可以通过limit指定查询多少行数据)和python当中的head(10)有些类似
  • limit语法是MySQL的方言,用来完成分页

语法结构:

select 字段1,字段2··· from 表名 limit offet, length;

 

参数说明:

  • limit offet, length;关键字可以接受一个 或者两个为0 或者正整数的参数
  • offset 起始行数,从0开始记数,如果省略 则默认为0, 也就是要查询的数据从第一条开始;
  • length 返回的行数,也就是终止显示的行数

 

代码示例:

select * from emp limit 0,3;

/*

通常用于分页
每一页显示多少条记录往往是固定,PageSize=3(每页显示3条记录)
当前页pageNum=2

根据以上参数从MySQL中获取到第二页应该显示的那3条记录
第一页 limit 0,3
第二页 limit 3,3
第三页 limit 6,3
第n页  limit ?,3
起始行的偏移量该怎么计算?
(当前页-1)*每页条数
(n-1)*3

在程序中计算出来,然后传入到MySQL语句中,
最终拼接出类似于这样的语句:
select * from emp limit x,y;
和外部工程师结合得是比较多的
*/

 

第二节 约束

  • 约束是针对字段的

常见的约束

约束名

约束关键字

主键

primary key

唯一

unique

非空

not null

外键

foreign key

 

2.1 主键约束

特点

不可重复 唯一 非空

作用

用来表示数据库中的每一条记录(唯一标识锁数据表中的一条记录)

 

1)添加主键约束

语法结构:

字段名 字段类型 primary key

 

代码示例:

①建表添加主键方式一,直接在创建字段的时候定义

create table emp2(
    eid int primary key,
    ename varchar(20),
    sex char(1)
);

② 建表添加主键方式二,也可以在设置好字段之后加上主键

create table emp3(
    eid int,
    ename VARCHAR(20),
    sex char(1),
    primary key(eid)
);

③ 给已经存在的数据表添加主键约束

alter table emp add primary key(eid);

那些数据可以作为主键?

  • 通常根据业务去设计主键,在实际生产过程中每张表都会设计一个主键
  • 是给数据库和程序使用的,跟最终的客户无关,所以主键没有意义没有关系,只要能够保证不重复就好,比如身份证号码etc
  • 另外,如果没有和业务关联太大的可以设计为主键的列的话,我们在进行数据库设计的时候往往人为加一列作为主键列,习惯上起名为id,rid等:12345

 

2)删除主键

alter table emp drop primary key;
desc emp;

 

3)主键的自增

  • 主键如果让我们自己添加有可能重复,我们通常希望在每次插入新记录的时候,数据库自动生成关键字段的值
  • 关键字:

AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)

 

代码示例:

-- 创建主键自增的表
create table epm2(
    -- 关键字 AUTO_INCREMENT,主键类型必须是整数类型
    eid int primary key auto_increment,
    ename VARCHAR(20),
    sex char
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值