mysql基础操作(2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lv_yishi/article/details/79051315

– 1、创建day16数据库:
mysql> create database day16
-> default character set utf8;
Query OK, 1 row affected (0.00 sec)

– 2、查看书否创建成功:
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| day15 |
| day16 |
| day28 |
| mybse |
| mysql |
| performance_schema |
| test |
+——————–+

3 、数据约束
—- 3.1 默认值:数据库默认值:DEFAULT
作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值。
注意:
1)对默认值字段插入null是可以的。
2)对默认值字段可以插入非null

1):新建数据表student—>插入数据—>显示
– 当字段没有插入值的时候,mysql自动给改字段分配默认值
CREATE TABLE student(
id INT,
NAME VARCHAR(20),
address VARCHAR(20)
)
INSERT INTO student(id,NAME) VALUES(1,’张三’);
SELECT * FROM student;
显示:
id NAME address
1 张三 null —默认值是:null

2):更改默认值:删除表—>重新建表添加默认值—>插入数据—>显示
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE student(
id INT,
NAME VARCHAR(20),
address VARCHAR(20) DEFAULT ‘广州天河’ – 默认值
)
INSERT INTO student(id,NAME) VALUES(1,’张三’);
SELECT * FROM student;
显示:
id NAME address
1 张三 广州天河 – 默认值,广州天河

3):插入null值得时候
– 默认的字段允许为null
INSERT INTO student(id,NAME,address) VALUE(2,’李四’,NULL);
SELECT * FROM student;
显示:
id NAME address
1 张三 广州天河
2 李四 null

4):当插入正常的值:
– 插入正常值时候就是用插入的值
INSERT INTO student(id,NAME,address) VALUE(3,’王五’,’广州番禺’);
SELECT * FROM student;
显示:
id NAME address
1 张三 广州天河
2 李四 null
3 王五 广州番禺

—- 3.2 非空:NOT NULL
作用: 限制字段必须赋值
注意:
1)非空字符必须赋值
2)非空字符不能赋null

需求: gender字段必须有值(不为null)
1):删除表—>创建非空约束表student—->测试address为null和为空
DROP TABLE student;
CREATE TABLE student(
id INT,
NAME VARCHAR(20),
gender VARCHAR(2) NOT NULL – 非空
)
mysql> INSERT INTO student(id,NAME,gender) VALUE(2,’lisi’,NULL);
ERROR 1048 (23000): Column ‘gender’ cannot be null
mysql> INSERT INTO student(id,NAME) VALUE(2,’lisi’);
ERROR 1364 (HY000): Field ‘gender’ doesn’t have a default value

—- 3.3 唯一 UNIQUE
作用: 对字段的值不能重复
注意:
1)唯一字段可以插入null
2)唯一字段可以插入多个null

以前插入的时候id可以是相同的值,现在使用UNIQUE约束id值唯一
1):删除表–>创建唯一约束表–>输入值测试—>显示
DROP TABLE student;
CREATE TABLE student(
id INT UNIQUE, – 唯一
NAME VARCHAR(20)
)
mysql> insert into student(id,name) values(1,’zs’);
Query OK, 1 row affected (0.01 sec)

mysql> select * from student;
+——+——+
| id | NAME |
+——+——+
| 1 | zs |
+——+——+
mysql> insert into student(id,name) values(1,’lisi’); – 再次插入
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘id’ –(重复输入’ 1 ‘键’ id ‘)

mysql> insert into student(id,name) values(2,’lisi’); – 插入正常值
Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+——+——+
| id | NAME |
+——+——+
| 1 | zs |
| 2 | lisi |
+——+——+

mysql> insert into student(name) values(‘zs’); – 不插入id值
Query OK, 1 row affected (0.01 sec)

mysql> select * from student;
+——+——+
| id | NAME |
+——+——+
| 1 | zs |
| 2 | lisi |
| NULL | zs |
+——+——+

mysql> insert into student(name) values(‘zs’); – 再次id不插入值
Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+——+——+
| id | NAME |
+——+——+
| 1 | zs |
| 2 | lisi |
| NULL | zs |
| NULL | zs |
+——+——+

mysql> insert into student(id,name) values(null,’lisi’); – 插入id为null值
Query OK, 1 row affected (0.01 sec)

mysql> select * from student;
+——+——+
| id | NAME |
+——+——+
| 1 | zs |
| 2 | lisi |
| NULL | zs |
| NULL | zs |
| NULL | lisi |
+——+——+

—- 3.4 主键(非空+唯一)
作用: 非空+唯一
注意:
1)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。
2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的id字段。
1):删除表–>创建主键约束表–>输入值测试—>显示
DROP TABLE student;

CREATE TABLE student(
id INT PRIMARY KEY, – 主键
NAME VARCHAR(20)
)
INSERT INTO student(id,NAME) VALUES(1,’张三’);
– INSERT INTO student(id,NAME) VALUES(1,’李四’); – 违反唯一约束: Duplicate entry ‘1’ for key ‘PRIMARY’
– insert into student(name) value(‘李四’); – 违反非空约束: ERROR 1048 (23000): Column ‘id’ cannot be null

—- 3.5 自增长 AUTO_INCREMENT
1):删除表–>创建自增长约束表–>输入值测试—>显示
CREATE TABLE student(
id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT, – 自增长,从0开始 ZEROFILL 零填充(限定int(4)四位数字,不够的0自动填充)
NAME VARCHAR(20)
)
INSERT INTO student(NAME) VALUES(‘张三’);
INSERT INTO student(NAME) VALUES(‘李四’);
INSERT INTO student(NAME) VALUES(‘王五’);
SELECT * FROM student;
显示:
id NAME
0001 张三
0002 李四
0003 王五

– 不能影响自增长约束
DELETE FROM student;
– 可以影响自增长约束
TRUNCATE TABLE student;

—- 3.6 外键 PRIMARY KEY
作用:约束两种表的数据
出现两种表的情况:
解决数据冗余高问题: 独立出一张表
例如: 员工表 和 部门表
1):创建员工表—->输入表的信息—->显示
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptName VARCHAR(20) – 部门名称
)
INSERT INTO employee VALUES(1,’张三’,’软件开发部’);
INSERT INTO employee VALUES(2,’李四’,’软件开发部’);
INSERT INTO employee VALUES(3,’王五’,’应用维护部’);
SELECT * FROM employee
显示:
id empName deptName
1 张三 软件开发部
2 李四 软件开发部
3 王五 应用维护部

问题:现在添加员工的时候部门名称数据冗余高,显得臃肿麻烦
1、 解决数据冗余高的问题:给冗余的字段放到一张独立表中
2、 独立设计一张部门表
2):设计一个部门表—->删除员工表—>给部门表添加信息—>显示—>使用外键关联部门表—>添加信息—>显示
– 部门表(主表)—约束别的表/被参考的表
CREATE TABLE dept(
id INT PRIMARY KEY,
deptName VARCHAR(20)
)
– 修改员工表(副表/从表)—被约束的表
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,– 把部门名称改为部门ID
– 声明一个外键约束
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
– 外键名称 外键 参考表(参考字段)
)
INSERT INTO dept(id,deptName) VALUES(1,’软件开发部’);
INSERT INTO dept(id,deptName) VALUES(2,’应用维护部’);
INSERT INTO dept(id,deptName) VALUES(3,’秘书部’);
SELECT * FROM dept
显示:
id deptName
1 软件开发部
2 应用维护部
3 秘书部

CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,– 把部门名称改为部门ID
– 声明一个外键约束
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
– 外键名称 外键 参考表(参考字段)
)
INSERT INTO employee VALUES(1,’张三’,1);
INSERT INTO employee VALUES(2,’李四’,1);
INSERT INTO employee VALUES(3,’王五’,2);
INSERT INTO employee VALUES(4,’陈六’,3);
SELECT * FROM employee
显示:
id empName deptId
1 张三 1
2 李四 1
3 王五 2
4 陈六 3

3):添加一个不存在的部门—>显示
INSERT INTO employee VALUES(5,’陈六’,4);
– 违反外键约束: Cannot add or update a child row: a foreign key constraint fails (day16.employee, CONSTRAINT emlyee_dept_fk FOREIGN KEY (deptId) REFERENCES dept (id))
该记录业务上不合法,员工插入了一个不存在的部门数据

注意:
1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!
2)主表的参考字段通用为主键!
3)添加数据: 先添加主表,再添加副表
4)修改数据: 先修改副表,再修改主表
5)删除数据: 先删除副表,再删除主表

—- 3.7 级联操作
问题: 当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!
但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!
级联修改: ON UPDATE CASCADE
级联删除: ON DELETE CASCADE

1):删除员工表—>新建一个使用外键和级联修改,级联删除的员工表—>添加员工信息—>测试—>显示
DROP TABLE employee
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,– 把部门名称改为部门ID
– 声明一个外键约束
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE – ON CASCADE UPDATE :级联修改
– 外键名称 外键 参考表(参考字段)
)
INSERT INTO employee VALUES(1,’张三’,1);
INSERT INTO employee VALUES(2,’李四’,1);
INSERT INTO employee VALUES(3,’王五’,2);
INSERT INTO employee VALUES(4,’陈六’,3);
SELECT * FROM employee
显示:
id empName deptId
1 张三 1
2 李四 1
3 王五 2
4 陈六 3

— 1、显示部门表的信息:
SELECT * FROM dept
id deptName
1 软件开发部
2 应用维护部
3 秘书部

— 2、删除部门表中的id=3–>并显示部门信息和员工的信息
DELETE FROM dept WHERE id=3
SELECT * FROM dept
id deptName
1 软件开发部
2 应用维护部
SELECT * FROM employee
id empName deptId
1 张三 1
2 李四 1
3 王五 2
所以:删除部门id=3的时候陈六信息自动删除

2):修改部门信息是员工信息直接自动实现修改
UPDATE dept SET id=4 WHERE id=2;
SELECT * FROM dept
id deptName
1 软件开发部
4 应用维护部
SELECT * FROM employee
id empName deptId
1 张三 1
2 李四 1
3 王五 4
所以:修改部门id=2变成id=4的时候,王五的deptId自动变成4

二、关联查询(多表查询)—-
– 需求:查询员工及其所在部门(显示员工姓名,部门名称)
– 2.1 交叉连接查询(不推荐。产生笛卡尔乘积现象:4 * 4=16,有些是重复记录)
SELECT empName,deptName FROM employee,dept;

– 需求:查询员工及其所在部门(显示员工姓名,部门名称)
– 多表查询规则:1)确定查询哪些表 2)确定哪些哪些字段 3)表与表之间连接条件 (规律:连接条件数量是表数量-1)
– 2.2 内连接查询:只有满足条件的结果才会显示(使用最频繁)
SELECT empName,deptName – 2)确定哪些哪些字段
FROM employee,dept – 1)确定查询哪些表
WHERE employee.deptId=dept.id – 3)表与表之间连接条件

– 内连接的另一种语法
SELECT empName,deptName
FROM employee
INNER JOIN dept
ON employee.deptId=dept.id;

– 使用别名
SELECT e.empName,d.deptName
FROM employee e
INNER JOIN dept d
ON e.deptId=d.id

– 使用别名1:
SELECT e.empName,d.deptName
FROM employee AS e
INNER JOIN dept AS d
ON e.deptId=d.id;

– 使用别名2: AD可以不写
SELECT e.empName,d.deptName
FROM employee e
INNER JOIN dept d
ON e.deptId=d.id;
显示:
empName deptName
张三 软件开发部
李四 软件开发部
王五 应用维护部
陈六 秘书部

– 需求: 查询每个部门的员工
– 预期结果:
– 软件开发部 张三
– 软件开发部 李四
– 应用维护部 王五
– 秘书部 陈六
– 总经办 null
– 2.2 左[外]连接查询: 使用左边表的数据去匹配右边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
– (注意: 左外连接:左表的数据一定会完成显示!) ——- 先查询那个表就是左表
SELECT d.deptName,e.empName
FROM dept d
LEFT OUTER JOIN employee e
ON d.id=e.deptId;

– 2.3 右[外]连接查询: 使用右边表的数据去匹配左边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
– (注意: 右外连接:右表的数据一定会完成显示!)
SELECT e.empName,d.deptName
FROM employee e
RIGHT OUTER JOIN dept d
ON d.id=e.deptId;
– 但是写的时候还是以下面的形式写看起来整洁
SELECT d.deptName,e.empName
FROM employee e
RIGHT OUTER JOIN dept d
ON d.id=e.deptId;
显示:
deptName empName
软件开发部 张三
软件开发部 李四
应用维护部 王五
秘书部 陈六
总经办 null

– 2.4 自连接查询
– 需求:查询员工及其上司
– 预期结果:
– 张三 null
– 李四 张三
– 王五 李四
– 陈六 王五

– 添加上司ID
ALTER TABLE employee ADD bossId INT;
UPDATE employee SET bossId=1 WHERE id=2;
UPDATE employee SET bossId=2 WHERE id=3;
UPDATE employee SET bossId=3 WHERE id=4;
显示: SELECT id ,empName, deptId ,bossid FROM employee
1 张三 1 null
2 李四 1 1
3 王五 2 2
4 陈六 3 3

SELECT e.empName,b.empName
FROM employee e
LEFT OUTER JOIN employee b
ON e.bossId=b.id;
– 或者是:
SELECT b.empName AS ‘老板’,e.empName AS ‘员工’
FROM employee e
LEFT OUTER JOIN employee b
ON e.bossId=b.id;
显示:
老板 员工
null 张三
张三 李四
李四 王五
王五 陈六

注释:相当于两张一摸一样的表,使用左外链接查询,先显示左表,就是employee e里面的所有的empName
(所有的员工)再查相对应的老板名字

存储过程
5.1 什么是存储过程
存储过程,带有逻辑的sql语句
之前的sql没有条件判断,没有循环
存储过程带上流程控制语句(if while)
5.2 存储过程特点
1)执行效率非常快!存储过程是在数据库的服务器端执行的!!!
2)移植性很差!不同数据库的存储过程是不能移植。

****三、存储过程*********-

这里写图片描述

– 执行存储过程
CALL pro_test(); – CALL 存储过程名称(参数);

显示:
id empName deptId bossId
1 张三 1 null
2 李四 1 1
3 王五 2 2
4 陈六 3 3

– 3.1 带有输入参数的存储过程
参数:
IN: 表示输入参数,可以携带数据带存储过程中
OUT: 表示输出参数,可以从存储过程中返回结果
INOUT: 表示输入输出参数,既可以输入功能,也可以输出功能

这里写图片描述

– 调用
CALL pro_findById(6);
显示:
mysql> CALL pro_findById(6);
+—-+———+——–+——–+
| id | empName | deptId | bossId |
+—-+———+——–+——–+
| 6 | 李七 | 1 | NULL |
+—-+———+——–+——–+

mysql的变量***
– 删除存储过程
DROP PROCEDURE pro_testOut;
– 全局变量(内置变量):mysql数据库内置的变量 (所有连接都起作用)
– 查看所有全局变量: show variables
– 查看某个全局变量: select @@变量名
– 修改全局变量: set 变量名=新值
– character_set_client: mysql服务器的接收数据的编码(写入的时候)
– character_set_results:mysql服务器输出数据的编码
使用客户端(小黑窗口)里面当前页面输入的类型是GBK(默认的格式),但是服务器(数据库)接收utf8的形式
当插入数据的时候回报错,现在改数据库接受的编码:

– 修改全局变量: set 变量名=新值
set character_set_client=gbk;
– 再次插入
mysql> INSERT INTO employee(id,empName,deptId) VALUES(6,’李七’,1);
Query OK, 1 row affected (0.01 sec) – 再次输出成功

现在输出的是以utf8的形式,但是解码还是gbk的格式,输出的编码还是乱码,现在改变输出的编码格式,再次的输出
mysql> set character_set_results=gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from employee;
+—-+———+——–+——–+
| id | empName | deptId | bossId |
+—-+———+——–+——–+
| 1 | 张三 | 1 | NULL |
| 2 | 李四 | 1 | 1 |
| 3 | 王五 | 2 | 2 |
| 4 | 陈六 | 3 | 3 |
| 6 | 李七 | 1 | NULL |
+—-+———+——–+——–+

查询某个全局变量:
mysql> select @@character_set_client;
+————————+
| @@character_set_client |
+————————+
| gbk |
+————————+

– 会话变量: 只存在于当前客户端与数据库服务器端的一次连接当中。如果连接断开,那么会话变量全部丢失!
– 定义会话变量: set @变量=值
– 查看会话变量: select @变量

mysql> SET @name=’eric’; – 创建会话变量
Query OK, 0 rows affected (0.00 sec)

mysql> select @name; – 查看会话变量
+——-+
| @name |
+——-+
| eric |
+——-+
(注:在黑窗口和SQLyog两个客户端之间不可以共同的使用在哪个上面创建就在哪个里面使用,另一个使用不了)

– 局部变量: 在存储过程中使用的变量就叫局部变量。只要存储过程执行完毕,局部变量就丢失!!

– 3.2 带有输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20)) – OUT:

输出参数
BEGIN

– 给参数赋值

SET str=’helljava’;
END $

– 1)定义一个会话变量name, 2)使用name会话变量接收存储过程的返回值 , 3)再输出@name
mysql> CALL pro_testOut(@name); – 相当于set @name=返回来的一个参数;
Query OK, 0 rows affected (0.00 sec)

mysql> select @name;
+———-+
| @name |
+———-+
| helljava |
+———-+

– 3.3 带有输入输出参数的存储过程
DELIMITER C R E A T E P R O C E D U R E p r o t e s t I n O u t ( I N O U T n I N T ) I N O U T B E G I N S E L E C T n ; S E T n = 500 ; E N D

– 调用
mysql> set @n=10; – 输入参数
Query OK, 0 rows affected (0.00 sec)

mysql> call pro_testInOut(@n); – 输入参数,但是同时调用了里面的输出局部的变量
+——+
| n |
+——+
| 10 |
+——+
Query OK, 0 rows affected (0.00 sec)

mysql> select @n; – 输出返回的参数
+——+
| @n |
+——+
| 500 |
+——+

– 3.4 带有条件判断的存储过程
– 需求:输入一个整数,如果1,则返回“星期一”,如果2,返回“星期二”,如果3,返回“星期三”。其他数字,返回“错误输入”;
DELIMITER C R E A T E P R O C E D U R E p r o t e s t I f ( I N n u m I N T , O U T s t r V A R C H A R ( 20 ) ) B E G I N I F n u m = 1 T H E N S E T s t r = ; E L S E I F n u m = 2 T H E N S E T s t r = ; E L S E I F n u m = 3 T H E N S E T s t r = ; E L S E S E T s t r = ; E N D I F ; E N D

mysql> call pro_testIf(1,@str);
Query OK, 0 rows affected (0.00 sec)

mysql> select @str;
+——–+
| @str |
+——–+
| 星期一 |
+——–+

– 3.5 带有循环功能的存储过程
– 需求: 输入一个整数,求和。例如,输入100,统计1-100的和
DELIMITER C R E A T E P R O C E D U R E p r o t e s t W h i l e ( I N n u m I N T , O U T r e s u l t I N T ) B E G I N D E C L A R E i I N T D E F A U L T 1 ; D E C L A R E d e f a u l t D E C L A R E v s u m I N T D E F A U L T 0 ; W H I L E i <= n u m D O S E T v s u m = v s u m + i ; S E T i = i + 1 ; i + + E N D W H I L E ; S E T r e s u l t = v s u m ; E N D

mysql> CALL pro_testWhile(100,@result);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @result;
+———+
| @result |
+———+
| 5050 |
+———+

– 3.6 使用查询的结果赋值给变量(INTO)
DELIMITER C R E A T E P R O C E D U R E p r o f i n d B y I d 2 ( I N e i d I N T , O U T v n a m e V A R C H A R ( 20 ) ) B E G I N S E L E C T e m p N a m e I N T O v n a m e F R O M e m p l o y e e W H E R E i d = e i d ; E N D

CALL pro_findById2(1,@name);
SELECT @name;
显示:
@name
张三

– 练习: 编写一个存储过程
如果学生的英语平均分小于等于70分,则输出’一般’
如果学生的英语平均分大于70分,且小于等于90分,则输出‘良好’
如果学生的英语平均分大于90分,则输出‘优秀’

DELIMITER C R E A T E P R O C E D U R E p r o t e s t A v g ( O U T s t r V A R C H A R ( 20 ) ) B E G I N D E C L A R E s a v g D O U B L E ; S E L E C T A V G ( e n g l i s h ) I N T O s a v g F R O M s t u d e n t 2 ; I F s a v g <= 70 T H E N S E T s t r = ; E L S E I F s a v g > 70 A N D s a v g <= 90 T H E N S E T s t r = ; E L S E S E T s t r = ; E N D I F ; E N D

CALL pro_testAvg(@str);

SELECT @str;

6.1 触发器作用
当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成!!

例如: 当向员工表插入一条记录时,希望同时往日志表插入数据

– 需求: 当向员工表插入一条记录时,希望mysql自动同时往日志表插入数据
– 创建日志表
CREATE TABLE test_log(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(100)
)
– 创建触发器(添加)
CREATE TRIGGER tri_empAdd AFTER INSERT ON employee FOR EACH ROW – 当往员工表插入一条记录时
INSERT INTO test_log(content) VALUES(‘员工表插入了一条记录’);

– 插入数据
INSERT INTO employee(id,empName,deptId) VALUES(7,’扎古斯’,1);

mysql> SELECT * FROM test_log; – 显示入职表自动插入的信息
+—-+——————–+
| id | content |
+—-+——————–+
| 1 | 员工插入了一条记录
+—-+——————–+

– 创建触发器(修改)
CREATE TRIGGER tri_empUpd AFTER UPDATE ON employee FOR EACH ROW – 当往员工表修改一条记录时
INSERT INTO test_log(content) VALUES(‘员工表修改了一条记录’);

– 修改
UPDATE employee SET empName=’eric’ WHERE id=7;
mysql> SELECT * FROM test_log;
+—-+———————-+
| id | content |
+—-+———————-+
| 1 | 员工插入了一条记录
| 2 | 员工表修改了一条记录
+—-+———————-+

– 创建触发器(删除)
CREATE TRIGGER tri_empDel AFTER DELETE ON employee FOR EACH ROW – 当往员工表删除一条记录时
INSERT INTO test_log(content) VALUES(‘员工表删除了一条记录’);

– 删除
DELETE FROM employee WHERE id=7;
mysql> SELECT * FROM test_log;
+—-+———————-+
| id | content |
+—-+———————-+
| 1 | 员工插入了一条记录
| 2 | 员工表修改了一条记录
| 3 | 员工表删除了一条记录
+—-+———————-+

五、mysql权限问题
– mysql数据库权限问题:root :拥有所有权限(可以干任何事情)
– 权限账户,只拥有部分权限(CURD)例如,只能操作某个数据库的某张表
– 如何修改mysql的用户密码?
– password: md5加密函数(单向加密)
SELECT PASSWORD(‘root’); – *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

– mysql数据库,用户配置信息在 : user表
USE mysql;

SELECT * FROM USER;
– 修改密码 – 里面密码存储的格式是md5格式,要经过加密成md5格式再进行修改
UPDATE USER SET PASSWORD=PASSWORD(‘123456’) WHERE USER=’root’;

– 分配权限账户
GRANT SELECT ON day16.employee TO ‘eric’@’localhost’ IDENTIFIED BY ‘123456’;
GRANT DELETE ON day16.employee TO ‘eric’@’localhost’ IDENTIFIED BY ‘123456’; – 追加权限
– 后面再追加权限就一直的写入权限增加

– 删除创建的账户(必须进入到use mysql里面才可以删除)
DELETE FROM USER WHERE USER=’eric’;

(注:当服务器关闭再次的打开的时候,删除的账户才会消失)

GRANT 权限 ON 数据库.表 TO ‘账户名’@’账户类型’ IDENTIFIED BY ‘密码’;
举例:
权限: select insert delete update drop create/ 或,all

备份
mysqldump -uroot -p day17 > c:/bak.sql
恢复
mysql -uroot -p day17 < d:/back.sql

1)将数据库表day16备份到硬盘里面:
C:\Users\Administrator>mysqldump -u root -p day16 > d:/day16.sql
Enter password: *
2)删除day16 –> 创建新的空表 – >关闭数据库
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| day15 |
| day16 |
| day28 |
| mybse |
| mysql |
| performance_schema |
| test |
+——————–+
8 rows in set (0.00 sec)

mysql> drop database day16;
Query OK, 4 rows affected (0.01 sec)

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| day15 |
| day28 |
| mybse |
| mysql |
| performance_schema |
| test |
+——————–+
7 rows in set (0.00 sec)

mysql> create database day16;
Query OK, 1 row affected (0.00 sec)

mysql> exit;
Bye

3)将备份的表添加数据库里面 –> 并查看是否备份成功
C:\Users\Administrator>mysql -u root -p day16 < d:/day16.sql
Enter password: *

C:\Users\Administrator>mysql -u root -p
Enter password: *

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| day15 |
| day16 |
| day28 |
| mybse |
| mysql |
| performance_schema |
| test |
+——————–+

mysql> use day16;
Database changed
mysql> show tables;
+—————–+
| Tables_in_day16 |
+—————–+
| dept |
| employee |
| student |
| test_log |
+—————–+
4 rows in set (0.00 sec)

sql语法:inner join on, left join on, right join on详细使用方法:
https://www.cnblogs.com/fozero/p/6129537.html

猜你喜欢

转载自blog.csdn.net/lv_yishi/article/details/79051315