Day3 MySql高级查询
DQL高级查询
多表查询(关联查询、连接查询)
1.笛卡尔积
emp表15条记录,dept表4条记录。
连接查询的笛卡尔积为60条记录。
2.内连接
不区分主从表,与连接顺序无关。两张表均满足条件则出现结果集中。
--where子句
select * from emp,dept
where emp.deptno = dept.deptno
--inner join…on…
select * from emp
inner join dept
on emp.deptno = dept.deptno
--inner join…using…
select * from emp
INNER JOIN dept
using(deptno)
3.自然连接
寻找两表中字段名称相等的字段进行连接,会自动去重重复列。
--自然连接(等值连接,表的字段名称必须相同,去除重复行)
select * from emp NATURAL JOIN dept;
4.外连接
有主从表之分,与连接顺序有关。以驱动表为依据,匹配表依次进行查询;匹配表中找不到数据,则以null填充。
--左外连接 left [outer] join .... ON...
select * from emp
left join dept
on emp.deptno = dept.deptno;
5.自连接
同一个表里面的数据相关联
--查询所有的员工的姓名和上级领导的姓名 emp(内连接)
select e1.ename ename ,e2.ename mgrname from emp e1,emp e2
where e1.mgr=e2.empno select e1.ename ename ,e2.ename mgrname from emp e1
left join emp e2
on e1.mgr=e2.empno
子查询(嵌套查询)
1.单行子查询
子查询的结果返回一行
select dname from dept where deptno = (select deptno from emp where empno=7788);
2.多行子查询
查询的结果返回一个集合
--查询工资大于2000的员工的部门名称
select dname from dept where deptno =any(select deptno from emp where sal > 2000);
ANY ALL
=ANY 含义就是in >any 大于最小值 <any 小于最大值
>all 大于最大值 <all 小于最小值
案例
--查询大于所在部门的平均工资的员工信息。
--关联查询
1.分组每个部门平均工资
select * from emp e,(select deptno,avg(sal) avg from emp group by deptno) e1
where e.deptno = e1.deptno and e.sal > e1.avg
--子查询(主查询可以将数据传递给子查询)
select * from emp e where sal > (select avg(sal) from emp e1 where e1.deptno = e.deptno)
1.先执行主查询,将deptno传给子查询
2.子查询拿到deptno,计算查询的结果,返回给主查询
3.主查询拿到子查询返回的结果执行查询 --查询薪水大于2000 emp 的部门名称 dept select dname from dept where deptno in(
select deptno from emp where sal > 2000); select dname from dept d where EXISTS(
select * from emp e where sal > 2000 and d.deptno = e.deptno)
in和exists的区别
1.IN
主查询的条件字段和子查询返回字段必须一致。
先执行子查询,将返回子查询的结果给主查询,再执行主查询
2.EXISTS
主查询不需要出现条件字段
先执行主查询,将主查询的表的字段传给子查询,如果在子查询找到相应结果,
返回true,将该结果显示在结果集中。否则返回false
联合查询
1.UNION
并集,所有的内容都查询,重复的显示一次
select * from emp where deptno = 20
union
select * from emp where sal > 2000
2.UNION ALL
并集,所有的内容都显示,包括重复的
事物
存储引擎
Mysql的核心就是存储引擎,DBMS借助于引擎实现增删改查操作。
Mysql有多种存储引擎,不同引擎在事务的支持,查询的效率,索引策略等方面有不同。
InnoDB是事务型数据库的首选,执行安全性数据库,行锁定和外键。mysql5.5之后默认使用。
MyISAM插入速度和查询效率较高,但不支持事务。
MEMORY将表中的数据存储在内存中,速度较快。
什么是事物
保证数据的一致性,一系列DML操作,要么同时成功,要么同时失败。
事物的ACID特性
a) 原子性Atomicity: 一系列的DML操作不可分割。
b) 一致性Consistency:
数据一致性:事务执行前后整体的状态不变。
约束:事务执行前后约束信息不变。
c) 隔离性(独立性) Isolation:
并发事务是互相隔离的。
d) 持久性Durability:事务提交之后数据将持久化到数据库。
事物的实现 tcl commit rollback
a) mysql数据库默认是自动提交
set autocommit=0; 不自动提交
set autocomiit=1;自动提交
b) 手动开启事务
start transaction/begin;
c) 手动提交或者回滚
commit;
rollback;
savepoint;保存点,恢复必须在事务提交之前。事务一旦提交,所有的保存点全部失效。
-- 关闭自动提交
set autocommit=0;
-- 显式开始事务
start TRANSACTION;
-- DML
update account set money = money - 20 where name = 'ls';
-- 保存点
-- SAVEPOINT a;
delete from aa;
update account set money = money + 20 where name = 'zs';
-- 提交
-- commit;
-- 回滚
commit;
-- 不起效
-- ROLLBACK to a;
注意:DDL操作会隐式事物提交
存储程序
概念
存储程序指的一组存储和执行在数据库服务器端的程序。
分类
1.存储过程
2.存储函数
3.触发器
存储过程
1.基本语法
CREATE PROCEDURE sel_emp(参数列表)
BEGIN
--操作
END;
2.使用
无参的存储过程:
CREATE PROCEDURE sel_emp()
BEGIN
select * from emp where deptno = 10;
END;
--存储过程的调用
call sel_emp(); 有参的存储过程:
--根据部门编号查询员工信息
CREATE PROCEDURE sel_emp2(dno int)
BEGIN
select * from emp where deptno=dno;
END;
--调用存储过程
call sel_emp2(30); --根据员工编号查询员工的名称
CREATE PROCEDURE sel_emp3(eno int,OUT name varchar(20))
BEGIN
select ename into name from emp where empno=eno;
end;
--调用
call sel_emp3(7788,@name);
select @name; --根据员工编号查询所在部门的编号
CREATE PROCEDURE sel_emp4(INOUT eno int)
BEGIN
select deptno into eno from emp where empno = eno;
END; --调用
set @eno = 7788;
call sel_emp4(@eno);
select @eno; --分支语句
CREATE PROCEDURE cal_score(score int)
BEGIN
-- 声明变量
DECLARE levels varchar(20);
-- 分支
IF score >= 90 THEN
-- 赋值
set levels = '优秀';
ELSEIF score >= 80 THEN
set levels = '良好';
ELSE
set levels = '不通过';
END IF;
-- 输出
select levels;
END; --while循环
create PROCEDURE calc()
BEGIN
-- 声明两个变量
DECLARE sum int;
DECLARE count int;
-- 初始化
set sum = 0;
set count = 1;
-- 循环
while count <=100 DO
set sum = sum + count;
set count = count + 1;
END WHILE; SELECT sum;
END; --LOOP
create PROCEDURE calc1()
BEGIN
-- 声明两个变量
DECLARE sum int;
DECLARE count int;
-- 初始化
set sum = 0;
set count = 1;
-- 循环
lip:LOOP
set sum = sum + count;
set count = count + 1;
IF count > 100 THEN
LEAVE lip;
END IF;
END LOOP;
SELECT sum;
END; call calc1(); create PROCEDURE calc3()
BEGIN
-- 声明两个变量
DECLARE sum int;
DECLARE count int;
-- 初始化
set sum = 0;
set count = 1;
-- 循环
REPEAT
set sum = sum + count;
set count = count + 1;
UNTIL count > 100
END REPEAT;
SELECT sum;
END;
3.参数模式
in:外部传进存储过程
out:传出
inout:传进传出
4.游标
--查询所有员工的姓名
create PROCEDURE emp_cursor4()
BEGIN
DECLARE name varchar(20);
DECLARE DONE boolean default 0;
-- 声明游标类型变量存储所有员工的名称
DECLARE emp_cursor CURSOR for select ename from emp;
-- 结束设置状态码为1
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET DONE = 1;
-- 打开游标
open emp_cursor;
-- 获取游标中维护的值
lip:LOOP
FETCH emp_cursor into name;
IF DONE THEN
leave lip;
END IF;
select name;
END LOOP;
-- 关闭游标
close emp_cursor;
END;
存储函数
--函数(确定的不变的 DETERMINISTIC Not )
create FUNCTION emp_func()
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE name varchar(20);
select ename into name from emp where empno = 7788;
RETURN name;
END; select emp_func(); 函数有返回值 return
存储过程可以单独使用;但是函数只能作为语句的一部分。
Day3 MySql高级查询的更多相关文章
- 第四章 MySQL高级查询(二)
第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists ...
- 第三章 MySQL高级查询(一)
第三章 MySQL高级查询(一) 一.SQL语言的四个分类 1. DML(Data Manipulation Language)(数据操作语言):用来插入,修改和删除表中的数据,如INSE ...
- MySQL 高级查询操作
目录 MySQL 高级查询操作 一.预告 二.简单查询 三.显示筛选 四.存储过程 五.查询语句 1.作为变量 2.函数调用 3.写入数据表 备注 附表一 附表二 相关文献 博客提示 MySQL 高级 ...
- python进阶09 MySQL高级查询
python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...
- MySQL高级查询与编程作业目录 (作业笔记)
MySQL高级查询与编程笔记 • [目录] 第1章 数据库设计原理与实战 >>> 第2章 数据定义和操作 >>> 2.1.4 使用 DDL 语句分别创建仓库表.供应 ...
- MySQL高级查询与编程笔记 • 【目录】
章节 内容 实践练习 MySQL高级查询与编程作业目录(作业笔记) 第1章 MySQL高级查询与编程笔记 • [第1章 数据库设计原理与实战] 第2章 MySQL高级查询与编程笔记 • [第2章 数据 ...
- 2.mysql高级查询
01.SQL高级查询_排序 1.排序语句:order by 排序字段名 asc(默认的-升序) / desc(降序); 2.例如:查询所有服装类商品,将查询结果以价格升序排序: ...
- MySQL高级查询 & 事务机制
1.基础查询where 高级条件查询Where子句 SELECT empno,ename,sal,hiredate FROM t_tmp WHERE deptno=10 AND (sal+IFNULL ...
- MySQL高级查询语句
高级查询: 一:多表连接 1.select Info.Code,Info.Name,Nation.Name from Info,Nation where Info.Nation = Nation.Co ...
随机推荐
- 【原】Spring整合Shiro基础搭建[3]
1.前言 上个Shiro Demo基础搭建是基于官方的快速入门版本,没有集成其他框架,只是简单的通过Main方法来执行Shiro工作流程,并测试一下比较核心的函数:但在企业开发中一般都会集成Sprin ...
- vue+SSM验证码实现
源码:https://github.com/HannahLihui/StudentManager-SSM/tree/master/SSM-git/StudentManager-SSM-master 1 ...
- SpringMVC配置式开发
所谓配置式开发是指“处理器类是程序员手工定义,实现了特定接口的类,然后再在SpringMVC 配置文件中对该类进行显示的.明确的注册”的开发方式. 一.处理器映射器HandlerMapping Han ...
- js 中的console.log有什么作用
主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...
- arcgis 加载高德地图 es6的方式
目前很多arcgis 加载高德地图是dojo的方式 外部引入文件,现在改成这种方式 /** * Created by Administrator on 2018/5/14 0014. */ impor ...
- VC++ 共享内存读写操作
此解决方案含两个工程文件,一个是写操作工程文件,即把任意字符串写入创建的共享内存里,另外一个读操作工程文件,则是读取共享内存里的数据,从而实现了进程之间的共享内存读写操作. 源码下载
- 报表导出excel方式介绍
报表导出excel提供了四种方式,在单元格属性"其他/导出excel方式"可以选择,如下图 一是导出缺省值:报表中的单元格包含两个值,一个真实值一个显示值,但是在excel中 ...
- java 内存分析之this
package Demo; /** * this 的值是当前对象的引用 * @author Aaron * */ public class Boy { private int age; public ...
- 为website安装免费的letsencrypt证书
Certbot官网:https://certbot.eff.org 1. 安装certbot命令 wget https://dl.eff.org/certbot-auto chmod a+x cert ...
- 团队开发心得(May)
经过之前一个多月的准备工作(包括去求调研.技术选型.知识储备等等),这个月开发工作终于步入正轨,下面谈谈我的心得体会. 个人收获方面,我选择了加入数据库小组,进行数据库方面的开发.刚开始的时候我是个小 ...