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高级查询的更多相关文章

  1. 第四章 MySQL高级查询(二)

    第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists ...

  2. 第三章 MySQL高级查询(一)

    第三章 MySQL高级查询(一) 一.SQL语言的四个分类 1.       DML(Data Manipulation Language)(数据操作语言):用来插入,修改和删除表中的数据,如INSE ...

  3. MySQL 高级查询操作

    目录 MySQL 高级查询操作 一.预告 二.简单查询 三.显示筛选 四.存储过程 五.查询语句 1.作为变量 2.函数调用 3.写入数据表 备注 附表一 附表二 相关文献 博客提示 MySQL 高级 ...

  4. python进阶09 MySQL高级查询

    python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...

  5. MySQL高级查询与编程作业目录 (作业笔记)

    MySQL高级查询与编程笔记 • [目录] 第1章 数据库设计原理与实战 >>> 第2章 数据定义和操作 >>> 2.1.4 使用 DDL 语句分别创建仓库表.供应 ...

  6. MySQL高级查询与编程笔记 • 【目录】

    章节 内容 实践练习 MySQL高级查询与编程作业目录(作业笔记) 第1章 MySQL高级查询与编程笔记 • [第1章 数据库设计原理与实战] 第2章 MySQL高级查询与编程笔记 • [第2章 数据 ...

  7. 2.mysql高级查询

    01.SQL高级查询_排序     1.排序语句:order by 排序字段名  asc(默认的-升序) / desc(降序);     2.例如:查询所有服装类商品,将查询结果以价格升序排序:   ...

  8. MySQL高级查询 & 事务机制

    1.基础查询where 高级条件查询Where子句 SELECT empno,ename,sal,hiredate FROM t_tmp WHERE deptno=10 AND (sal+IFNULL ...

  9. MySQL高级查询语句

    高级查询: 一:多表连接 1.select Info.Code,Info.Name,Nation.Name from Info,Nation where Info.Nation = Nation.Co ...

随机推荐

  1. nginx+tomcat实现Windows系统下的负载均衡搭建的案例

    刚入行没多久就听过‘负载均衡’的大名,到现在因为工作接触的少,所以没什么太多的认识.但自己又对其非常的好奇,所以前两天通过查资料,在自己的笔记本上就搭建了一个超简单的案例(工作中没有时间,晚上到家了条 ...

  2. html-使用表单标签实现注册页面

    案例说明: - 使用表格实现页面效果 - 超链接不想要有效果,使用href="#" - 如果表格里面的单元格没有内容,使用空格作为占位符   - 使用图片标签提交表单 <in ...

  3. 解决input为number类型时maxlength无效的问题

    使用input数字number类型的时候maxlength无效,假设需要控制输入数量为18,可以用以下方式: 无效: <input type="text"  maxlengt ...

  4. OpenGL学习--08--基本渲染(灯光)

    1.tutorial08.cpp // Include standard headers #include <stdio.h> #include <stdlib.h> #inc ...

  5. Arcengine编辑代码

    using System; using System.Drawing; using System.Collections; using System.ComponentModel; using Sys ...

  6. import依赖范围的使用

    <!-- <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...

  7. Java类的封装

    java中四种不同的限定词限定的成员(成员变量或成员变量方法),访问权限由大到小依次为: public(公共的) 可以被所有的类访问 protected(受保护的) 可以被这个类本身访问 可以被它的子 ...

  8. springboot学习入门之五---开发Web应用之JSP篇

    转载:http://tengj.top/2017/03/13/springboot5/ 1整体结构 整体的框架结构,跟前面介绍Thymeleaf的时候差不多,只是多了webapp这个用来存放jsp的目 ...

  9. Web程序中打开QQ、邮箱、阿里旺旺等

    在网页中使用链接打开QQ的聊天窗口有两种方式: uin的值为qq号 <a target="_blank" href="@Url.Content("tenc ...

  10. SQLSERVER性能计数器的简单剖析

    SQLSERVER性能计数器的简单剖析 今晚看了这篇文章:SQL Server 2012新performance counter:非常实用的Batch Resp Statistics 文章里介绍到SQ ...