多表连接和高级查询,存储过程和函数

内连接 inner join

根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。结果表中的是两个表中的满足连接谓词的并集。
语法:select a表列1,a表列2,b表列1,b表列2 from a表 inner join b表 where a表列1=b表列1;
可用on替代where;

外连接 left outer join和right outer join

左外连接和右外连接的区别就是结果表会把左边的或是右边的表全部拿出来,另一个表只拿满足连接谓词的部分,不存在的部分由NULL补充。
语法:select… from table1 LEFT OUTER JOIN table2 where table1.a=table2.b;.

表连接时的on使用

on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左连接(右连接)表中的记录。它只会影响表中显示的内容。
在这里插入图片描述
on的子句的作用是筛选表二要显示的内容,不影响查询结果的条数。
在这里插入图片描述
而在on之后还有where语句,WHERE 条件是在临时表已经生成后,对多表连接的结果进行筛选,满足条件的才可以留下,因为此时已经没有 LEFT JOIN 的含义(必须返回左侧表的记录)了,所以如果 WHERE 条件不为真的记录就会被过滤掉。所以会影响最终的查询条数。
在这里插入图片描述

层级查询

单表关联查询–在同一张表里面进行层级查询,可以将同一张表另命名为不同的别名代表不同表进行连接查询。

UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
UNION 的结果是两个相同列数和列的属性相同的表在行上进行叠加。
UNION 的使用:可以自己通过其他连接得到两个满足上述条件的表,

UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)

SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;
如:
SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID
UNION
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;

UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)

SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;
下面的 SQL 语句使用 UNION ALL 从 “Websites” 和 “apps” 表中选取所有的中国(CN)的数据(也有重复的值):
SELECT country, name FROM Websites
WHERE country=‘CN’
UNION ALL
SELECT country, app_name FROM apps
WHERE country=‘CN’
ORDER BY country;
同时可以在SELECT country FROM Websites之后跟上where条件进行筛选。

高级查询

分组函数

规则:
1.分组函数是对表中一组记录进行操作,每组只返回一个结果
2.GROUP BY分组可以不止一个。
3.GROUP BY 所指定的列并不是必须出现在SELECT 列表中。
使用函数:MIN,MAX,SUM,AVG,COUNT,DISTINCT(消除重复记录后再使用组函数)
distinct用法:直接distinct 列名
语法:
select 列
from 数据,表
where 在表上的条件
group by 分组
having 在组上的条件
order by 排序

语句执行顺序:where(筛选出符合的部分)->group by分组->having组上筛选->select(在这一步会将行进行合并)->order by进行排序

子查询

子查询返回多于一‘行’,只能与多值运算符一起使用,如 IN 运算符。
子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。

select语句在子查询中使用

select * from table1 where
列名1 in(当select出来的是一个值就可以用=) (select 列名 from 表名 where …)
and
列名2 in (select 列名 from 表名 where …)

insert into语句在子查询中使用

子查询也可以与 INSERT 语句一起使用。INSERT 语句使用子查询返回的数据插入到另一个表。
insert into 表名
select 列名 from 表名 where 列名1 in (select 列名 from 表名 where …);

update语句中的子查询使用

UPDATE 表名 SET 列名= … WHERE 列名 IN (SELECT查询);

在分组排序中取前n条数据

在分组排序中取前n条数据

锁,并发

1、事务的并发问题是如何发生的?

多个事务同时操作同一个数据库的相同数据时

2、并发问题都有哪些?

脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
A事务读取了B事务尚未提交的更改数据,并且在这个数据基础上进行操作。如果此时恰巧B事务进行回滚,那么A事务读到的数据是根本不被承认的。

不可重复读:一个事务多次读取,结果不一样
不可重复读是指A事务读取了B事务已经提交的更改数据。假设A在取款事务的过程中,B往该账户转账100元,A两次读取账户的余额发生不一致
幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“插入”的数据
幻读和不可重复读是两个容易混淆的概念,前者是指读到了其他事物已经提交的新增数据,而后者是读到了已经提交事务的更改数据(更改或删除)。
3、如何解决并发问题
通过设置隔离级别来解决并发问题
1.允许脏读
2.不允许脏读
3.可重复读
4.串行化:解决幻读

变量

在数据库中申请变量
局部变量名必须以@开头,作用范围仅为程序内部。
局部变量必须先声明后使用
声明格式为:
declare @局部变量名 数据类型 [最大长度]
为变量赋值

可用set或select 语句为变量赋值,格式为:
set @局部变量=变量值|表达式

select @局部变量=变量值|表达式

使用事务:存储过程和函数

存储过程

在mysql的命令行中:
语法:
delimiter $ $ //$$中间没有空格。
create procedure 存储过程名称( [in || out] 参数名 参数类型)
begin
操作
END $ $
delimiter;
调用:
call 存储过程名称;

函数

在mysql的命令行中:
delimiter $ $ //是设置 $ $为命令终止符号,代替分号,因为分号在begin…end中会用到;
mysql> delimiter $ $
create function 函数名(param1 varchar(5),parmam2 varchar(5),param3 varchar(10))
returns varchar(20)
BEGIN
return();
END $ $
函数创建成功后需恢复分号为命令终止符号。
mysql> delimiter ;
外部调用:
select 函数名();

函数中使用其他语句链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值