数据库的基本概念:用于存储和管理数据的仓库。英文名为 DataBase ,简称为 DB。 数据库特点:
1.持久化存储数据,其本身是一个文件系统。2.方便存储和管理数据。3.使用了统一的方式操作数据库。数据库的分类:
网状结构数据库:以节点形式存储和访问。层次结构数据库:以定向有序的树状结构实现存储和访问。关系结构数据库:Oracle、DB2、MySQL 等,以表格(Table)存储,多表间建立关系联系,通过分类、合并、连接、选取等运算实现访问。非关系型数据库:Redis 等,多数使用哈希表,表中以键值对(key-value)的方式实现特定的键和一个指针指向的特定数据。MySQL应用:对于数据库的操作,需要进入MySQL环境下进行指令输入,并在一句指令的末尾使用分号(;)结束。
1.查看MySQL中的所有数据库
SHOW DATABASES;2.创建自定义数据库
CREATE DATABASE db1; # 创建名为db1的数据库 CREATE DATABASE db2 CHARACTER SET utf8; # 创建名为db2的数据库并设置编码集为utf8,注意在SQL中utf-8没有-,写为utf8 CREATE DATABASE db3 IF NOT EXISTS db3; # 如果db3数据库不存在,就创建3.查看数据库创建信息
SHOW CREATE DATABASE db2;回车就可以看到: 4.修改数据库
ALTER DATABASE db2 CHARACTER SET utf8; # 将db2的编码集修改为utf8修改完成后再次执行上方查看数据库创建信息的代码,就可以看到: 5.删除数据库
DROP DATABASE db2;删除数据库db2之后,再执行上方查看所有数据库的命令,就没有db2这个数据库了: 6.查看当前使用的数据库
SELECT DATABASE();由于当前没有使用的数据库,执行上述代码可以看到: 7.使用数据库
USE db1;执行上述语句并且再次查看当前使用的数据库就可以看到在使用db1了:
没有安装该工具的小伙伴可以点击这里,提取码:6cpi ,下载安装喔! 刚安装好的小伙伴的用户名和密码是不能填的,要先点击新建,再填入用户名和密码,点击连接就可以了。 这就是SQLyog的界面了,有想修改字体大小的小伙伴可以点击工具-首选项-字体编辑设置就可以设置字体大小了。
数据库表的基本结构: 关系结构数据库是以表格(Table)进行数据存储,表格由行和列组成。执行查询语句返回的结果集是一张虚拟表。 下面的演示都是基于这个表:点击,提取码:rszj ,小伙伴可以下载这个数据库,并导入到提前创建好的数据库中: 1.基本查询:
语法:SELECT 列名 FORM 表名
关键字描述SELECT指定要查询的列FORM指定要查询的表1.1 查询部分列:将要查询的部分列的列名写上 1.2 查询所有列:可以将所有列的列名写上,也可以用 * 代替
# 查询部分列 SELECT EMPLOYEE_ID,FIRST_NAME,email FROM t_employees; # 查询所有列,用*或者所有列名 SELECT * FROM t_employees; SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID FROM t_employees;选中要执行的代码,按F9或者右键执行查询里面的执行查询或者点击左上角的执行查询按钮,如图: 分别执行查询部分列和所有列,可以看到如下结果:
1.3 对列中的数据进行运算
注:运算操作的是虚拟表中的数据,原来表格数据不会改变。
算数运算符描述+两列做加法-两列做减法*两列做乘法/两列做除法1.4 列的别名(修改表头)
列 AS ‘列名’
# 对表中的数据进行运算,+-*/,而%是占位符号,不是取模。 SELECT EMPLOYEE_ID,FIRST_NAME,SALARY*12 FROM t_employees; # 修改表头 SELECT EMPLOYEE_ID AS '员工编号',FIRST_NAME AS '姓氏',SALARY*12 AS '年薪' FROM t_employees;执行以上代码,可以看到:
1.5 查询结果去重
DISTINCT 列名
# 去掉重复的 SELECT DISTINCT manager_id FROM t_employees;2.排序查询
语法:SELECT 列名 FROM 表名 ORDER BY 排序列 [排序规则]
排序规则描述ASC升序排列DESC降序排列2.1 依据单列排序
# 依据员工工资排序 SELECT employee_id,first_name,salary FROM t_employees ORDER BY CAST(salary AS SIGNED) DESC; SELECT employee_id,first_name,salary FROM t_employees ORDER BY CONVERT(salary,DECIMAL) ASC;注:员工工资是字符串类型,这里需要将字符串类型转换为数字类型才可以正确排序。 可以使用 CAST(salary AS SIGNED),也可以使用 CONVERT(salary,DECIMAL)。
2.2 依据多列进行排序
# 依据员工工资排序,工资相同时,按照编号升序排序 SELECT employee_id,first_name,salary FROM t_employees ORDER BY CAST(salary AS SIGNED) DESC,CAST(employee_id AS SIGNED) ASC;运行以上代码,就可以看到这些工资相同的按照编号排序了: 3.条件查询
语法:SELECT 列名 FROM 表名 WHERE 条件 WHERE 条件筛选符合条件的查询结果,条件为布尔表达式。
3.1 等值判断(=)
# 查询工资为11000的员工 SELECT employee_id,first_name,salary FROM t_employees WHERE salary = 11000;注:在MySQL中一个等号(=)就代表等值判断
3.2 逻辑判断(and,or,not)
# 查询工资是11000并且commission_pct是0.30的员工 SELECT employee_id,first_name,salary,commission_pct FROM t_employees WHERE salary = 11000 AND commission_pct = 0.30; # 查询工资是11000或者commission_pct是0.30的员工 SELECT employee_id,first_name,salary,commission_pct FROM t_employees WHERE salary = 11000 OR commission_pct = 0.30; # 查询工资不等于11000的员工 SELECT employee_id,first_name,salary,commission_pct FROM t_employees WHERE NOT salary = 11000;3.3 不等值判断(>,<,>=,<=,!=,<>)
# != 和 <> 都是不等于的意思,查询工资不等于11000的员工 SELECT employee_id,first_name,salary,commission_pct FROM t_employees WHERE salary <> 11000;3.4 区间判断(between and)
# 查询工资在6000到10000的员工 SELECT employee_id,first_name,salary FROM t_employees WHERE salary BETWEEN 6000 AND 10000;3.5 NULL值判断(IS NULL,IS NOT NULL)
# 查询出经理信息为null的员工信息 SELECT employee_id,first_name,manager_id FROM t_employees WHERE manager_id IS NULL;3.6 枚举判断(IN(值1,值2,值3…))
# 查询department_id是60或70或80或90的员工 SELECT employee_id,first_name,department_id FROM t_employees WHERE department_id IN(60,70,80,90);3.7 模糊查询
LIKE_ 表示任意单个字符 语法:列名 LIKE ‘张_’ (查询姓氏是张,且名字只有两个字的人) LIKE% 表示任意长度的任意字符 语法:列名 LIKE ‘张%’ (查询姓氏是张的人)
# 查询名字以S开头的员工 SELECT employee_id,first_name,department_id FROM t_employees WHERE first_name LIKE 'S%'; # 查询名字以S开头并且长度为4的员工 SELECT employee_id,first_name,department_id FROM t_employees WHERE first_name LIKE 'S____';3.8 分支结构查询
CASE WHEN 条件一 THEN 结果一 WHEN 条件二 THEN 结果二 WHEN 条件三 THEN 结构三 ELSE 结果 END
# 按员工工资进行分等级 SELECT employee_id,first_name,salary, CASE WHEN salary >= 10000 THEN 'A' WHEN salary >= 8000 AND salary < 10000 THEN 'B' WHEN salary >= 6000 AND salary < 8000 THEN 'C' ELSE 'D' END AS '薪资级别' FROM t_employees;4.时间查询
语法:SELECT 时间函数(参数列表)
时间函数描述SYSDATE()当前系统时间(年月日时分秒)CURDATE()当前日期WEEK(DATE)获取指定日期为一年中的第几周YEAR(DATE)获取指定日期的年份)HOUR(TIME)获取指定时间的小时值MINUTE获取指定时间的分钟值DATEDIFF(DATE1,DATE2)获取DATE1,DATE2之间相隔的天数ADD(DATE,N)计算DATE加上N天后的日期 SELECT SYSDATE(); SELECT CURDATE(); SELECT CURTIME(); SELECT WEEK('2020-10-4'); SELECT YEAR('2020-10-4'); SELECT DATEDIFF('2020-10-4','2020-9-4'); SELECT ADDDATE('2020-10-4',10);5.字符串查询
语法:SELECT 字符串函数(参数列表)
字符串函数说明CONCAT(str1,str2…)将多个字符串连接INSERT(str,pos,len,newStr)将str中指定pos位置开始len长度的内容替换为newStrLOWER(str)将指定字符串转换为小写UPPER(str)将指定字符串转换为大写SUBSTRING(str,num,len)将str字符串指定num位置开始截取len个内容 # 多个字符串拼接 SELECT CONCAT('My','S','QL'); SELECT CONCAT(first_name,last_name) AS '姓名' FROM t_employees; # 将指定字符串转换为小写 SELECT LOWER('MySQL'); # mysql # 将指定字符串转换为大写 SELECT UPPER('MySQL'); # MYSQL # 字符串的替换,这里注意字符串下标从1开始 SELECT INSERT('这是一个数据库',3,2,'MySQL'); # 这是MySQL数据库 # 字符串截取 SELECT SUBSTRING('JavaMySQLOracle',5,5); # MySQL6.聚合函数
语法:SELECT 聚合函数(列名) FROM 表名;
聚合函数说明SUM()求一列的和AVG()求平均值MAX()求最大值MIN()最小值COUNT()求总行数 # 求所有员工的工资之和 SELECT SUM(salary) FROM t_employees; # 求所有员工的平均工资 SELECT AVG(salary) FROM t_employees; # 求最高工资 SELECT MAX(CAST(salary AS SIGNED)) FROM t_employees; # 求最低工资 SELECT MIN(CAST(salary AS SIGNED)) FROM t_employees; # 求该表有多少行 SELECT COUNT(salary) FROM t_employees;7.分组查询
语法:SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组依据(列); 关键字GROUP BY必须在WHERE 之后生效
# 查询各部门的总人数 SELECT department_id,COUNT(employee_id) FROM t_employees GROUP BY department_id; # 查询各部门的平均工资 SELECT department_id,AVG(salary) FROM t_employees GROUP BY department_id; # 查询各个部门各个岗位的人数 SELECT department_id,job_id,COUNT(employee_id) FROM t_employees GROUP BY department_id,job_id;查询各个部门各个岗位的人数运行结果如下:
注:分组查询中,select显示的列只能是分组依据列,或者是聚合函数列,不能出现其他列。
8.分组过滤查询
语法:SELECT 列名 FROM 表名 GROUP BY 分组列 HAVING 过滤规则 关键字HAVING是过滤规则,对分组后的数据进行过滤
# 统计60,70,80部门的最高工资 SELECT department_id,MAX(salary) FROM t_employees GROUP BY department_id HAVING department_id IN (60,70,80);执行过程:
group确定分组依据department_idhaving过滤出60,70,80的部门select查看部门编号和执行max函数9.限定查询
SELECT 列名 FROM 表名 LIMIT 起始行,查询行数
关键字说明LIMIT start,count限定查询结果的起始行和总行数 # 查询表中前5行数据 SELECT * FROM t_employees LIMIT 0,5; # 指定任意的查询范围,从表中的第3条数据开始,查询10条 SELECT * FROM t_employees LIMIT 2,10;注:起始行从0开始,代表了第一行,第二个参数代表了从指定行开始查询几行
10.查询总结 SQL语句编写顺序:
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列(asc|desc)LIMIT 起始行,总条数
SQL语句执行顺序:
1.FROM:指定数据来源表 2.WHERE:对查询数据做第一次过滤 3.GROUP BY:分组 4.HAVING:对分组后的数据做第二次过滤 5.SELECT:查询各字段的值 6.ORDER BY:排序 7.LIMIT:限定查询结果
11.子查询
SELECT 列名 FROM 表名 WHERE 条件(子查询结果)
# 查询工资大于Bruce的员工 # 先查询到Bruce的工资 SELECT * FROM t_employees WHERE first_name = 'Bruce'; # 从查询结果中看到Bruce工资是6000 # 再查询大于Bruce工资的员工 SELECT * FROM t_employees WHERE salary > 6000; # 使用子查询,将两行合并,将子查询的结果作为外部查询的条件 SELECT * FROM t_employees WHERE salary > (SELECT salary FROM t_employees WHERE first_name = 'Bruce');12.子查询(作为枚举查询条件)
SELECT 列名 FROM 表名 WHERE 列名 IN(子查询结果)
# 查询与名字为King的员工在同一部门的员工 # 原来的查询方式 SELECT * FROM t_employees WHERE last_name = 'King'; SELECT * FROM t_employees WHERE department_id IN (80,90); # 子查询,将子查询多行一列的结果作为外部查询的枚举查询条件,做第二次查询 SELECT * FROM t_employees WHERE department_id IN (SELECT department_id FROM t_employees WHERE last_name = 'King'); # 查询高于60部门所有人的工资的员工信息 SELECT * FROM t_employees WHERE salary > ALL(SELECT salary FROM t_employees WHERE department_id = 60);13.子查询(作为一张表)
SELECT 列名 FROM (自查询的结果集)WHERE 条件;
# 查询表中工资排名前五的员工信息 SELECT employee_id,first_name,salary FROM(SELECT employee_id,first_name,salary FROM t_employees ORDER BY CAST(salary AS SIGNED) DESC) AS temp LIMIT 0,5;注:子查询是一张临时表时,要为其赋予一张临时表名
14.合并查询
SELECT * FROM 表名1 UNION SELECT * FROM 表名2 SELECT * FROM 表名1 UNION ALL SELECT * FROM 表名2
合并两张表的结果并且去除重复记录:
SELECT * FROM sheet1 UNION SELECT * FROM sheet2;合并两张表的结果保留重复记录:
SELECT * FROM sheet1 UNION ALL SELECT * FROM sheet2;15.表连接查询
SELECT 列名 FROM 表1 连接方式 表2 ON 连接条件
内连接查询(INNER JOIN):
# 内连接查询,共有19种jobs,分别与每一个人对应起来,等于给第一个表扩展了几列数据 SELECT * FROM t_employees INNER JOIN t_jobs ON t_employees.`JOB_ID` = t_jobs.`JOB_ID`;三表连接查询:
# 查询所有员工工号,部门名称,所在国家ID SELECT employee_id,t_employees.department_id,t_locations.location_id FROM t_employees INNER JOIN t_departments ON t_employees.department_id = t_departments.department_id INNER JOIN t_locations ON t_locations.location_id = t_departments.location_id;左外连接(LEFT JOIN ON):
# 查询所有员工信息,以及所对应的部门名称(没有部门的员工,部门以null填充) SELECT employee_id,first_name,salary,department_name FROM t_employees LEFT JOIN t_departments ON t_departments.department_id = t_employees.department_id;左外连接是以左表为主表,依次向右匹配,匹配到返回结果,匹配不到返回null值填充
右外连接(LEFT JOIN ON):
# 查询所有部门信息,以及此部门中所有员工信息(没有员工的部门,员工信息以null填充) SELECT employee_id,first_name,salary,department_name FROM t_employees RIGHT JOIN t_departments ON t_departments.department_id = t_employees.department_id;右外连接是以右表为主表,依次向左匹配,匹配到返回结果,匹配不到返回null值填充
1.新增(INSERT)
INSERT INTO 表名(列1,列2,列3……) VALUES(值1,值2,值3……)
添加一条信息:
# 新增 INSERT INTO t_jobs(job_id,job_title,min_salary,max_salary) VALUES('Python','Python_Programmer',10000,20000);2.修改(UPDATE)
UPDATE 表名 SET 列1=新值1,列2=新值2,……WHERE条件
# 修改编号为100的员工工资为25000 UPDATE t_employees SET salary = 25000 WHERE employee_id = '100';注:SET 后有多个列名=值,绝大多数情况下都要加WHERE条件,指定修改,否则为整表修改
3.删除(DELETE)
DELETE FROM 表名 WHERE 条件;
删除一条信息:
# 删除编号为135的员工 DELETE FROM t_employees WHERE employee_id = '135'; # 删除某条指定的员工信息 DELETE FROM t_employees WHERE first_name = 'Peter' AND last_name = 'Hall';注:删除时若不加 WHERE 条件,则删除的是整表信息
4.清空整表数据(TRUNCATE)
TRUNCATE TABLE 表名;
1.数据类型 MySQL 支持多种类型,大致可以分为三类:数值,日期 / 时间和字符串(字符)类型。 1.1 数值类型
int:4字节,大整数值double:8字节,双精度浮点数值double(M,D):8字节,双精度浮点数值,M表示长度,D表示小数位数DECIMAL(M,D):小数值1.2 日期类型
DATE:YYYY-MM-DD,日期值DATETIME:YYYY-MM-DD HH:MM:SS,日期和时间值1.3 字符串类型
CHAR:定长字符串 char(10) 10个字符VARCHAR:变长字符串 varchar(10) 10个字符BLOB(binary large object):二进制形式的长文本数据TEXT:长文本数据2.数据表的创建(CREATE)
CREATE TABLE 表名( 列名 数据类型 约束, 列名 数据类型 约束, …… 列名 数据类型 约束 (最后一列的末尾不加逗号) )charset=utf8 (可根据需要指定表的字符集编码)
# 创建一张表 ``规避关键字冲突 CREATE TABLE `subject`( subjectId INT, subjectName VARCHAR(20), subjectHours INT )CHARSET = utf8; SELECT * FROM `subject`; # 插入数据 INSERT INTO `subject`(subjectId,subjectName,subjectHours) VALUES(001,'Math',24);查看该表: 3.数据表的修改(ALTER)
ALTER TABLE 表名 操作;
3.1 向现有表中添加列
# 向上面subject表中添加一列数据 ALTER TABLE `subject` ADD gradeId INT;3.2 修改表中的列
# 修改表中课程长度为10个字符 ALTER TABLE `subject` MODIFY subjectName VARCGAR(10);注:修改表中的某列时,也要写全列的名字,数据类型,约束
3.3 删除表中的列
# 删除表中gradeId列 ALTER TABLE `subject` DROP gradeId;注:删除列时,一次只能删除一列
3.4 修改列名
# 修改表中subjectHours 为classHours ALTER TABLE `subject` CHANGE subjectHours classHours INT;注:修改列名时,在给定列新名称时,要指定列的类型和约束
3.5 修改表名
修改上面`subject`表的名字为sub ALTER TABLE `subject` TO sub;4.数据表的删除(DROP)
DROP TABLE 表名;
DROP TABLE sub;1.实体完整性约束
表中的一行数据代表一个实体(entity),实体完整性的作用即是标识每一行数据不重复、实体唯一。
1.1 主键约束
PRIMARY KEY 唯一,标识表中的一行数据,此列的值不可重复,且不能为null
# 给foodId添加主键约束 CREATE TABLE food( foodId INT PRIMARY KEY, foodKind VARCHAR(20), foodPrice INT )CHARSET = utf8; SELECT * FROM food; INSERT INTO food(foodId,foodKind,foodPrice) VALUES(1,'noodle',7); INSERT INTO food(foodId,foodKind,foodPrice) VALUES(1,'rice',6); # 报错,主键1已经存在。1.2 唯一约束
UNIQUE 唯一,标识表中的一行数据,不可重复,可以为NULL
# 食物种类唯一 CREATE TABLE food( foodId INT PRIMARY KEY, foodKind VARCHAR(20) UNIQUE, foodPrice INT )CHARSET = utf8;1.3 自动增长列
AUTO_INCREMENT 编号自动增长
# 自动增长列,使主键编号自动增长 CREATE TABLE food( foodId INT PRIMARY KEY AUTO_INCREMENT, foodKind VARCHAR(20) UNIQUE, foodPrice INT )CHARSET=utf8; INSERT INTO food(foodKind,foodPrice) VALUES('noodle',7); INSERT INTO food(foodKind,foodPrice) VALUES('rice',7); INSERT INTO food(foodKind,foodPrice) VALUES('jiaozi',7);2.域完整性约束 2.1 非空约束
NOT NULL 非空,此列必须有值
# 设置食物种类不能为空 CREATE TABLE food( foodId INT PRIMARY KEY AUTO_INCREMENT, foodKind VARCHAR(20) UNIQUE NOT NULL, foodPrice INT )CHARSET=utf8;2.2 默认值约束
default 值 为列赋予默认值,当新增数据不指定值时,书写default,以指定的默认值进行填充。
# 没有指出价钱时,默认值10填充 CREATE TABLE food( foodId INT PRIMARY KEY AUTO_INCREMENT, foodKind VARCHAR(20) UNIQUE NOT NULL, foodPrice INT DEFAULT 10 )CHARSET=utf8; INSERT INTO food(foodId,foodKind) VALUES(1,'noodle');2.3 引用完整性约束
语法:CONSTRAINT 引用名 FOREIGN KEY (列名) REFERENCE 被引用表名 (列名) FOREIGN KEY 引用外部表某个列的值
# 创建专业表 CREATE TABLE Speciality( id INT PRIMARY KEY AUTO_INCREMENT, SpecialName VARCHAR(20) UNIQUE NOT NULL )CHARSET=utf8; INSERT INTO Speciality(SpecialName) VALUES('Java'); INSERT INTO Speciality(SpecialName) VALUES('C'); SELECT * FROM Speciality; # 创建科目表 CREATE TABLE `subject`( subjectId INT PRIMARY KEY AUTO_INCREMENT, subjectName VARCHAR(20) UNIQUE NOT NULL, specialId INT NOT NULL, CONSTRAINT fk_subject_specialId FOREIGN KEY(specialId) REFERENCES Speciality(id) )CHARSET=utf8; INSERT INTO `subject`(subjectName,specialId) VALUES('JavaSE',1); INSERT INTO `subject`(subjectName,specialId) VALUES('C-Pointer',2); SELECT * FROM `subject`;执行以上代码,可以看到:
相当于给这两门课程都指明了所属的专业,JavaSE属于Java。
1.模拟转账
实际中的转账是转账方账户扣钱,收账方账户加钱,我们用数据库来模拟现实转账
创建这样一个表,模拟两个人的账户: 1.1 模拟转账
UPDATE ACCOUNT SET money = money - 1000 WHERE id = 1; UPDATE ACCOUNT SET money = money + 1000 WHERE id = 2;转账时可能出现错误,导致在第一行减钱操作成功了,但第二行加钱却没有成功。 2.事务的概念
事务是一个原子操作,是一个最小执行单元,可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败时,整个事务都执行失败。
3.事务的边界
开始: 连接到数据库,执行一条DML语句,上一个事物结束后,又输入一条DML语句,即事务的开始。 结束:
提交:commit回滚:rollback4.事务的原理
数据库会为每一个客户端都维护一个空间独立的缓存区(回滚段),一个事务中所有的增删改查语句执行结果都会缓存在回滚段中,只有当事务中所有SQL语句都正常结束(commit),才会将回滚段中的数据同步到数据库,否则无论因为哪种原因失败,整个事务都将回滚(rollback)。
5.事务的特性
Atomicity(原子性) 表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败Consistency(一致性) 表示一个事务内有一个操作失败时,所有更改过的数据必须回滚到修改前状态Isolation(隔离性) 事务查看数据操作时数据所处的状态,要么是另一并发事务修改它为之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。Durability(持久性) 持久性事务完成之后,它对于系统的影响是永久性的6.事务应用
# 1 开启事务 START TRANSACTION; # 2 事务内数据操作语句 UPDATE ACCOUNT SET money = money - 100 WHERE id = 1; UPDATE ACCOUNT SET money = money + 100 WHERE id = 2; # 3 事务内语句都成功了,执行 COMMIT COMMIT; # 4 事务内如果出现错误,执行 ROLLBACK ROLLBACK;执行上述代码时,只执行id=1的减钱的操作,id=2不操作,查表,可以看到id=1的钱少了100,再执行rollback,查表,可以看到id=1的钱又回来了。这样就大致的模拟了当转账过程中出现错误导致没有加钱的情况。
1.创建用户
CREATE USER 用户名 IDENTIFIED BY 密码
# 创建一个 zhangsan 用户 CREATE USER `zhangsan` IDENTIFIED BY `123`;2.授权
GRAND ALL ON 数据库.表 TO 用户名;
# 将 companyDB 下的所有权限表都赋给zhangsan GRANT ALL ON companydb* TO zhangsan;3.撤销权限
REVOKE ALL ON 数据库.表名 FROM 用户名;
# 将zhangsan的 companyDB 下的所有权限撤销 REVOKE ALL ON companydb.* FROM zhangsan;4.删除用户
DROP USER 用户名
# 删除用户张三 DROP USER `zhangsan`;1.概念
视图,虚拟表,从一个或多个表中查询出来的表,作用和真实表一样,包含一系列带有行和列的数据。视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记录。
2.视图的创建
语法:CREATE VIEW 视图名 AS 查询数据源表语句;
# 创建t_empInfo视图,其视图从t_employees表中查询出员工编号,员工姓名,员工邮箱,工资 CREATE VIEW t_empInfo AS SELECT employee_id,first_name,email,salary FROM t_employees; SELECT * FROM t_empInfo;3.视图的修改
方法一:CREATE OR REPLACE VIEW 视图名 AS 查询语句 方法二:ALTER VIEW 视图名 AS 查询语句
# 方式1:如果视图存在则进行修改,反之,进行创建 CREATE OR REPLACE VIEW t_empInfo AS SELECT employee_id,first_name,email,salary FROM t_employees; # 方式2:直接对已经存在的视图进行修改 ALTER VIEW t_empInfo AS SELECT employee_id,first_name,email,salary FROM t_employees;4.视图的删除
DROP VIEW 视图名
# 删除t_empInfo视图 DROP VIEW t_empInfo;注:删除视图不会影响原表
我是快斗,请多多指教!