mysql基础知识
#:代表单行注释(对代码的解释性文字说明,它不会被运行)
-- :也是单行注释
/*
这是
多行注释
*/
执行的时候:选中要执行的语句,按F9,或点击工具栏的 三角按钮
“;”分号代表一行语句的结束
show databases展示全部数据库;
下面我们创建一个数据库叫:testdb,create(创建),database(数据库)
DEFAULT CHARACTER SET:默认字符集;collate:字符排序
CREATE DATABASE testdb
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
删除数据库,慎用,DROP(丢弃,删除)
DROP DATABASE testdb;
接下来我们来创建一张表:person
USE testdb; 将当前数据库切换为testdb
接下来在testdb下创建一张表(TABLE):person(人)
CREATE TABLE person
(
id CHAR(18), #身份证号码
NAME VARCHAR(100),#VARCHAR variable char(可变字符)
sex CHAR(1), #性别
birthday DATE,
height FLOAT,
weight FLOAT,
age SMALLINT,
hometown CHAR(6) #家乡的邮编
)ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;
创建一张家乡表(hometown)
DEFAULT:默认
CREATE TABLE testdb.hometown
(
id CHAR(6) PRIMARY KEY,
city VARCHAR(100) DEFAULT '深圳' NOT NULL,
province VARCHAR(100) DEFAULT '广东'
)ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;
删除表
DROP TABLE testdb.`hometown`;
#总结一下数据类型
1、数字类型:
tingInt, smallInt, mediunInt, Int, bigInt:整数
float,double,decimal:带小数的数字
float(4,1):允许输入整数部分3位,小数部分1位的数据
float,double:不允许用来存储金额,必须使用decimal
2、字符类型:
char:最大长度取值0~255,
char(10):该字段最多存10个字符,不足10个也占用10个存储空间
varchar:最大长度取值0~65535
varchar(100):该字段最多存100个字符,不足100个按实际个数计算存储空间
如果一种数据是固定长度的,如:邮编,则采用char,否则使用varchar
3、日期:date,time,datetime,year
4、混合型:enum:枚举型,只能单选
set:可以多选
表的约束
1、非空约束:NOT NULL ,NULL(空):意思是说某个字段不允许不填数据
下面将person表的name字段设置为非空,ALTER(修改)
ALTER TABLE testdb.person
CHANGE `NAME` `NAME` VARCHAR(100) NOT NULL;
NULL:空, "":空字符串, " "空格的区别
往person表中插入这三个数据试一试,insert:插入
规则:字符数据、日期数据需要用引号引起来,数字则不需要
INSERT INTO testdb.`person`(id,NAME,age)
VALUES('430103198809023456',NULL,34); #错误,name不能插入NULL设置了非空约束
INSERT INTO testdb.`person`(id,NAME,age)
VALUES('430103198809023457','',34); #空字符串插入成功
INSERT INTO testdb.`person`(id,NAME,age)
VALUES('430103198809023458',' ',34); #空格插入成功
#插入一个“张三”
INSERT INTO testdb.`person`(id,NAME,age)
VALUES('430103198809023459','张三',34); #张三插入成功
2、主键(primary key, PK):
1.主键一定是唯一的行标识,即每行的主键都不会重复
2.主键是不允许为空
3.主键可以是一个或多个字段
4.通常情况下,关系型数据库中每张表都会有主键
将person表的id字段设置为主键
ALTER TABLE `testdb`.`person`
CHANGE `id` `id` CHAR(18) NOT NULL,
ADD PRIMARY KEY (`id`);
下面在age后面增加一个字段phone:手机号码
ALTER TABLE `testdb`.`person`
ADD COLUMN `phone` CHAR(11) NULL AFTER `age`;
3、唯一键约束(unique key:UK)
1.唯一键的字段数据允许为空
2.唯一键如果有数据那么必须保证每行都不相同,否则无法存储
3.唯一键也可以是一个或多个字段组成
下面将phone字段设置为唯一键
ALTER TABLE `testdb`.`person`
ADD UNIQUE INDEX `phone_uk` (`phone`);
4、外键约束(foreign key: FK)
1. 一张表的外键关联字段通常情况下关联的是另外一张表的主键
2. 一张表的外键关联字段必须填写外键主表中存在的数据
3. 外键关联表的数据被引用了之后,通常不允许删除,如果一定要删除:
1. CASCADE:级联删除整条引用的关联行数据
2. No Action:不允许修改或删除已被引用的父表数据
3. Restrict:同上
4. Set Null:将关联的数据字段值置空
4. 外键字段允许为空
5. 外键字段可以是一个或多个
将person表的hometown字段外键关联hometown表的id字段
CONSTRAINT:约束,REFERENCES:参考,CASCADE:级联
ALTER TABLE `testdb`.`person`
ADD CONSTRAINT `hometown_fk`
FOREIGN KEY (`hometown`) REFERENCES `testdb`.`hometown`(`id`)
ON DELETE CASCADE;
一次性创建Person表的语法 ,记住建表的语法
CREATE TABLE testdb.person2
(
ID CHAR(18) NOT NULL,
NAME VARCHAR(100) NOT NULL,
gender CHAR(1) DEFAULT 'F',
birthday DATE NOT NULL,
height FLOAT(4,1),
weight FLOAT(4,1),
hometown CHAR(6),
phone CHAR(11) UNIQUE,
PRIMARY KEY(id),
CONSTRAINT fk_hometown_id2 FOREIGN KEY (hometown) REFERENCES hometown(ID)
)ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;
主键采用整数+自增的形式
例如:ranzhi.product表,检查然之数据库所有表并操作一下
1、然之用的表引擎是myisam,不支持外部键
2、然之中几乎所有的表的主键都是一个整数型字段,
unsigned(无符号,意思是没有负数),并且支持自增
索引是什么:index
索引是按照某一个或者多个字段创建查询的目录表
以方便快速查找数据
索引可以大大提高查询速度,但是也会降低数据增删改的速度
请查询出员工表中的所有员工信息:*表示所有列
SELECT * FROM hrdb.`EMPLOYEES`;
请查询出员工ID=100的员工姓名和薪水
SELECT e.`employee_id`, #选择列
e.`first_name` 名,
e.`last_name` "姓",
e.`salary` AS 薪水
FROM hrdb.`employees` e #从哪张表,e是表的别名
WHERE e.`employee_id` = 100; #过滤行条件
请查询出薪水大于(>)10000的所有员工ID,姓名,薪水,入职日期
SELECT k.`employee_id`,k.`first_name`,k.`last_name`,
k.`salary`,k.`hire_date`
FROM hrdb.`employees` k
WHERE k.`salary`>10000;
where中字段和值之间的比较符号可以有:
等于:=, 不等于:<>, 大于:>,小于<,大于等于:>=,小于等于: <=
逻辑表达式符号:or(或者), and(并且,与),not(非),优先级是 非与或
括号的优先级最大
请查询出薪水在10000~12000(假设包含边界值)之间的员工所有信息
SELECT e.*
FROM hrdb.`employees` e
WHERE e.`salary`>=10000 AND e.`salary`<=12000;
用not写出上面的语句
SELECT e.*
FROM hrdb.`employees` e
WHERE NOT (e.`salary`<10000 OR e.`salary`>12000);
请查询出入职日期在'1996-01-01'~'1997-01-01'之间并且工资不在8000~10000的员工信息
日期值、字符串值必须用 引号 引起来;数字型值不需要引号,单双引号是等价的,但是不能一边单一边双
SELECT e.*
FROM hrdb.`employees` e
WHERE e.`hire_date`>='1996-01-01' AND e.`hire_date`<='1997-01-01'
AND (e.`salary`<8000 OR e.`salary`>10000);
between...and子句,在什么和什么之间,包含边界值
请查询出薪水在10000~12000(假设包含边界值)之间的员工所有信息
SELECT *
FROM hrdb.`employees` e
WHERE e.`salary` BETWEEN 10000 AND 12000;
in子句,在....之中 (都查出来)
请查询出工资刚好是8000,9000,10000,11000的员工,实际上就是查出薪水等于8000 or 等于 9000 or....
SELECT *
FROM hrdb.`employees` e
WHERE e.`salary` IN (8000,9000,10000,11000);
排序语句 order by ,order:排序, by:根据... , asc:升序(由小到大), desc:降序(由大到小)
请根据薪水的升序(由小到大)的顺序列出所有员工
SELECT *
FROM hrdb.`employees` e
ORDER BY e.`salary` ASC; #asc是默认值,可以不用写也是升序
请查询出职位id(job_id)=‘IT_PROG’的所有员工及薪水和职位ID,并以薪水的降序排列
SELECT e.`first_name`,e.`last_name`, e.`salary`,e.`job_id`
FROM hrdb.`employees` e
WHERE e.`job_id` = 'IT_PROG'
ORDER BY e.`salary` DESC;
limit子句,limit:限制,意思是限制取几条数据
请查询出员工中薪水排名前三的员工
SELECT *
FROM hrdb.`employees` e
ORDER BY e.`salary` DESC
LIMIT 0,3; #0,3:表示从第一条开始取3条,3是条数。4,2:取第5,6行
模糊查询:根据数据中的部分文字作为条件来查询,而不是精确的值(很重要)
如:淘宝搜索:华为 ,将会模糊搜索出淘宝中所有包含‘华为’两个字的产品
通配符:%: 代表匹配 0~无穷多 个字符
_:下划线,代表唯一且一定要匹配一个字符
查询出:员工first_name中包含“on”字符的员工:
'%on%':能查出四种情况:1)on ; 2)xony ; 3)xon ;4)ony
LIKE:像,类似于,模糊查询中只能用like,不能用表示精确匹配的"="
SELECT * FROM hrdb.`EMPLOYEES` e WHERE e.`first_name` LIKE '%on%';
请查询出员工first_name中以“on”字符结尾的员工:
SELECT * FROM hrdb.`EMPLOYEES` e WHERE e.`first_name` LIKE '%on';
请查询出员工编号为3位数字并 以2开头以0结尾的员工
SELECT * FROM hrdb.`employees` e WHERE e.`employee_id` LIKE '2_0';
请查询出公司中“名”第二个字母是‘o’,最后一个字母是‘e’ 的所有员工
SELECT * FROM hrdb.`employees` e WHERE e.`first_name` LIKE '_o%e';
请查询出公司中first_name是四个字母的员工
SELECT * FROM hrdb.`employees` e WHERE e.`first_name` LIKE '____';
用length函数
SELECT * FROM hrdb.`employees` e WHERE LENGTH(e.`first_name`)=4;
NULL的用法
在SQL语句中NULL不能直接用等于表示,要用 is null,is not null
请查询出公司没有部门的员工(部门ID为空的员工)
SELECT * FROM hrdb.`employees` e WHERE e.`department_id` IS NULL;
请查询出公司有部门的员工(部门ID不为空的员工)
SELECT * FROM hrdb.`employees` e WHERE e.`department_id` IS NOT NULL;
)
CONCAT:拼接字符串;CONCAT("x","y","z") = "xyz"
length:求长度;length("abc") = 3
Trim:修剪前后空格 Trim(' abc ')='abc'
REPLACE:替换 replace("abc123", "123", "def") = "abcdef"
substr:求子串,substr("abcdefg", 1,3) = "abc" ,从第1个往后取长度3个字符
left: 取左边的字符,left('abcde',3)='abc'
right: 取右边的字符,right('abcde',3)='cde'
SELECT CONCAT(e.`first_name`,".",e.`last_name`) AS 姓名,
LENGTH(e.`last_name`) AS 姓长度,
TRIM(e.`first_name`) 去前后空格,
REPLACE(e.`job_id`, "PROG", "程序猿") 替换,
SUBSTR(e.`first_name`,1,3) 名的前三个字符,
RIGHT(e.`first_name`,3) 名的右边3个字符
FROM hrdb.`employees` e;
日期函数SYSDATE(system date):now:系统当前日期和时间;记住sysdate
CURDATE(current date):当前日期;curtime:当前时间
SELECT SYSDATE(),NOW(),CURDATE(),CURTIME();
DATE_FORMAT(x,y):将x日期按照y格式显示;FORMAT:格式化:%Y:占位符
SELECT DATE_FORMAT("2017-5-8 19:45:34","%Y年%m月%d日 %H时%i分%S秒");
将入职日期按照中文格式显示
SELECT e.`employee_id`,
DATE_FORMAT(e.`hire_date`,"%Y年%m月%d日") AS 中文入职日期
FROM hrdb.`employees` e;
注意函数中字母大小写是敏感的,不能错
下面开始多表查询
请查询出公司员工和部门的对应关系(连接条件:员工表部门id=部门表部门ID)
俩张表的查询一定有一个连接条件
根据连接条件相互匹配分别将两张表不同行数据连接为一行
SELECT e.*,d.*
FROM hrdb.`employees` e, hrdb.`departments` d
WHERE e.`department_id` = d.`department_id`;
查出员工姓名以及所在部门名称
SELECT CONCAT(e.`first_name`,".",e.`last_name`) AS 姓名,
d.`department_name`
FROM hrdb.`employees` e, hrdb.`departments` d
WHERE e.`department_id` = d.`department_id`;
请查出每个部门的名称以及部门经理姓名
连接条件:部门表经理ID = 员工表员工ID
SELECT d.`department_name`,
CONCAT(e.`first_name`,".",e.`last_name`)
FROM hrdb.`employees` e, hrdb.`departments` d
WHERE d.`manager_id` = e.`employee_id`;
#请查询出员工姓名以及他的的直属经理姓名
SELECT CONCAT(e.`first_name`,".",e.`last_name`) AS 员工,
CONCAT(m.`first_name`,".",m.`last_name`) AS 经理
FROM hrdb.`employees` e, hrdb.`employees` m
WHERE e.`manager_id` = m.`employee_id`;
左外连接的写法
SELECT e.`first_name`,
e.`last_name`,
l.`city`
FROM hrdb.`employees` e
LEFT JOIN hrdb.`departments` d
ON e.`department_id` = d.`department_id`
LEFT JOIN hrdb.`locations` l
ON d.`location_id` = l.`location_id`;
内连接的第二种写法,只是语法不同而已,效果一样,任选1个
请查询出名叫“Valli”的员工和他的部门名称
SELECT e.`first_name`,e.`last_name`,d.`department_name`
FROM hrdb.`employees` e, hrdb.`departments` d
WHERE e.`department_id` = d.`department_id`
AND e.`first_name`='Valli';
第二种写法:INNER JOIN:内连接
SELECT e.`first_name`,e.`last_name`,d.`department_name`
FROM hrdb.`EMPLOYEES` e
INNER JOIN hrdb.`departments` d
ON e.`department_id` = d.`department_id`
WHERE e.`first_name`="Valli";
什么是外连接:外连接是在内连接基础上,保证左、右或两张表数据至少出现一次
请查出所有员工对应的部门信息,左连接(left join):保证左表是全的,先出现的表是左表
SELECT e.*,d.*
FROM hrdb.`EMPLOYEES` e
LEFT JOIN hrdb.`departments` d
ON e.`department_id` = d.`department_id`; #结果是107个员工都被查出
请查出所有部门对应的员工信息,右连接(right join):保证右表是全的,后出现的表是右表
SELECT e.*,d.*
FROM hrdb.`EMPLOYEES` e
RIGHT JOIN hrdb.`departments` d
ON e.`department_id` = d.`department_id`;#106个有部门的员工+16个空部门=122条
请查出所有员工和所有部门的对应关系,全连接,保证两张表的数据都要是全的
SELECT e.*,d.*
FROM hrdb.`EMPLOYEES` e
LEFT JOIN hrdb.`departments` d
ON e.`department_id` = d.`department_id`
UNION #将两个sql语句的结果行合并显示,并且会将重复的数据合为一条
SELECT e.*,d.*
FROM hrdb.`EMPLOYEES` e
RIGHT JOIN hrdb.`departments` d
ON e.`department_id` = d.`department_id`;
分组统计(分组查询)
统计的5个函数
请统计出本公司所有员工中:总人数、工资总数、平均工资、最高工资、最低工资
SELECT COUNT(*) AS 总人数, #count:求数据行数
SUM(e.`salary`) AS 总工资, #sum:求累加的和
AVG(e.`salary`) AS 平均工资, #avg:求一列中数据的平均值
MAX(e.`salary`) AS 最高工资, #max:求一列中的最大值
MIN(e.`salary`) AS 最低工资 #min:求一列中的最小值
FROM hrdb.`employees` e;
请求出testdb.person表中男女同学分别有多少人
SELECT COUNT(*)
FROM testdb.`person` p
WHERE p.`gender` = 'M'; #求出男同学的人数
请分组统计出公司每个部门的人数、总工资、平均工资、最大、最小工资
SELECT e.`department_id`,
COUNT(*) AS 总人数, #count:求数据行数
SUM(e.`salary`) AS 总工资, #sum:求累加的和
AVG(e.`salary`) AS 平均工资, #avg:求一列中数据的平均值
MAX(e.`salary`) AS 最高工资, #max:求一列中的最大值
MIN(e.`salary`) AS 最低工资 #min:求一列中的最小值
FROM hrdb.`employees` e
WHERE e.`salary`>=3000 #将低于3000的人去掉不参与统计
GROUP BY e.`department_id` #固定写法,按照部门ID分组,group:分组
HAVING 平均工资>=5000 #分组统计完后再进行二次过滤
ORDER BY 平均工资;
子查询:
子查询意思就是说在查询中再嵌套一个查询
子查询可以嵌套到任何位置子句中
1、select子句中用子查询,查出每个员工的部门名称
SELECT e.`first_name`,
e.`last_name`,
e.department_id,
(SELECT d.department_name FROM hrdb.`departments` d
WHERE d.department_id = e.`department_id`) AS 部门名称
FROM hrdb.`employees` e;
2、在from子句中使用子查询(任何查询语句的结果都可以做为一张表,再做二次查询)
查询部门编号=50的员工姓名
SELECT e.`first_name`,e.`last_name`,e.`department_id`
FROM (SELECT ee.* FROM hrdb.`employees` ee
WHERE ee.`department_id` = 50) e;
3、where子句中用子查询
找到与员工201相同部门的人员信息
SELECT e.*
FROM hrdb.`employees` e
WHERE e.department_id =
(SELECT e2.department_id FROM hrdb.`employees` e2
WHERE e2.employee_id=201);
找到与员工201,203相同部门的人员信息
SELECT e.*
FROM hrdb.`employees` e
WHERE e.department_id IN
(SELECT e2.department_id FROM hrdb.`employees` e2
WHERE e2.employee_id=201 OR e2.`employee_id`=203);
下面开始做一张表数据的增、删、改(很重要,一定要会默写)
新增表数据,往部门表中添加一个部门:
语法:insert into 表名(字段名1,2,3,...)values(值1,值2,值3,...);
方法1:插入的时候指定字段,则值必须与字段一一对应
INSERT INTO:插入, 注:主键或非空字段如果不能自增,且没有默认值,则一定要插入值
INSERT INTO hrdb.`departments`(department_id, department_name)
VALUES(8888, "融资部") ;
方法2:插入的时候不指定字段,则值按照表字段的定义顺序一一对应
INSERT INTO hrdb.`departments` VALUES(8889, "融资二部", NULL, NULL);
检查一下数据是否插入成功
SELECT * FROM hrdb.`departments` WHERE department_name LIKE '融资%';
删除表数据语句
语法:delete from 表名 where 条件
相似创建:创建一张跟员工表 表结构 和 数据一模一样的表:emp_copy
CREATE TABLE hrdb.emp_copy SELECT * FROM hrdb.`employees`;
INSERT INTO hrdb.emp_copy SELECT * FROM hrdb.`employees`;
删除员工ID以2开头的,并且部门ID=20的所有数据
DELETE FROM hrdb.`emp_copy`
WHERE employee_id LIKE '2%' AND department_id=20;
删除之前可以用select语句查出来检查是否是需要删除的数据
SELECT * FROM hrdb.`emp_copy` WHERE employee_id LIKE '2%' AND department_id=20;
不带where条件,相当于数据全部删除,一次性的把emp_copy表的数据全部删除,危险系数*****
删除全部表数据:第一种:通过数据库的日志还可以恢复
DELETE FROM hrdb.`emp_copy`;
删除全部表数据及日志:第2种:TRUNCATE:截断数据和日志,删完不可恢复,危险系数******
TRUNCATE hrdb.`emp_copy`;
把这张表也删除掉
DROP TABLE hrdb.emp_copy;
数据更新语句:UPDATE:更新
创建一张和员工表结构和数据一模一样的表:emp_copy
CREATE TABLE hrdb.emp_copy SELECT * FROM hrdb.`employees`;
带条件的更新:请将所有销售部(d_id=80)的员工提成比率改为90%,并且将薪水调为300000
语法:update 表名 set 字段1=值1, 字段2=值2,... where ....
UPDATE hrdb.`emp_copy` e
SET e.`commission_pct` = 0.9, e.salary=300000
WHERE e.department_id=80;
写个查询语句查一下
SELECT * FROM hrdb.`emp_copy`
WHERE department_id=80;
不带where条件,相当于全部更新,将所有员工的姓名都改为:牛人.com,危险系数*****
UPDATE hrdb.`emp_copy`
SET first_name='牛人', last_name='com';
#请将名是四个字符的所有人的薪水+1000
UPDATE hrdb.`employees` e
SET e.`salary` = e.`salary` + 1000 #薪水+1000
WHERE e.`first_name` LIKE '____';
请将入职日期是1996-01-01到1998-01-01之间的,
薪水低于5000的所有人调入新增加的8888部门
UPDATE hrdb.`employees` e
SET e.`department_id` = 8888
WHERE e.`hire_date`>='1996-01-01' AND e.`hire_date`<='1998-01-01'
AND e.`salary`<5000;
示例:某学校系统中的“学分表Records”包含:学号SID、课程CID、分数SCORE三个字段
1、请创建表及插入数据
CREATE TABLE hrdb.score
(
sid INT NOT NULL,
cid CHAR(3) NOT NULL, #001:语文; 002:数学; 003英语
score FLOAT(4,1),
PRIMARY KEY(sid,cid)
)ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;
INSERT INTO hrdb.`score` VALUES(1, '001', 89);
INSERT INTO hrdb.`score` VALUES(1, '002', 77);
INSERT INTO hrdb.`score` VALUES(1, '003', 99);
INSERT INTO hrdb.`score` VALUES(2, '001', 67);
INSERT INTO hrdb.`score` VALUES(2, '002', 56);
INSERT INTO hrdb.`score` VALUES(2, '003', 87);
INSERT INTO hrdb.`score` VALUES(3, '001', 88);
INSERT INTO hrdb.`score` VALUES(3, '002', 77);
INSERT INTO hrdb.`score` VALUES(3, '003', 76);
INSERT INTO hrdb.`score` VALUES(4, '001', 90);
INSERT INTO hrdb.`score` VALUES(4, '002', 98);
INSERT INTO hrdb.`score` VALUES(4, '003', 94);
INSERT INTO hrdb.`score` VALUES(5, '001', 67);
INSERT INTO hrdb.`score` VALUES(5, '002', 100);
INSERT INTO hrdb.`score` VALUES(5, '003', 89);
2、请查询出总分排名前三的学生的学号及总分
SELECT s.`sid` AS 学号, SUM(s.`score`) AS 总分
FROM hrdb.`score` s
GROUP BY s.`sid`
ORDER BY 总分 DESC
LIMIT 0,3;
3、请查询出每门课程得到最高分的学生的学号和课程号、分数
SELECT b.*
FROM
(SELECT s.`cid`, MAX(s.`score`) AS 最高分
FROM hrdb.`score` s
GROUP BY s.`cid`) a,
hrdb.`score` b
WHERE a.cid = b.`cid`
AND a.最高分 = b.`score`;
给mysql创建一个用户,实际上就是在mysql数据库下的user表中增加一行
创建一个可以在本机登录的用户:demo_c@locaohost
HOST:主机
INSERT INTO mysql.`user`(HOST, USER, PASSWORD)
VALUES("localhost", "demo_c", PASSWORD("123456"));
创建一个可以在非本机登录的用户:demo_a@'%'
INSERT INTO mysql.`user`(HOST, USER, PASSWORD)
VALUES("%", "demo_a", PASSWORD("123456"));
host 注释 示例
localhost(127.0.0.1) 用户能够在localhost访问MySQL root@localhost
% 用户能够在 非localhost 访问 MySQL root@%
ip(指定ip) 用户能够在 指定ip访问MySQL root@172.31.95.168
用户以及权限的修改需要刷新才能生效
flush:刷新,PRIVILEGES:权限
FLUSH PRIVILEGES;
下面可以尝试用demo_c登录自己的mysql
用demo_a登录边上同学的mysql,注意需要对方的IP地址(ipconfig)
将hrdb数据库的访问权限授予demo_c@localhost
grant:授予,*:表示所有的
GRANT ALL PRIVILEGES ON hrdb.* TO demo_c@localhost;
刷新权限,再登录看看demo_c拥有了hrdb数据库的权限
FLUSH PRIVILEGES;
从demo_c@localhost回收hrdb的访问权限
revoke : 回收
REVOKE ALL PRIVILEGES ON hrdb.* FROM demo_c@localhost;
刷新权限,再登录看看是否回收成功
FLUSH PRIVILEGES;
查看demo_c用户拥有哪些权限
SHOW GRANTS FOR demo_c@localhost;
删除用户:
DROP USER demo_c@localhost;
DROP USER demo_a@'%';
修改demo_c@localhost的用户密码
实际上就是将mysql.user表中相关行的数据update(更新)
UPDATE mysql.`user`
SET PASSWORD = PASSWORD("654321")#用password函数加密密码
WHERE HOST='localhost' AND USER='demo_c';
刷一下权限
FLUSH PRIVILEGES;
再用demo_c@localhost登录一下,使用新的密码
数据的备份操作(备份到文件)
创建一张空的员工表
CREATE TABLE emp_copy2 SELECT * FROM hrdb.`employees` WHERE 1=2;
表数据导出:
选中要导出数据的表后 右键菜单中选中 备份/导出--> 导出表数据作为
表数据导入:
选中要插入数据的表后 右键菜单中选中 导入 --> 导入使用本地加载的csv数据
数据库的导出
选中要导出的数据库后 右键菜单中选中 备份/导出--> 备份数据库,转储成SQL
数据库的导入
查看一下转储的SQL文件,理解里面的语句,
将SQL文件的内容放入 询问 中全部执行即可导入
演示一下视图
视图:VIEW:将一条查询语句定义为一个视图
将销售部的所有员工定义为一个视图
CREATE OR REPLACE VIEW hrdb.v_emp_sales AS
SELECT * FROM hrdb.employees e WHERE e.department_id=80;
创建一个视图,显示员工信息和对应的部门名称
CREATE OR REPLACE VIEW hrdb.v_emp_dept AS
SELECT e.`employee_id`,
d.`department_id` AS dept_id,
d.`department_name`
FROM hrdb.`employees` e
LEFT JOIN hrdb.`departments` d
ON e.`department_id` = d.`department_id`;
可以当做表一样的操作视图
查询视图
SELECT * FROM hrdb.`v_emp_sales` v WHERE v.`salary`>8000;
修改视图数据
UPDATE hrdb.`v_emp_sales` SET first_name='john_3434' WHERE first_name='John';
注意:视图的数据和原始表数据是同步的,一方改变另一方也会改变
删除视图
DROP VIEW hrdb.`v_emp_dept`;