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 ...
随机推荐
- 算法 - 排序数组中与x最近一点
条件: a[j] + a[j+1] < x*2 int findClosestPoint(int x,int a []) { int res = 0; int j = 0; while(j< ...
- RabbitMQ--学习资源汇
1.RabbitMQ 实战教程 文集(alibaba) 2.RabbitMQ从入门到精通(9篇系列博文 )(anzhsoft2008 ) 3. RabbitMQ目录(nick's blog) 使用 ...
- python学习之老男孩python全栈第九期_day029知识点总结——configparser模快、logging模块
一. configparser模块 生成文档 import configparser config = configparser.ConfigParser() config[', 'Compressi ...
- 在windows上搭建redis集群(redis-cluster)
一 所需软件:Redis.Ruby语言运行环境.Redis的Ruby驱动redis-xxxx.gem.创建Redis集群的工具redis-trib.rb 二 安装配置redis redis下载地址 ...
- call aplly笔记
<script> /*1.每个函数都包含两个非继承而来的方法:apply()和call(). 2.他们的用途相同,都是在特定的作用域中调用函数. 3.接收参数方面不同,apply()接收两 ...
- CentOS7.4 + Hadoop2.9安装配置管理(分布式)
1. 规划 1.1. 机器列表 NameNode SecondaryNameNode DataNodes 192.168.1.121 192.168.1.122 192.168.1.101 192 ...
- 网络I/O模型--03非阻塞模式(ServerSocket与Socket的超时处理)--解除accept()、 read()方法阻塞
对于阻塞方式的一种改进是在应用程序层面上将 “一直等待 ”的状态主动打开: 这种模式下,应用程序的线程不再一直等待操作系统的 I/O状态,而是在等待一段时间后就解除阻塞.如果没有得到想要的结果,则再次 ...
- Struts2中 Path (getContextPath与basePath)
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径. 虽然可以用redirect方式解决,但redirect方式并非必要.解决办法非常简单,统一使用绝对 ...
- 《SQL Server 2008从入门到精通》--20180629
约束 主关键字约束(Primary Key Constraint) 用来指定表中的一列或几列组合的值在表中具有唯一性.建立主键的目的是让外键来引用. Primary Key的创建方式 在创建表时创建P ...
- Jenkins定时构建和轮询SCM设置说明
看图说事: 一.定时构建:不管SVN或Git中数据有无变化,均执行定时化的构建任务 : 二.轮询SCM:只要SVN或Git中数据有更新,则执行构建任务: 三.构建语法说明: 1.首先格式为:* * * ...