多表查询,事务,DCL

多表查询

select *from a,b; -- 产生笛卡儿积

       笛卡儿积概念:

       要完成多表查询需要消除笛卡儿积产生的无用数据。

 

多表查询分类:

       内连接,外连接,子查询

 

-- 创建班级表

CREATE TABLE class(

       id INT PRIMARY KEY AUTO_INCREMENT,

       cname VARCHAR(20)

       );

 

INSERT INTO class(cname) VALUES('一年级'),('二年级'),('三年级');

 

-- 创建学生表

CREATE TABLE student(

       id INT PRIMARY KEY AUTO_INCREMENT,

       NAME VARCHAR(10), -- 姓名

       gender CHAR(1), -- 性别

       age INT , -- 年龄

       class_id INT, -- 班级编号

       FOREIGN KEY(class_id) REFERENCES class(id)   -- 外键

       );

      

INSERT INTO student(NAME,gender,age,class_id) VALUES

('小明','男', 12, 1);

INSERT INTO student(NAME,gender,age,class_id) VALUES

('小李','男', 14, 3),

('小丽','女', 13, 2),

('小白','女', 12, 1),

('小黑','女', 14, 3),

('小灰','男', 13, 2),

('小红','女', 15, 3);

 

INSERT INTO student(NAME,gender,age,class_id) VALUES

('小紫','男', 12, NULL);

 

INSERT INTO class(cname)VALUES(NULL);

 

-- 笛卡儿积

SELECT *FROM student,class;

 

 

-- 隐式内连接

SELECT *FROM student,class WHERE student.`class_id` = class.id;

 

-- 显式内连接 inner join ...on,inner可以省略

SELECT *FROM student INNER JOIN class ON student.`class_id` = class.id;

 

-- 查询小明的,性别,年龄,班级所有信息

SELECT s.`name`,s.`gender`,s.`age`,c.cname

FROM class c,student s

WHERE c.id = s.`class_id` AND s.`name` = '小明';

 

-- 左外连接left join ...on 查询的是左表所有数据以及其交集部分

SELECT *FROM student s LEFT JOIN class c

ON c.id = s.`class_id`;

 

-- 右外连接right join ...on 查询的是右表所有数据以及其交集部分

SELECT *FROM student s RIGHT JOIN class c

ON c.id = s.`class_id`;

 

-- 子查询

 

-- 查询三年级有哪些人

-- 通过两个语句查询

SELECT id FROM class WHERE class.cname = '三年级';  -- 执行完数据class_id为3

SELECT NAME FROM student WHERE class_id = 3;

-- 通过一个语句查询

SELECT NAME FROM student WHERE class_id=(SELECT id FROM class WHERE class.cname = '三年级');

 

/*

       子查询:一个查询的结果做为另一个查询的条件

        有查询的嵌套,内部的查询称为子查询

        子查询要使用括号

*/

 

子查询不同情况:

-- 子查询结果式单行单列的, 子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =

-- 查询学生年级是三年级的人

SELECT NAME FROM student WHERE class_id=(SELECT id FROM class WHERE class.cname = '三年级');

 

-- 子查询结果是多行单列的, 子查询可以作为条件,使用运算符in来判断

-- 查询二三年级的学生名

SELECT * FROM student WHERE class_id IN(SELECT id FROM class WHERE class.cname = '二年级' OR class.cname = '三年级');

 

-- 子查询结果是多行多列的,子查询可以作为一张虚拟表参与查询

-- 查询每个年级年龄大于12的人数,并且人数大于2的年级

SELECT *FROM class c,(SELECT *FROM student WHERE age > 12)t1 WHERE c.id = t1.class_id;

 

 

事务

概念:被事务管理的操作要么同时成功要么同时失败

操作事务:

       start transaction 开启

       rollback 回滚

       commit 提交

      

修改自动提交方式: select @@autocommit; set @@autocommit = 0;-- 手动提交

 

事务四大特征:

1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。

2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。

3. 隔离性:多个事务之间。相互独立。

4. 一致性:事务操作前后,数据总量不变

事务隔离级别介绍

       问题:脏读,不可重复读,幻读

隔离级别:

1. read uncommitted:读未提交

       产生的问题:脏读、不可重复读、幻读

2. read committed:读已提交 (Oracle)

       产生的问题:不可重复读、幻读

3. repeatable read:可重复读 (MySQL默认)

       产生的问题:幻读

4. serializable:串行化

       可以解决所有的问题

 

 

 DCL:管理用户,授权

1管理用户

       添加用户:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

       删除用户:语法:DROP USER '用户名'@'主机名';

       修改用户密码:

UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';

SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');

       查询用户

USE myql;

SELECT * FROM USER;

2权限管理

查询权限SHOW GRANTS FOR '用户名'@'主机名';

授予权限grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';

撤销权限revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';

 

更多资源请扫描并关注公众号

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hbpartty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值