菜鸡学习day28
/*
多表查询
查询语法:
select
列名列表
from
表名列表
笛卡尔积:有两个集合AB,取他们的所有组合情况
要完成多表查询,需要消除无用数据
分类:
1.内连接查询
1.隐式内连接 (用where消除无用数据)
SELECT 字段列表 FROM 表名 WHERE 条件
2.显式内连接
SELECT 字段列表 FROM 表名1 【INNER】 JOIN 表名2 ON 条件;
注:表?条件?查询字段?
2.外连接查询(一般用左)
1.左外连接
显示左表所有数据及其交集部分
SELECT 查询字段 FROM 表1 LEFT OUTER JOIN 表2 ON 条件;
2.右外连接
显示右表所有数据及其交集部分
right
3.子查询
查询中嵌套查询
查询 = (子查询);
*子查询的不同情况:
1.单行单列:子查询可以作为条件,使用单值运算符判断
2.多行单列:使用运算符in判断 where id in(xxx);
3.多行多列:子查询作为虚拟表
*/
-- 隐式内连接
SELECT
t1.`fenlei_name`,
t2.`name`
FROM
fenlei t1,
yuangong t2
WHERE
t1.`fenlei_id` = t2.`id`;
-- 显式内连接
SELECT * FROM fenlei t1 INNER JOIN yuangong t2 ON t1.`fenlei_id` = t2.`id`;
-- 左外连接
SELECT * FROM fenlei t1 LEFT OUTER JOIN yuangong t2 ON t1.`fenlei_id` = t2.`id`;
-- 右外连接
SELECT * FROM fenlei t1 RIGHT OUTER JOIN yuangong t2 ON t1.`fenlei_id` = t2.`id`;
-- 子查询
SELECT * FROM yuangong WHERE yuangong.`id` = (SELECT MAX(yuangong.`id`) FROM yuangong);
-- 多行多列,子查询作为虚拟表
SELECT * FROM xianlu t1,(SELECT * FROM guke WHERE guke.`guke_birthday` > "2020-05-17") t2 WHERE t1.`xianlu_id` = t2.guke_id;
-- 练习
-- 1.查询线路名称价格日期(xianlu),分类(fenlei)
SELECT
t1.`xianlu_id`,
t1.`xianlu_name`,
t1.`xianlu_price`,
t1.`xianlu_date`,
t2.`fenlei_name`
FROM
xianlu t1
INNER JOIN
fenlei t2
ON
t1.`xianlu_wid` = t2.`fenlei_id`;
-- 2.查询顾客姓名性别电话,线路名称(中间表)
SELECT
t1.`guke_id`,
t1.`guke_name`,
t1.`guke_gender`,
t1.`guke_tel`,
t2.`xianlu_name`
FROM
guke t1,
xianlu t2,
zhongjianbiao t
WHERE
t1.`guke_id` = t.`zjb_gid` AND t2.`xianlu_id` = t.`zjb_xid`;
-- 3. 查询顾客姓名电话工资,最高能承担的线路名称价格
ALTER TABLE guke ADD gongzi INT;
SELECT
t1.`guke_id`,
t1.`guke_name`,
t1.`gongzi`,
t2.`xianlu_name`,
t2.`xianlu_price`
FROM
guke t1,
xianlu t2
WHERE
t1.`gongzi` >= t2.`xianlu_price`;
-- 4.查询分类名称,每类线路数目 group by分组字段
SELECT
t1.`fenlei_id`,
t1.`fenlei_name`,
COUNT(t2.`xianlu_wid`)
FROM
fenlei t1,
xianlu t2
WHERE
t1.`fenlei_id` = t2.`xianlu_wid`
GROUP BY
t1.`fenlei_id`
-- 事务
/*
1.基本介绍
如果一个包含多个步骤的业务操作,被事务管理,则这些步骤同时成功/失败
操作:
1.开启事务 start transaction
2.回滚 rollback
3.提交 commit
start transaction;
事务xxxx;
…………
commit;
rollback;
注:mysql中事务默认自动提交
一条DML(增删改)语句会自动提交一次事务
手动提交:需先开启事务,再提交,如果没提交则自动回滚
修改事务的默认提交方式:(查看)select @@autocommit; 1自动 0手动
(修改)set @@autocommit = 0/1;
2.四大特征*********
1.原子性:是不可分割的最小操作单位(同时)
2.持久性:事务提交/回滚后,数据库会持久化地保存数据
3.隔离性:多个事务之间相互独立
4.一致性:操作前后数据总量不变
隔离级别(了)
多个事务之间相互独立
但如果多个事务之间操作同一批数据,则会引发问题,需要设置不同隔离级别
存在问题:
1.脏读:一个事物读取到另一个事务中没有提交的数据
2.不可重复读(虚读):同一事物中,两次读取到的数据不一样
3.幻读:一个事务操作数据表中的所有记录,另一个事务添加了一条数据,第一个事物查询不到修改
隔离级别:
1.read uncommitted 读未提交:123
2.read committed 读已提交:23
3.repeatable read 可重复度::3
4.serializable 串行化:无
注:隔离级别从小到大安全性提高,效率降低
设置隔离级别:
1.(查看)select @@tx_isolation;
2.(修改)set global transaction isolation level 级别字符串;
*/
-- DCL管理用户,授权(了)
/*
管理:
1.添加
2.删除
3.修改密码
4.查询
1.(切换数据库)use 库名称;
2.(查询表) select * from user;
通配符%表示可以在任意主机使用用户登录数据库
3.(创建用户)create user‘用户名’ @‘主机名’ identified by‘密码’;
4.(删除用户)drop user‘用户名’ @‘主机名’;
5.(修改密码)update user set password = password(‘新密码’)where user = ‘用户名’;
set password for‘用户名’ @‘主机名’ = password(‘新密码’);
授权:
1.(查询)show grants for ‘用户名’@‘主机名’;
2.(授权)grant 权限列表 on 库名.表名 to ‘用户名’@‘主机名’;
所有权限的通配符:all
所有库的通配符:*.*
3.(撤销)revoke 权限列表 on 库名.表名 from ‘用户名’@‘主机名’;
*/