2017年07月05号课堂笔记
2017年07月05号 星期三 多云 空气质量:中度污染
内容:mysql第五节课+MySQL自测考试
表连接查询:内连接,左右外连接,自连接
事务:事务的特性 ACID,demo(模拟 银行转账)开启,回滚,提交,关闭/开启事务自动提交
一、表连接查询
1、概念:
1)内连接 : 通过匹配两个表中公共列,找到 公共的行!
2)左外连接: 以左表为准,右表中没有数据返回null
3)右外连接: 以右表为准,左表中没有数据返回null
4)自连接: 把一个表当成多个表来使用 关键是 使用别名
2、demo
1)内连接和隐式内连接
-- 输出学生姓名以及对应的年级名称 内连接
SELECT StudentName,GradeName FROM student INNER JOIN grade
ON student.`GradeId`=grade.`GradeID`
-- 隐式内连接
SELECT StudentName,GradeName FROM student,grade
WHERE student.`GradeId`=grade.`GradeID`
2)查询 考试 课程编号是1的 学生姓名 以及年级名称 和科目名称以及成绩
01.
SELECT s.StudentName,GradeName,SubjectName ,studentResult FROM student s
INNER JOIN grade g ON (s.gradeID=g.gradeID)
INNER JOIN `subject` b ON(g.gradeID=b.gradeID)
INNER JOIN result r ON (b.subjectNo=r.subjectNo)
AND s.studentNo=r.studentNo
AND b.subjectNo=1
02.
SELECT StudentName,GradeName,SubjectName ,studentResult FROM
student s,grade g,`subject` b,result r
WHERE s.gradeID=g.gradeID
AND g.gradeID=b.gradeID
AND s.studentNo=r.studentNo
AND b.subjectNo=r.subjectNo
AND b.subjectNo=1
3)左外连接和右外连接
-- 左外连接
SELECT * FROM grade LEFT JOIN student
ON grade.GradeID=student.gradeid;
-- 右外连接
SELECT * FROM grade RIGHT JOIN student
ON grade.GradeID=student.gradeid;
4)查询的列 不在同一个表中! 必须使用连接查询!建立关联关系!
-- 临时表只有当前连接可见 随连接的关闭 自动删除
-- 临时表的增删改 不会影响到 真表
CREATE TEMPORARY TABLE myStudent
(SELECT * FROM student)
SELECT * FROM myStudent
DELETE FROM mystudent -- 临时表的数据删除
SELECT * FROM student -- 不会影响到真表
5)自连接
SELECT * FROM teacher
-- 查询 老师3 的姓名和 对应的 导师的姓名
-- t1 老师 t2 导师 老师的导师编号=== 导师的编号
SELECT t1.`name` AS a,t2.`name` AS 导师姓名 FROM teacher t1,teacher t2
WHERE t1.`name`='老师3'
AND t2.id=t1.tid
二、事务
1、事务的概念及特性
1)事务:一条或者多条sql语句的集合!
2)事务的特性 ACID
①原子性 (Atomicity):在事务中的操作,要么都执行,要么都不执行!
②一致性(Consistency):事务必须保证数据库从一个一致性的状态变成另一个一致性的状态!
③隔离性(Isolation):每个事务之间互不干扰!哪怕是并发执行也不干扰!
④持久性(Durability):事务一旦被改变,那么对数据库中数据的影响是永久性的!
2.demo(模拟 银行转账)
1)-- 创建数据库
CREATE DATABASE myBank;
-- 切换指定的数据库
USE myBank;
-- 创建表
CREATE TABLE IF NOT EXISTS bank(
customerName VARCHAR(10) NOT NULL COMMENT '用户名',
currentMoney DECIMAL(10,2) NOT NULL COMMENT '账户余额'
);
-- 插入数据
INSERT INTO bank VALUES('小黑',50000),('小白',500000);
-- 小黑 给小白 转账10000
-- 修改两条数据
-- 01.小黑-10000
-- 02.小白+10000
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
-- 故意写错字段名称 让02 报错
UPDATE bank SET currentMoneysss=currentMoney+10000
WHERE customerName='小白';
2)-- 开启事务 START TRANSACTION 或者 BEGIN
-- 01.02 为一个事务
BEGIN
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
UPDATE bank SET currentMoneysss=currentMoney+10000
WHERE customerName='小白';
-- 事务回滚 ROLLBACK
-- 提交事务 COMMIT
UPDATE bank SET currentMoney=500000
WHERE customerName='小黑';
-- 证明mysql是默认提交事务的!
3)SET autocommit=0(关闭事务自动提交) | 1(开启事务自动提交)
-- 关闭事务自动提交
SET autocommit=0;
BEGIN; -- 开启事务
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
UPDATE bank SET currentMoney=currentMoney+10000
WHERE customerName='小白';
COMMIT; -- 手动提交事务
UPDATE bank SET currentMoney=10000;
ROLLBACK; -- 事务回滚
SET autocommit=1; -- 恢复自动提交
三、MySQL自测考试
1.cmd 命令后 使用mysql的root用户登录语句
自己答案:
2.创建一个用户并给用户授权,刷新权限
自己答案:
3.创建一个名称为T13的数据库
自己答案:
4.切换到T13数据库
自己答案:
5.创建一个Teacher 表
字段有
id 主键 不为空
name
age
address
teacherID 代表导师的编号
创建成功后,给teacher表添加一个sex字段
自己答案:
6.创建一个Student表
id 主键 不为空
age
name
tid 代表对应的教师编号
自己答案:
7.给两个表中 新增 至少5条测试数据
自己答案:
8.创建teacher表和student表的 主外键关系
提示: 外键关系应该建立在 从表上
自己答案:
9.查询 年龄在20 到 25之间的 学生姓名以及对应的老师姓名
自己答案:
10.查询老师的姓名和对应导师的姓名 (自身连接)
自己答案:
11.查询老师的平均,最大,最小年龄
自己答案:
12.查询年龄最大的前2名学生信息,并按照 降序排列
自己答案:
13. sql结构化查询语言的分类,并写出相应的单词
自己答案:
14.常见的约束名称以及关键字?
自己答案:
15.在模糊查询中 % 和 _ 的区别
自己答案:
16.sql语句的执行顺序
自己答案:
17.mysql中 获取时间的函数 至少4个
自己答案:
18.有符号和无符号的区别,以及关键字是什么!zerofill的作用
自己答案:
19.MyISAM 和InnoDB两种引擎的区别
自己答案:
20. MYD,MYI,frm,ibd结尾的文件保存什么
自己答案:
四、老师辛苦了!