mysql数据库(排序,聚合函数,分组,分页查询,union,连接查询,主键外键)
1、排序(order by)
select *
from stu
order by age; -- 默认升序
升序 ASC 降序DESC
-- DESC 具有查看表的结构的功能
desc stu; 不同于oracle,可以在查询窗口使用,oracle只能在命令窗口使用
例题:
按年龄升序
SELECT *
FROM stu
ORDER BY age ASC;
按年龄降序
SELECT *
FROM stu
ORDER BY age DESC;
按奖金降序,奖金相同按id升序
SELECT *
FROM stu
ORDER BY tuition DESC,sid ASC;
按第六列降序排序(相对位置排序)
select *
from emp
order by 6 desc;
2、常用的聚合函数
函数:做某些事情的方法
聚合:把多个值变成一个值
count(): 计数,不计算null值,统计指定列不为NULL的记录行数;
max(): 求最大值,若为字符串类型,按字符串排序运算
min(); 求最小值,若为字符串类型,按字符串排序运算
sum(): 求和,不是数值类型则为0
avg(): 求平均,不是数值类型则为0
例题:
-- 当需要纵向统计时可以使用COUNT(),查询emp表中记录数:
SELECT COUNT(*) '记录数'
FROM emp;
-- 查询emp表中有佣金的人数:
SELECT COUNT(*) '有佣金的人数'
FROM emp
WHERE comm IS NOT NULL;
SELECT COUNT(comm) '有佣金的人数' -- 处理非空数据
FROM emp;
-- 查询emp表中月薪大于2500的人数:
SELECT count(*)
FROM emp
WHERE sal>2500;
-- 统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*)
FROM emp
WHERE sal+IFNULL(comm,0) > 2500;
-- 查询有佣金的人数以及有领导的人数:
SELECT COUNT(comm) '有佣金的人数', COUNT(mgr) '有领导的人数'
FROM emp
-- 需要纵向求和时使用sum()函数。
-- 查询所有雇员月薪和:
SELECT SUM(sal)
FROM emp;
-- 查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal),SUM(comm)
FROM emp;
-- 查询所有雇员月薪+佣金和:
SELECT SUM(sal+IFNULL(comm,0))
FROM emp;
SELECT SUM(sal) + SUM(COMM)
FROM emp;
-- 统计所有员工平均工资:
SELECT AVG(sal) '平均工资' -- 有工资的平均工资,假如没工资就不算进去
FROM emp;
SELECT SUM(sal)/COUNT(*) -- 具体业务具体分析
FROM emp;
-- 查询最高工资和最低工资:
SELECT MAX(sal) '最高工资', MIN(sal) '最低工资'
FROM emp;
SELECT COUNT(0)
FROM dual; -- 1
select sum(sname) from stu; -- 0,字符串求和为0
3、分组
-- 分组查询group by
-- select 后面只能写聚合函数和分组的参照列
例题:
查询每个部门的部门编号和每个部门的工资和:
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
查询每个部门的部门编号以及每个部门的人数:
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
查询每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;
having
having:跟where一样都是进行过滤,区别在于where在分组前处理分组前的条件
having在分组后处理分组后的条件
where 后面不能使用聚合函数 而having可以
例题:
查询工资总和大于9000的部门编号以及工资和:
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
4、分页查询
-- LIMIT num1(从哪里开始),num2(展示多少数据)
SELECT *
FROM emp
LIMIT 5,5; -- 1006-1010
-- LIMIT NUM: 默认从0开始查看num条记录
SELECT *
FROM emp
LIMIT 5
-------------------------------------------------------------------------------------------------------------
5、union
CREATE TABLE t1(
a INT,
b VARCHAR(10)
);
CREATE TABLE t2(
c INT,
d VARCHAR(10)
);
INSERT INTO t1 VALUES
(1,'a'),(2,'b'),(3,'c'),(4,'d');
INSERT INTO t2 VALUES
(4,'d'),(5,'e'),(6,'g');
-- UNION合并结果集
-- 第二句的结果去掉列名拼在第一条语句的下面
-- 默认去除重复的记录,不排序
-- 要求两条语句列数相同并且对应的数据类型一致
例题:
SELECT *
FROM t1
UNION
SELECT *
FROM t2;
-- UNION ALL 合并结果集不去重
SELECT * FROM t1
UNION ALL
SELECT * FROM t2;
6、连接查询(多表查询)
-- 连接查询
SELECT *
FROM t1,t2; -- 产生大量笛卡尔积
-- 等值连接
-- 一般是通过主外键相等的关系消除笛卡尔积
-- 主键:一条记录的唯一身份标识(1.不能为空 2.不能重复)
-- 外键:跟另外一张表建立联系列(一定是另外一张表的主键)
SELECT *
FROM emp,dept
WHERE emp.deptno=dept.deptno;
-- 内连接
SELECT *
FROM emp INNER JOIN dept
ON emp.deptno = dept.deptno;
-- INNER 可以省略
-- 等值连接和内连接不满足等值条件的不会显示出来(被过滤掉了)
-- 外连接
-- 主表不满足条件的会显示出来,从表用null值匹配,从表不满足条件的不会显示出来
-- 左外连接 LEFT JOIN ... ON
SELECT *
FROM emp LEFT OUT JOIN dept
ON emp.deptno = dept.deptno;
-- 关键字outer可以省略
-- 右外连接
SELECT *
FROM emp RIGHT OUTER JOIN dept
ON emp.deptno = dept.deptno;
-- 自然连接
-- 不需要手动指定等值关系,系统会根据同名的列进行等值匹配,
-- 同名列合并,居左显示(同名列,主表内容,从表内容)
-- 自然连接内的内连接
SELECT * FROM emp NATURAL JOIN dept;
-- 自然连接内的左连接
SELECT * FROM emp NATURAL LEFT JOIN dept;
-- 自然连接内的右连接
SELECT * FROM emp NATURAL RIGHT JOIN dept;
-- n张表至少需要n-1个连接
-- 子查询
-- 子查询-单行单列
1. 工资高于甘宁的员工。
SELECT ename
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename = '甘宁');
-- 子查询-多行单列:
2.工资高于30部门所有人工资 -- ALL所有 ANY任意(比其中一个大)
SELECT ename,sal
FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)
-- 子查询-单行多列:
查询工作和工资与殷天正完全相同的员工信息分析:
SELECT *
FROM emp
WHERE (job,sal)=(SELECT job, sal FROM emp WHERE ename='殷天正')
AND ename!='殷天正';
-- 子查询-多行多列(1)
查询员工编号为1006的员工名称、员工工资、部门名称、部门地址
SELECT e.ename,e.sal,d.dname, d.loc
FROM (SELECT empno,ename,sal,deptno FROM emp) e JOIN dept d on e.deptno=d.deptno
WHERE e.empno = 1006
7、 完整性约束-主键
-- 主键:一条记录的唯一身份标识(1.不能为空 2.不能重复)
-- 创建表的时候指定主键
CREATE TABLE test2(
sid INT PRIMARY KEY,
sname VARCHAR(20)
);
-- 表已经创建则通过修改表去添加主键
ALTER TABLE test1 ADD PRIMARY KEY(sid);
-- 删除主键
-- 非空属性还是存在
ALTER TABLE test2 DROP PRIMARY KEY;
-- 主键自增 auto_increment 根据最后一个数字开始自增长
-- oracle无此特性, oracle引入序列的对象
CREATE TABLE test3(
sid INT PRIMARY KEY auto_increment,
sname VARCHAR(10)
);
SELECT * FROM test3;
-- 去除自增属性
-- CHANGE一定要改列的名字
ALTER TABLE test3 CHANGE sid sid INT; -- 后面这个sid可以改名 id
-- MODIFY 不用改名字
ALTER TABLE test3 MODIFY sid INT;
-- UNION 唯一约束
-- 非空约束 NOT NULL
CREATE TABLE test4(
sid INT,
sname VARCHAR(10) UNIQUE,
age VARCHAR(10) NOT NULL
);
-- 外键约束
-- 将t_section中的master_id列设置成关联t_user 表uid 的外键
创建t_section表,指定sid为主键列,u_id为相对t_user表的uid列的外键:
CREATE TABLE t_section(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(30),
u_id INT,
CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid)
);
修改t_section表,指定u_id为相对t_user表的uid列的外键:
ALTER TABLE t_section ADD CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid);
修改t_section表,删除u_id的外键约束:
ALTER TABLE t_section DROP FOREIGN KEY fk_t_user;
mysql数据库(排序,聚合函数,分组,分页查询,union,连接查询,主键外键)相关推荐
- MySQL数据库——day26 数据库安装,卸载,概念,msq的介绍,安装,连接,DDL,DML,DQL模糊查询,字段控制(别名和运算),排序,聚合函数,分组查询(where和having),分页查询
学到mysql的时候非常的快,感觉前面的没有很巩固,还是要复习前面的博客 常见的数据库 MySQL , Oracle , SQL Server , SQLite , DB2 , - SQL Serve ...
- MySQL数据库-笔记06【SQL的4种连接查询、事务】
学习地址:一天学会 MySQL 数据库 MySQL安装教程 MySQL专栏
- MySQL学习笔记(四)——分组函数,分组查询,连接查询
MySQL学习笔记(四)--分组函数,分组查询,连接查询 作者:就叫易易好了 日期:2020/11/18 一.分组函数 功能:用作统计使用,又称为聚合函数或统计函数 分类: sum函数 avg函数 m ...
- mysql 连接 分组_MySQL 基础 (四) 分组查询及连接查询
MySQL 基础 (四) 分组查询及连接查询 MySQL 基础(四) 进阶 5 分组查询 语法: SELECT 分组函数, 列(要求出现在 group by 的后面) FROM 表 [where 筛选 ...
- MySQL || 结果排序--聚集函数讲解
MySQL 结果排序-- 聚集函数 一.环境准备 二.查询结果排序 三.查询的分组与汇总 3.1.查一下 学生们平均年龄 3.2.查一下总人数是多少 3.3.查一下每个年龄有多少人 3.4.查出最大年 ...
- mysql 嵌套查询性能_MySQL数据库之嵌套查询与连接查询的性能详解
本文主要向大家介绍了MySQL数据库之嵌套查询与连接查询的性能详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 嵌套查询与连接查询的性能:连接查询一般较快:子查询很难被优化. ...
- MySQL 案例实战--MySQL数据库 存储过程 存储函数
MySQL数据库 存储过程 & 存储函数 前言 一.什么是存储过程 & 存储函数 二.存储过程的创建和调用 三.存储函数的创建和调用 前言 本环境是基于 Centos 7.8 系统构建 ...
- mysql数据库 常用函数_《MySQL数据库》常用函数整理
原标题:<MySQL数据库>常用函数整理 以下内容,是我整理出来的比较常用的字符串函数,数值函数,日期函数. 第一类:字符串函数 1.conv(n,from_base,to_base):对 ...
- mysql的查询、子查询及连接查询(商城查询常用)
mysql的查询.子查询及连接查询 一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数) 1.whe ...
最新文章
- python与excel做数据可视化-python操作Excel、读取CVS与数据可视化
- JAVA删除临时文件
- pom文件报错_maven-resources-plugin修改了我的文件
- python仿真智能驾驶_基于Python的3R机器人运动仿真
- git 命令详解_再次学习Git版本控制工具
- 温习了一下java线程状态方面的知识总结一
- WGCNA分析,简单全面的最新教程(可以在线做了)
- vrp 节约算法 c++_滴滴技术:浅谈滴滴派单算法
- 深入探讨运维驱动的可监控性设计
- C语言求1+2!+3!+...+20!
- 计算机网络英文缩写汇总,计算机网络名词英文缩写解释大全
- PS透明婚纱抠图(超详细)
- 体育用品商城小程序开发功能
- 【历史上的今天】9 月 2 日:互联网的“诞生日”;三星逐步跌落神坛;世界上第一个 ATM 自动取款机
- c语言共有几种运算符_C语言的运算符和表达式有哪些
- allow control allow origin_热分析/红外光谱联用的数据分析方法 第7部分 在Origin软件中三维红外光谱图的作图方法...
- Linux篇面试宝典
- Android手机修改hosts文件
- Linux-SSH反向连接(内网穿透,打洞)
- RoadFlow ASP.NET Core工作流引擎IIS部署