花了三天时间,把以前不扎实的SQL基础进行了巩固和强化,特整理此笔记。 数据库的英文单词: DataBase 简称 : DB 什么是数据库? 用于存储和管理数据的仓库。 数据库的特点: 持久化存储数据的。其实数据库就是一个文件系统 方便存储和管理数据 使用了统一的方式操作数据库 – SQL 什么是SQL? SQL通用语法 SQL分类 C(Create):创建 创建数据库: 创建数据库,判断不存在,再创建: 创建数据库,并指定字符集 练习:创建db数据库,判断是否存在,并指定字符集为gbk R(Retrieve):查询 查询所有数据库名称: 查询某个数据库的字符集:查询某个数据库的创建语句 U(Update):修改 修改数据库的字符集 D(Delete):删除 删除数据库 判断数据库是否存在,存在再删除 使用数据库 查询当前正在使用的数据库名称 使用数据库 C(Create):创建 语法 注意最后一列,不需要加逗号 数据库类型: int:整数类型 例如:age int, double:小数类型 例如:score double(5,2) 代表小数最多为5位,小数点后保留2位 date:日期,只包含年月日,yyyy-MM-dd datetime:日期,包含年月日时分秒,yyyy-MM-dd HH:mm:ss timestamp:时间戳类型 包含年月日时分秒,yyyy-MM-dd HH:mm:ss varchar:字符串类型 创建表 复制表 R(Retrieve):查询 查询某个数据库中所有的表名称 查询表结构 U(Update):修改 修改表名 修改表的字符集 添加一列 修改列的名称、类型 修改列名和类型 只修改列的类型 删除列 D(Delete):删除 基本的删除语法 语法: 注意: 列名和值要一一对应 如果表名后面不定义列名,则默认给所有列添加值 除了数字类型,其他类型需要使用引号(单双都可以)引起来 语法 注意 如果不加条件,则删除表中所有记录 如果要删除所有记录,有两种操作 不推荐使用的操作。有多少条记录就会执行多少次删除操作,效率低 推荐使用,先删除表,然后再创建一张一样的表,效率高 语法 注意 如果不加任何条件,则会将表中所有记录全部修改 语法: 多个字段的查询 注意 如果查询所有字段,则可以使用*来替代字段列表 去除重复 计算列 一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算) IFNULL(表达式1,表达式2):NULL参与的运算,计算结果都为null 起别名 对列指定别名 对列和表同时指定别名 AS也可以用空格省略 表使用别名的原因:用于多表查询操作 where子句后跟条件 运算符 < 、>、<= 、>= 、= 、<> BETWEEN…AND :表示在一个范围之内 例如:在学生表内查询年龄20-30岁之间的学生 IN( 集合) :表示集合表示多个值,使用逗号分隔 例如:在学生表内查询年龄为22、18、25岁的学生 LIKE:模糊查询 占位符 例如:在学生表内查询姓马的人 例如:在学生表内查询姓名中第二个字叫化的人 例如:在学生表内查询姓名为三个字的人 例如:在学生表内查询姓名中有一个字是德的人 IS NULL :查询某一列为 NULL 的值,特别注意不能写=NULL 例如:在学生表内查询英语成绩为空的人 例如:在学生表内查询英语成绩不为空的人 AND或 && OR或 || NOT 或 ! 语法:ORDER BY子句 排序方式: 注意 例如:在学生表内,按数学成绩升序排序,如果数学成绩相同,则按英语成绩升序排序 概念:将一列数据作为一个整体,进行纵向的计算 例如:按照性别分组,分别查询男、女同学的平均分 例如:按照性别分组,分别查询男、女同学的平均分、人数 例如:按照性别分组,分别查询男、女同学的平均分、人数,要求:分数低于70分的人,不参与分组 例如:按照性别分组,分别查询男、女同学的平均分、人数,要求:分数低于70分的人,不参与分组,分组之后,人数要大于两个人 例如:每页显示3条记录 概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。 分类: 创建表时添加非空约束 创建表后,添加非空约束 删除name的非空约束 创建表时添加唯一约束 删除唯一约束(唯一索引) 创建表后,添加唯一约束 注意 在创建表时,添加主键约束 删除主键 创建表后,添加主键 自动增长 概念:如果某一列是数值类型的,使用AUTO_INCREMENT可以来完成值的自动增长 在创建表时,添加主键约束,并且完成主键自增长 删除自动增长 创建表后,添加自动增长 在创建表时,可以添加外键 语法 删除外键 创建表后,添加外键 级联操作 添加级联操作 语法 分类 分类 一对一(了解) 例如:人和身份证 分析:一个人只有一个身份证,一个身份证只能对应一个人 一对多(多对一) 例如:部门和员工 分析:一个部门有多个员工,一个员工只能对应一个部门 多对多 例如:学生和课程 分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择 实现关系 例子 概念:设计数据库时,需要遵循的一些规范。要遵循后面的范式要求,必须先遵循前面的所有范式要求 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。 分类 第一范式(1NF):每一列都是不可分割的原子数据项 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖) 第三范式(3NF):在2NF基础上,任何排主属性不依赖于其它非主属性(在2NF基础上消除传递依赖) 命令行 语法 备份 还原: 登陆数据库 创建数据库 使用数据库 执行文件 图形化工具 查询语法 例如 笛卡尔积 内连接查询 隐式内连接:使用WHERE条件消除无用数据 例如 显式内连接 语法 例如 内连接查询 外连接查询 左外连接 语法 查询的是左表所有数据以及其交集部分(A并(A且B)) 例子 右外连接 语法 查询的是右表所有数据以及其交集部分(B并(B且A)) 例子 子查询 概念:查询中嵌套查询,称嵌套查询为子查询 例子 子查询不同情况 子查询的结果是单行单列的 子查询可以作为条件,使用普通运算符去判断 例子 子查询的结果是多行单列的 子查询可以作为条件,使用运算符IN去判断 例子 子查询的结果是多行多列的 子查询可以作为一张虚拟表 例子 概念 操作: 例子 MySQL数据库中事务默认自动提交 事务提交的两种方式 修改事务的默认提交方式 查看事务的默认提交方式 修改默认提交方式 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。 存在问题 隔离级别 注意:隔离级别从小到大安全性越来越高,但是效率越来越低 数据库查询隔离级别 数据库设置隔离级别 添加用户 语法 删除用户 语法 修改用户密码 语法 普通语句修改 DCL特有语句修改 管理员运行cmd,停止mysql服务 使用无验证方式启动mysql服务 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功 关闭两个窗口 打开任务管理器,手动结束mysqld.exe 的进程 启动mysql服务 使用新密码登录。 查询用户 切换到MySQL数据库 查询user表 查询权限 授予权限 撤销权限
本文中MySQL语句都结合例子进行练习,供自己以后复习使用,也供大家学习参考文章目录
MySQL复习总结
SQL基本概念
Structured Query Language:结构化查询语言
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
用来查询数据库中表的记录(数据)。关键字:select, where 等
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等DDL:操作数据库、表
1. 操作数据库:CRUD
CREATE DATABASE 数据库名称;
CREATE DATABASE IF NOT EXISTS 数据库名称;
CREATE DATABASE 数据库名称 CHARACTER SET 字符集名;
CREATE DATABASE IF NOT EXISTS db CHARACTER SET gbk;
SHOW DATABASES;
SHOW CREATE DATABASE 数据库名称;
ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称;
DROP DATABASE 数据库名称;
DROP DATABASE IF EXISTS 数据库名称;
SELECT DATABASE();
USE 数据库名称;
2. 操作表:CRUD
CREATE TABLE 表名( 列名1 数据类型1, 列名2 数据类型2, ... 列名n 数据类型n );
例如:name varchar(20) 表示姓名最大20个字符
CREATE TABLE student( id INT, name VARCHAR(30), age INT, score DOUBLE(4,1), birhtday DATE, insert_time TIMESTAMP );
CREATE TABLE 表名 LIKE 被复制的表名;
SHOW TABLES;
DESC 表名;
ALTER TABLE 表名 RENAME TO 新的表名;
ALTER TABLE 表名 CHARACTER SET 字符集名称;
ALTER TABLE 表名 ADD 列名 数据类型;
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
ALTER TABLE 表名 MODIFY 列名 新数据类型;
ALTER TABLE 表名 DROP 列名;
DROP TABLE 表名;
- 判断是否存在后再删除 ```sql DROP TABLE IF EXISTS 表名;
DML:增删改表中数据
1. 添加数据
INSERT INTO 表名(列名1,列名2,...列名n) VALUES(值1,值2,...值n);
INSERT INTO 表名 VALUES(值1,值2,...值n);
2. 删除数据
DELETE FROM 表名 WHERE [条件]
DELETE FROM 表名;
TRUNCATE TABLE 表名;
3. 修改数据
UPDATE 表名 SET 列名1=值1,列名2=值2,...列名n=值n [WHERE 条件];
DQL:查询表中的记录
SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组之后的条件 ORDER BY 排序 LIMIT 分页限定
2. 基础查询
SELECT 字段名1,字段名2...from 表名;
SELECT DISTINCT 字段名1,字段名2...from 表名;
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名;
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名 AS 表别名;
3. 条件查询
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
SELECT * FROM student WHERE age>=20 AND age<=30;
SELECT * FROM student WHERE age IN(22,18,25);
SELECT * FROM student WHERE age=22 OR age=18 OR age=25;
SELECT * FROM student WHERE name LIKE '马%';
SELECT * FROM student WHERE name LIKE '_化%';
SELECT * FROM student WHERE name LIKE '___';
SELECT * FROM student WHERE name LIKE '%德%';
SELECT * FROM student WHERE english IS NULL;
SELECT * FROM student WHERE english IS NOT NULL;
4. 排序查询
ORDER BY 排序字段1 排序方式1, 排序字段2 排序方式2,...排序字段n 排序方式n;
SELECT * FROM student ORDER BY math ASC,english ASC;
5. 聚合函数
6. 分组查询
SELECT sex,AVG(math) FROM student GROUP BY sex;
SELECT sex,AVG(math),COUNT(id) FROM student GROUP BY sex;
SELECT sex,AVG(math),COUNT(id) FROM student WHERE math>=70 GROUP BY sex;
SELECT sex,AVG(math),COUNT(id) FROM student WHERE math>=70 GROUP BY sex HAVING COUNT(id)>2;
SELECT sex,AVG(math),COUNT(id) 人数 FROM student WHERE math>=70 GROUP BY sex HAVING 人数>2;
7. 分页查询
SELECT * FROM student LIMIT 0,3;
SELECT * FROM student LIMIT 3,3;
约束
– 非空约束:NOT NULL,值不能为NULL
CREATE TABLE stu( id INT, name VARCHAR(20) NOT NULL );
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
ALTER TABLE stu MODIFY NAME VARCHAR(20);
– 唯一约束:UNIQUE,值不能重复
CREATE TABLE stu( id INT, phone_number VARCHAR(20) UNIQUE );
ALTER TABLE stu DROP INDEX phone_number;
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
– 主键约束:PRIMARY KEY
CREATE TABLE stu( id INT PRIMARY KEY, name VARCHAR(20) );
ALTER TABLE stu DROP PRIMARY KEY;
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
CREATE TABLE stu( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) );
ALTER TABLE stu MODIFY id INT;
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
– 外键约束:FOREIGN KEY,让表与表产生关系,从而保证数据的正确性
CREATE TABLE 表名( ... 外键列 CONSTRAINT 自定义的外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称) );
ALTER TABLE 表名 DROP FOREIGN KEY 创建时自定义的外键名称;
ALTER TABLE 表名 ADD CONSTRAINT 自定义的外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称);
ALTER TABLE 表名 ADD CONSTRAINT 自定义的外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;
数据库的设计
1. 多表之间的关系
-- 创建旅游线路分类表 tab_category -- cid 旅游线路分类主键,自动增长 -- cname 旅游线路分类名称非空,唯一,字符串 100 CREATE TABLE tab_category( cid INT PRIMARY KEY AUTO_INCREMENT, CNAME VARCHAR(100) NOT NULL UNIQUE ); /* rid 旅游线路主键,自动增长 rname 旅游线路名称非空,唯一,字符串 100 price 价格 rdate 上架时间,日期类型 cid 外键,所属分类 */ CREATE TABLE tab_route( rid INT PRIMARY KEY AUTO_INCREMENT, rname VARCHAR(100) NOT NULL UNIQUE, price DOUBLE, rdate DATE, cid INT, FOREIGN KEY (cid) REFERENCES tab_category(cid) ); /* 24 / 26 创建用户表 tab_user uid 用户主键,自增长 username 用户名长度 100,唯一,非空 password 密码长度 30,非空 name 真实姓名长度 100 birthday 生日 sex 性别,定长字符串 1 telephone 手机号,字符串 11 email 邮箱,字符串长度 100 */ CREATE TABLE tab_user( uid INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(100) NOT NULL UNIQUE, password VARCHAR(30) NOT NULL, name VARCHAR(100), birthday DATE, sex CHAR(1) DEFAULT '男', telephone VARCHAR(11), email VARCHAR(100) ); /* 创建表 tab_favorite rid 旅游线路 id,外键 date 时间 uid 用户 id,外键 rid 和 uid 不能重复,设置复合主键,同一个用户不能同一个线路两次 */ CREATE TABLE tab_favorite( rid INT, date DATETIME, uid INT, PRIMARY KEY(rid,uid), FOREIGN KEY (rid) REFERENCES tab_route(rid), FOREIGN KEY (uid) REFERENCES tab_user(uid) );
2. 数据库设计的范式
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
数据库的备份和还原
mysqldump -u用户名 -p密码 数据库名称> 保存的路径
mysql -uroot -proot
CREATE DATABASE 数据库名称;
USE 数据库名称;
source 备份时保存的路径
多表查询
SELECT 列名列表 FROM 表名列表 WHERE ....
# 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部'); # 创建员工表 CREATE TABLE emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), gender CHAR(1), -- 性别 salary DOUBLE, -- 工资 join_date DATE, -- 入职日期 dept_id INT, FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键) ); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
– 多表查询的分类
-- 查询所有员工信息和对应的部门信息 SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`; -- 查询员工表的名称,性别。部门表的名称 SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`; SELECT t1.name, -- 员工表的姓名 t1.gender,-- 员工表的性别 t2.name -- 部门表的名称 FROM emp t1, dept t2 WHERE t1.`dept_id` = t2.`id`;
SELECT 字段列表 FROM 表名1 [INNER] JOIN 表名2 ON 条件
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;
SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 SELECT t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;
-- 查询工资最高的人的信息 SELECT * FROM emp WHERE salary=(SELECT MAX(salary) FROM emp);
-- 查询员工工资小于平均工资的人 SELECT * FROM emp WHERE salary <( SELECT AVG(salary) FROM emp );
SELECT * FROM emp WHERE emp.dept_id IN ( SELECT id FROM dept WHERE name IN ('财务部','市场部'));
-- 查询员工入职日期是2011-11-11以后的员工信息和部门信息 -- 虚拟表做法 SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date > '2011-11-11') t2 WHERE t1.id=t2.dept_id;
-- 普通内连接做法 SELECT * FROM emp,dept WHERE emp.dept_id=dept.id AND emp.join_date > '2011-11-11';
– 多表查询练习
-- 部门表 CREATE TABLE dept ( id INT PRIMARY KEY PRIMARY KEY, -- 部门id dname VARCHAR(50), -- 部门名称 loc VARCHAR(50) -- 部门所在地 ); -- 添加4个部门 INSERT INTO dept(id,dname,loc) VALUES (10,'教研部','北京'), (20,'学工部','上海'), (30,'销售部','广州'), (40,'财务部','深圳'); -- 职务表,职务名称,职务描述 CREATE TABLE job ( id INT PRIMARY KEY, jname VARCHAR(20), description VARCHAR(50) ); -- 添加4个职务 INSERT INTO job (id, jname, description) VALUES (1, '董事长', '管理整个公司,接单'), (2, '经理', '管理部门员工'), (3, '销售员', '向客人推销产品'), (4, '文员', '使用办公软件'); -- 员工表 CREATE TABLE emp ( id INT PRIMARY KEY, -- 员工id ename VARCHAR(50), -- 员工姓名 job_id INT, -- 职务id mgr INT , -- 上级领导 joindate DATE, -- 入职日期 salary DECIMAL(7,2), -- 工资 bonus DECIMAL(7,2), -- 奖金 dept_id INT, -- 所在部门编号 CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id), CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id) ); -- 添加员工 INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES (1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20), (1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30), (1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30), (1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20), (1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30), (1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30), (1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10), (1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20), (1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL,10), (1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30), (1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20), (1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30), (1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20), (1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10); -- 工资等级表 CREATE TABLE salarygrade ( grade INT PRIMARY KEY, -- 级别 losalary INT, -- 最低工资 hisalary INT -- 最高工资 ); -- 添加5个工资等级 INSERT INTO salarygrade(grade,losalary,hisalary) VALUES (1,7000,12000), (2,12010,14000), (3,14010,20000), (4,20010,30000), (5,30010,99990); -- 需求: -- 1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述 -- 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置 -- 3.查询员工姓名,工资,工资等级 -- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级 -- 5.查询出部门编号、部门名称、部门位置、部门人数 -- 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询
– 练习答案(不唯一)
-- 需求: -- 1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述 SELECT emp.id,emp.ename,emp.salary,job.jname,job.description FROM emp,job WHERE emp.job_id=job.id; -- 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置 SELECT emp.id,emp.ename,emp.salary,job.jname,job.description,dept.dname,dept.loc FROM emp,job,dept WHERE emp.dept_id=dept.id AND emp.job_id=job.id; -- 3.查询员工姓名,工资,工资等级 SELECT emp.ename,emp.salary,salarygrade.grade FROM emp,salarygrade WHERE emp.salary BETWEEN salarygrade.losalary AND salarygrade.hisalary; -- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级 SELECT emp.ename,emp.salary,job.jname,job.description,dept.dname,dept.loc,sly.grade FROM emp,job,dept,salarygrade sly WHERE emp.job_id=job.id AND emp.dept_id=dept.id AND emp.salary BETWEEN sly.losalary AND sly.hisalary; -- 5.查询出部门编号、部门名称、部门位置、部门人数 SELECT dept.id,dept.dname,dept.loc,ab.sum FROM dept, (SELECT dept_id,COUNT(id) sum FROM emp GROUP BY dept_id) ab WHERE dept.id=ab.dept_id; -- 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询 SELECT e1.ename,IFNULL(e2.ename,'无上级') 上级 FROM emp e1 LEFT JOIN emp e2 ON e1.mgr=e2.id
事务
1. 事务的基本介绍
-- 张三给李四转账500元 CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000); SELECT * FROM account; -- 开启事务 START TRANSACTION; -- 如果出错了 UPDATE account SET balance=balance-500 WHERE NAME='zhangsan'; 错误出现! UPDATE account SET balance=balance+500 WHERE NAME='lisi'; -- 有错误就回滚 ROLLBACK; -- 查看回滚后的结果 SELECT * FROM account; -- 开启事务 START TRANSACTION; -- 如果没错 UPDATE account SET balance=balance-500 WHERE NAME='zhangsan'; UPDATE account SET balance=balance+500 WHERE NAME='lisi'; -- 没错就提交 COMMIT; -- 查看提交后的结果 SELECT * FROM account;
SELECT @@autocommit; -- 1 代表自动提交 0 代表手动提交
SET @@autocommit = 0;
2. 事务的四大特征(面试常见)
3. 事务的隔离级别(了解)
SELECT @@tx_isolation;
SET GOLBAL TRANSACTION ISOLATION LEVEL 级别字符串;
DCL:管理用户,权限管理
1. 管理用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
DROP USER '用户名'@'主机名';
UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
mysql中忘记了root用户的密码?
net stop mysql
mysqld --skip-grant-tables
use mysql;
update user set password = password('你的新密码') where user = 'root';
USE MySQL;
SELECT * FROM USER;
2. 权限管理
-- 查询权限 SHOW GRANTS FOR '用户名'@'主机名';
-- 授予权限 grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'; -- 例如:给张三用户授予所有权限,在任意数据库任意表上 GRANT ALL ON *.* TO 'zhangsan'@'localhost';
-- 撤销权限: revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算