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 ...
随机推荐
- 关于JavaScript线程的讲解
讲述js执行的相关线程.DOM操作等问题.参考博客:http://www.codeceo.com/article/javascript-threaded.html
- Exception的情况——java基础1
除数为0等ArithmeticException,是RuntimException的子类.而运行时异常将由运行时系统自动抛出,不需要使用throw语句.Java编译器允许忽略运行时异常,一个方法可以既 ...
- Windows标准控件
学习目的 学习创建, 使用Windows标准控件(按钮, 滚动条, 静态控件, 列表框, 编辑框, 组合框); 学习使用子窗口控件操作函数(EnableWindow, MoveWindow, SetW ...
- SQL索引的优缺点
--索引的优点 /* (1)创建唯一索引,保证数据库表中每一行数据的唯一性 (2)大大加速数据的检索速度,这也是创建索引的最主要的原因 (3)加速表和表至今的连接,特别是在实现数据的参考完整性特别有意 ...
- AngularJS之过滤器
AnularJS的过滤器用来格式化需要展示给用户的数据,有很多实用的内置过滤器,也可以自己编写. 在HTML中的模板绑定符号{{ }}内通过|符号来调用过滤器.例如,假设我们希望将字符串转换成大写,可 ...
- 润乾在jetty应用服务器下的JNDI配置一
一. 此处绑定的数据源是以 DBCP 为实现.首先必须将数据库驱动(这里用了MYSQL数据库)和DBCP所需要的 Jar 包复制到 Jetty 根目录的 lib 目录下.DBCP主要需要以下3个 ...
- 整理JavaScript循环数组和对象的方法
众所周知,常用的循环语句有for.while.do-while.for-in,forEach以及jQuery中提供的循环的方法:以及ES6中提供的很多用来循环对象的方法如map, 在 Javascri ...
- gitlab上如何添加二进制文件(设计文档)
想将设计文档(原型设计图,UML设计图等)放到gitlab上,以供团队其他成员查看.将这些二进制文件跟源码一样纳入git管控显然是不合适的.经过一番摸索,找到了如何管理项目文档的方法. 根据Stack ...
- SQL Server数据库快照的工作方式
SQL Server数据库快照的工作方式 翻译自:How Database Snapshots Work 最近有一个帖子<errorlog中的异常信息rolled forward 和rolled ...
- Ajax 请求下载 Execl 文件
通过Ajax请求下载Execl 的问题,掉进一个坑里半个多小时,特此来记录一下 . 起初 我误以为是后台的问题,然而调试了一下并不是这样的,也不会报错,且进入了success 函数. 以下的事件及请 ...