JavaStudy13(MySQL)—B站hsp

MySQL

1.1一个问题

1.2 解决之道

1.2.1 解决之道-文件、数据库

1.2.2 MySQL 数据库的安装和配置(安装演示)

1.2.3 使用命令行窗口连接 MYSQL 数据库[示意图]

1.2.4 操作示意图

1.3 Navicat 安装和使用

1.3.1 介绍 : 图形化 MySQL 管理软件

省略

1.5 数据库三层结构-破除 MySQL 神秘

1.6 数据在数据库中的存储方式

1.7SQL 语句分类

1.8 创建数据库

代码演示:

# 演示数据库的操作
#创建一个名称为 hsp_db01 的数据库。[图形化和指令 演示]
#使用指令创建数据库
CREATE DATABASE hap_db01;
#删除数据库指令
DROP DATABASE hsp_db01;
#创建一个使用 utf8 字符集的 hsp_db02 数据库
CREATE DATABASE hsp_db02 CHARACTER SET utf8;
#创建一个使用 utf8 字符集,并带校对规则的 hsp_db03 数据库
CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin;
#校对规则 utf8_bin 区分大小 默认 utf8_general_ci 不区分大小写#下面是一条查询的 sql , select 查询 * 表示所有字段 FROM 从哪个表
#WHERE 从哪个字段 NAME = 'tom' 查询名字是 tom
SELECT * FROM db02_test WHERE NAME = 'tom'

1.9 查看、删除数据库

代码演示:

#演示删除和查询数据库
#查看当前数据库服务器中的所有数据库
SHOW DATABASES
#查看前面创建的 hsp_db01 数据库的定义信息
SHOW CREATE DATABASE `hsp_db02`
#老师说明 在创建数据库,表的时候,为了规避关键字,可以使用反引号解决
#删除前面创建的 hsp_db01 数据库
DROP DATABASE hsp_db02

1.10 备份恢复数据库

#练习 : database03.sql 备份 hsp_db02 和 hsp_db03 库中的数据,并恢复#备份, 要在 Dos 下执行 mysqldump 指令其实在 mysql 安装目录\bin
#这个备份的文件,就是对应的 sql 语句mysqldump -u root -p -B hsp_db02 hsp_db03 > d:\\bak.sqlDROP DATABASE hsp_db03#恢复数据库(注意:进入 Mysql 命令行再执行)
source d:\\bak.sql
#第二个恢复方法, 直接将 bak.sql 的内容放到查询编辑器中,执行

1.11 备份恢复数据库的表

1.12 安装 Ecshop 数据库

#这是一个 ecshop 的数据库,包括 ecshop 所有的表,请导入到 mysql 数据库中[备份]
#进入到 mysql 命令行: source ecshop 备份文件路径
#再将 ecshop 整个数据库备份到你的 d:\\ecshop.sql 到 dos 下 :
mysqldump -u root -p -B ecshop > d:\\ecshop.sql
#将 mysql 的 ecshop 数据库删除, 并通过备份的 d:\\ecshop.sql 恢复
#进入 mysql 命令行
source d:\\ecshop.sql

1.13 创建表 (按课程大纲顺序)

#指令创建表
#注意:hsp_db02 #创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。例:user表 #(快速入门案例 create_tab01.sql ) #id 整形 [图形化,指令] #name 字符串 #password 字符串 #birthday #日期
CREATE TABLE `user` (
id INT,
`name` VARCHAR(255),
`password` VARCHAR(255),
birthday DATE)
CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB;

1.14 Mysql 常用数据类型(列类型)

1.14.1数值型(整数)的基本使用

1.14.2 型如何定义一个无符号的整数

#演示整型的是一个
#老韩使用 tinyint 来演示范围 有符号 -128 ~ 127 如果没有符号 0-255
#说明: 表的字符集,校验规则, 存储引擎,老师使用默认
#1. 如果没有指定 unsinged , 则 TINYINT 就是有符号
#2. 如果指定 unsinged , 则 TINYINT 就是无符号 0-255
CREATE TABLE t3(
id TINYINT);
INSERT INTO t3 VALUES(127);
SELECT * FROM t3;
CREATE TABLE t4(
id TINYINT UNSIGNED);
SELECT * FROM t4;
INSERT INTO t4 VALUES(0);

1.14.3 数值型(bit)的使用

#演示 bit 类型使用 #说明
#1. bit(m) m 在 1-64
#2. 添加数据 范围 按照你给的位数来确定,比如 m = 8 表示一个字节 0~255
#3. 显示按照 bit
#4. 查询时,仍然可以按照数来查询
CREATE TABLE t05 (num BIT(8));
INSERT INTO t05 VALUES(255);
SELECT * FROM t05;
SELECT * FROM t05 WHERE num = 3;

1.14.4 数值型(小数)的基本使用

#演示 decimal 类型、float、double 使用
#创建表
CREATE TABLE t06(
num1 FLOAT,
num2 DOUBLE,
num3 DECIMAL(30,20));
# 添加数据
INSERT INTO t06 VALUES(88.123456789, 88.123456789, 88.123456789);
SELECT * FROM t06;#decimal 可以存放很大的数
CREATE TABLE t07(
num1 DECIMAL(65));INSERT INTO t07 VALUES(4888888888888888888888888888888888888888888555588848484888)
SELECT * FROM t07;
CREATE TABLE t08( num BIGINT UNSIGNED) ;
INSERT INTO t08 VALUES(8999999933338388388383838838383009338388383838383838383);
SELECT * FROM t08;

1.14.5 字符串的基本使用

代码演示:

#演示字符串类型使用 char varchar
#注释的快捷键 shift+ctrl+c , 注销注释 shift+ctrl+r -- CHAR(size)
-- 固定长度字符串 最大 255 字符
-- VARCHAR(size) 0~65535 字节
-- 可变长度字符串 最大 65532 字节 【utf8 编码最大 21844 字符 1-3 个字节用于记录大小】
-- 如果表的编码是 utf8 varchar(size) size = (65535-3) / 3 = 21844
-- 如果表的编码是 gbk varchar(size) size = (65535-3) / 2 = 32766
CREATE TABLE t09 (
`name` CHAR(255)
);
CREATE TABLE t10 (
`name` VARCHAR(21844));
CREATE TABLE t11 (
`name` VARCHAR(32766) CHARSET gbk);
SELECT * FROM t11;

1.14.6 字符串使用细节

代码演示:

#演示字符串类型的使用细节
#char(4) 和 varchar(4) 这个 4 表示的是字符,而不是字节, 不区分字符是汉字还是字母
CREATE TABLE t11(
`name` CHAR(4));
INSERT INTO t11 VALUES('你好世界')
SELECT * FROM t11
CREATE TABLE t12(
`name` VARCHAR(4));
INSERT INTO t12 VALUES('你好世a')
#如果 varchar 不够用,可以考试使用 mediumtext 或者 longtext,
#如果想简单点,可以使用直接使用 text
CREATE TABLE t13 (content TEXT, conten2 MEDIUMTEXT, content3 LONGTEXT);
SELECT * FROM t13
INSERT INTO t13 VALUES('你好时间', '你好时间是你','得得得多多多多多多多多多多');

1.14.7 日期类型的基本使用

#演示时间相关的类型
#创建一张表, date , datetime , timestamp
CREATE TABLE t14 (
birthday DATE,
job_time DATETIME,
login_time TIMESTAMP
NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);  -- 登录时间, 如果希望 login_time 列自动更新, 需要配置
SELECT * FROM t14INSERT INTO t14(birthday,job_time) VALUES('2022-11-11','2022-11-11 10:11:11')

1.15 创建表练习

代码演示:

-- 字段属性
-- Id 整形
-- name 字符型
-- sex 字符型
-- brithday 日期型(date)
-- entry_date 日期型 (date)
-- job 字符型
-- Salary 小数型
-- resume 文本型
-- 自己一定要练习一把CREATE TABLE emp(
Id INT,
`name` VARCHAR(32),
sex char(1),
brithday DATE,
entry_date DATETIME,
job VARCHAR(32),
Salary DOUBLE,
resume LONGTEXT
)CHARSET utf8 COLLATE utf8_bin ENGINE INNODB
-- 添加一条
INSERT INTO emp
VALUES(
100, '小妖怪', '男', '2022-10-10', '2030-12-12 10:15:12', '程序员', 5000.25, '你好我是小妖怪'
)
SELECT * FROM emp

1.16修改表-基本介绍

1.17 修改表-课堂练习

代码演示:

#修改表的操作练习
-- 员工表 emp 的上增加一个 image 列,varchar 类型(要求在 resume 后面)。
ALTER TABLE emp
ADD image VARCHAR(32) NOT NULL DEFAULT ''
AFTER resume
DESC emp
SELECT * FROM emp
-- 修改 job 列,使其长度为 60。
ALTER TABLE emp
MODIFY job VARCHAR(60) NOT NULL DEFAULT ''
-- 删除 sex 列。
ALTER TABLE emp
DROP sex
-- 表名改为 employee。
RENAME TABLE emp to employee;
DESC employee-- 修改表的字符集为 utf8
ALTER TABLE employee CHARACTER SET utf8
-- 列名 name 修改为 user_name
ALTER TABLE employee
CHANGE `name` user_name VARCHAR(32) NOT NULL DEFAULT ''

1.18 数据库 C[create]R[read]U[update]D[delete]语句

1.19 Insert 语句

1.19.1 使用 INSERT 语句向表中插入数据。insert.sql

代码演示

#练习 insert 语句
-- 创建一张商品表 goods (id int , goods_name varchar(10), price double );
-- 添加 2 条记录
CREATE TABLE goods (
id int ,
goods_name varchar(10),
price double)
-- 添加数据
INSERT INTO goods(id,goods_name,price) VALUES (100,'手机',5000)
INSERT INTO goods(id,goods_name,price) VALUES (101,'华为',505000)
SELECT * FROM goods
SELECT * FROM employee
INSERT INTO employee VALUES(101,'打妖怪', '2030-12-12', '2030-12-12 10:15:12', '巡山', 8000,'hhh1', '无');
INSERT INTO employee VALUES(101,'打妖怪', '2030-12-12', '2030-12-12 10:15:12', '巡山', 8000,'hhh1', '无');

1.19.2 细节说明 insertdetail.sql

代码演示:

#说明 insert 语句的细节
-- 1.插入的数据应与字段的数据类型相同。
-- 比如 把 'abc' 添加到 int 类型会错误
INSERT INTO `goods` (id, goods_name, price) VALUES('韩顺平', '小米手机', 2000);
-- 2. 数据的长度应在列的规定范围内,例如:不能将一个长度为 80 的字符串加入到长度为 40 的列中。
INSERT INTO `goods` (id, goods_name, price) VALUES(40, 'vovo 手机 vovo 手机 vovo 手机 vovo 手机 vovo 手机', 3000);
-- 3. 在 values 中列出的数据位置必须与被加入的列的排列位置相对应。
INSERT INTO `goods` (id, goods_name, price)
-- 不对 VALUES('vovo 手机',40, 2000);
-- 4. 字符和日期型数据应包含在单引号中。
INSERT INTO `goods` (id, goods_name, price) VALUES(40, vovo 手机, 3000);
-- 错误的 vovo 手机 应该 'vovo 手机'
-- 5. 列可以插入空值[前提是该字段允许为空],
insert into table value(null) INSERT INTO `goods` (id, goods_name, price) VALUES(40, 'vovo 手机', NULL);
-- 6. insert into tab_name (列名..) values (),(),() 形式添加多条记录
INSERT INTO `goods` (id, goods_name, price) VALUES(50, '三星手机', 2300),(60, '海尔手机', 1800);
-- 7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
INSERT INTO `goods` VALUES(70, 'IBM 手机', 5000);
-- 8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
-- 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给 null
-- 如果我们希望指定某个列的默认值,可以在创建表时指定
INSERT INTO `goods` (id, goods_name) VALUES(80, '格力手机'); SELECT * FROM goods; INSERT INTO `goods2` (id, goods_name)
SELECT * from goods

1.20 update 语句

1.20.1 使用 update 语句修改表中数据

1.20.2 基本使用 update.sql

代码演示:

-- 演示 update 语句
-- 要求: 在上面创建的 employee 表中修改表中的纪录
-- 1. 将所有员工薪水修改为 5000 元。[如果没有带 where 条件,会修改所有的记录,因此要小心]
UPDATE employee set salary=5000;
SELECT * FROM employee
-- 2. 将姓名为 小妖怪 的员工薪水修改为 3000 元。
UPDATE employee set salary=3000 where user_name = '小妖怪'
-- 3. 将 老妖怪 的薪水在原有基础上增加 1000 元
INSERT INTO employee VALUES(200, '老妖怪', '1990-11-11', '2000-11-11 10:10:10', '捶背的', 5000, '给大王捶背', 'd:\\a.jpg')
UPDATE employee set salary=salary+1000 WHERE user_name='老妖怪'
-- 可以修改多个列的值
UPDATE employee set salary=salary+1000,job='出主意' WHERE user_name = '老妖怪'

1.20.3 使用细节:

1.21 delete 语句

1.21.1 使用 delete 语句删除表中数据

代码演示:

-- delete 语句演示
-- 删除表中名称为’老妖怪’的记录。
DELETE FROM employee WHERE user_name='老妖怪';
SELECT * FROM employee
-- 删除表中所有记录, 老师提醒,一定要小心
DELETE FROM employee;
-- Delete 语句不能删除某一列的值(可使用 update 设为 null 或者 '')
UPDATE employee SET job = ''
-- 要删除这个表
DROP TABLE employee;

1.21.2 使用细节

1.22select 语句

1.22.1 基本语法

1.22.2 注意事项 (创建测试表学生表 )

1.22.3 课堂练习: select01.sql

-- select 语句【重点 难点】
CREATE TABLE student (
id INT NOT NULL default 1,
`name` VARCHAR(20) NOT NULL DEFAULT '',
chinese FLOAT NOT NULL DEFAULT 0.0,
english FLOAT NOT NULL DEFAULT 0.0,
math FLOAT NOT NULL DEFAULT 0.0
)
SELECT * FROM   student
INSERT INTO student VALUES(1,'韩顺平',89,87,90);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(2,'张飞',67,98,56);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(3,'宋江',87,78,77);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(4,'关羽',88,98,90);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(5,'赵云',82,84,67);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(6,'欧阳锋',55,85,45);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(7,'黄蓉',75,65,30);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(8,'韩信',45,65,99);-- 查询表中所有学生的信息。
SELECT * FROM student;
-- 查询表中所有学生的姓名和对应的英语成绩。
SELECT `name`,english FROM student
-- 过滤表中重复数据 distinct 。
SELECT DISTINCT english FROM student
-- 要查询的记录,每个字段都相同,才会去重
SELECT DISTINCT `name`, english FROM student;

1.22.4 使用表达式对查询的列进行运算

1.22.5 在 select 语句中可使用 as 语句

1.22.6 练习 select02.sql

-- select 语句的使用
-- 统计每个学生的总分
SELECT `name`, (english+math+chinese) as total_score from student-- 在所有学生总分加 10 分的情况
SELECT `name`, (english+math+chinese)+10 as total_score from student
-- 使用别名表示学生分数。
SELECT `name`, (english+math+chinese)+10 as total_score from student

1.22.7 在 where 子句中经常使用的运算符

1.22.8 使用 where 子句,进行过滤查询 select03.sql

-- select 语句
-- 查询姓名为赵云的学生成绩
SELECT * FROM student WHERE `name`= '赵云'
-- 查询英语成绩大于 90 分的同学
SELECT * FROM student WHERE english>90
-- 查询总分大于 200 分的所有同学
SELECT * from student WHERE (chinese+english+math)>200
-- 查询 math 大于 60 并且(and) id 大于 4 的学生成绩
SELECT * FROM student WHERE math>60 and id>4
-- 查询英语成绩大于语文成绩的同学
select * from student where english>chinese
-- 查询总分大于 200 分 并且 数学成绩小于语文成绩,的姓赵的学生. -- 赵% 表示 名字以韩开头的就可以
SELECT * FROM student   WHERE (chinese+english+math)>200 and math<chinese and `name` like '赵%'
-- 查询英语分数在 80-90 之间的同学。
SELECT * FROM student WHERE english<=90 and english>=80
SELECT * FROM student WHERE english BETWEEN 80 AND 90
-- 查询数学分数为 89,90,91 的同学。
SELECT * FROM student WHERE math =89 or math =90 or math= 91
SELECT * FROM student WHERE math in (89,90,91)-- 查询所有姓李的学生成绩。SELECT * FROM student WHERE `name` LIKE '韩%'

 SELECT * FROM student WHERE chinese BETWEEN 70 AND 80SELECT * FROM student WHERE math+chinese+english in (189,190,191)SELECT * FROM student WHERE `name` LIKE '韩%' OR `name` LIKE '宋%'SELECT * FROM student WHERE (math-chinese)>30

1.22.10 使用 order by 子句排序查询结果

-- 演示 order by 使用
-- 对数学成绩排序后输出【升序】。
SELECT * from student ORDER BY math asc
-- 对总分按从高到低的顺序输出 [降序] -- 使用别名排序
SELECT `name`, (math+english+chinese) as '总分' FROM student ORDER BY '总分' desc
-- 对姓韩的学生成绩[总分]排序输出(升序) where + order by
SELECT `name`, (math+english+chinese) as '总分' FROM student
WHERE `name` LIKE '韩%'
ORDER BY '总分' asc

1.23 合计/统计函数

1.23.1 count

1.23.2 sum

1.23.3 avg

1.23.4 max/min

-- 演示 mysql 的统计函数的使用
-- 统计一个班级共有多少学生?
SELECT COUNT(*) FROM student;
-- 统计数学成绩大于 90 的学生有多少个?
SELECT COUNT(*) FROM student WHERE math>90;
-- 统计总分大于 250 的人数有多少?
SELECT COUNT(*) FROM student WHERE (math+english+chinese)>250;
-- count(*) 和 count(列) 的区别
-- 解释 :count(*) 返回满足条件的记录的行数
-- count(列): 统计满足条件的某列有多少个,但是会排除 为 null 的情况
CREATE TABLE t15 (`name` VARCHAR (20));
INSERT INTO t15 VALUES('tom');
INSERT INTO t15 VALUES('jack');
INSERT INTO t15 VALUES('mary');
INSERT INTO t15 VALUES(NULL);
SELECT * FROM t15;
SELECT COUNT(*) FROM t15; -- 4
SELECT COUNT(`name`) FROM t15;-- 3-- 演示 sum 函数的使用
-- 统计一个班级数学总成绩?
SELECT SUM(math) FROM student
-- 统计一个班级语文、英语、数学各科的总成绩
SELECTSUM(math) AS math_score,SUM(english) AS english_score,SUM(chinese) AS chinese_score
FROMstudent-- 统计一个班级语文、英语、数学的成绩总和SELECTSUM(math+chinese+english)FROM student
-- 统计一个班级语文成绩平均分
SELECT SUM(chinese)/COUNT(*) FROM student
SELECT SUM(`name`) FROM student;-- 演示 avg 的使用 -- 练习:
-- 求一个班级数学平均分?
SELECT AVG(math) FROM student
-- 求一个班级总分平均分
SELECT AVG(math+english+chinese) AS avg_score FROM student-- 演示 max 和 min 的使用
-- 求班级最高分和最低分(数值范围在统计中特别有用)
SELECT MAX(math+english+chinese),MIN(math+english+chinese) FROM student
-- 求出班级数学最高分和最低分
SELECT MAX(math) AS max_math, MIN(math) AS min_math FROM student

1.23.5 使用 group by 子句对列进行分组 [先创建测试表]

1.23.6 使用 having 子句对分组后的结果进行过滤


CREATE TABLE dept (/*部门表*/deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,dname VARCHAR (20) NOT NULL DEFAULT "",loc VARCHAR (13) NOT NULL DEFAULT ""
);INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');CREATE TABLE emp (empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*编号*/ename VARCHAR (20) NOT NULL DEFAULT "",/*名字*/job VARCHAR (9) NOT NULL DEFAULT "",/*工作*/mgr MEDIUMINT UNSIGNED,/*上级编号*/hiredate DATE NOT NULL,/*入职时间*/sal DECIMAL (7, 2) NOT NULL,/*薪水*/comm DECIMAL (7, 2),/*红利 奖金*/deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0/*部门编号*/
);
-- 添加测试数据
INSERT INTO emp VALUES
(7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00,NULL , 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1991-2-22', 1250.00, 500.00, 30),
(7566, 'JONES', 'MANAGER', 7839, '1991-4-2', 2975.00,NULL,20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1991-9-28',1250.00,1400.00,30),
(7698, 'BLAKE','MANAGER', 7839,'1991-5-1', 2850.00,NULL,30),
(7782, 'CLARK','MANAGER', 7839, '1991-6-9',2450.00,NULL,10),
(7788, 'SCOTT','ANALYST',7566, '1997-4-19',3000.00,NULL,20),
(7839, 'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10),
(7844, 'TURNER', 'SALESMAN',7698, '1991-9-8', 1500.00, NULL,30),
(7900, 'JAMES','CLERK',7698, '1991-12-3',950.00,NULL,30),
(7902, 'FORD', 'ANALYST',7566,'1991-12-3',3000.00, NULL,20),
(7934,'MILLER','CLERK',7782,'1992-1-23', 1300.00, NULL,10);
-- 工资级别 #工资级别表
CREATE TABLE salgrade (
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*工资级别*/
losal DECIMAL(17,2) NOT NULL, /* 该级别的最低工资 */
hisal DECIMAL(17,2) NOT NULL /* 该级别的最高工资*/ );INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
SELECT * FROM dept
SELECT * FROM emp
SELECT * FROM salgrade# 演示 group by + having GROUP by 用于对查询的结果分组统计, (示意图)
-- having 子句用于限制分组显示结果.
-- ?如何显示每个部门的平均工资和最高工资
-- 老韩分析: avg(sal) max(sal)
-- 按照部分来分组查询
SELECT AVG(sal), MAX(sal), deptno FROM emp GROUP BY deptno
-- 使用数学方法,对小数点进行处理
SELECT FORMAT(AVG(sal),2), MAX(sal) , deptno FROM emp GROUP BY deptno
-- ?显示每个部门的每种岗位的平均工资和最低工资
-- 老师分析 1. 显示每个部门的平均工资和最低工资
-- 2. 显示每个部门的每种岗位的平均工资和最低工资
SELECT AVG(sal),MIN(sal),deptno,job FROM emp GROUP BY deptno,job-- ?显示平均工资低于 2000 的部门号和它的平均工资 // 别名
-- 老师分析 [写 sql 语句的思路是化繁为简,各个击破]
-- 1. 显示各个部门的平均工资和部门号
SELECT AVG(sal), deptno FROM emp GROUP BY deptno
-- 2. 在 1 的结果基础上,进行过滤,保留 AVG(sal) < 2000
SELECT AVG(sal), deptno FROM emp GROUP BY deptno HAVING AVG(sal)<2000
-- 3. 使用别名进行过滤
SELECT AVG(sal) AS avg_sal, deptno FROM emp GROUP BY deptno HAVING avg_sal<2000
-- SELECT AVG(sal) AS '平均薪资', deptno FROM emp GROUP BY deptno HAVING '平均薪资'<2000 中文不行

1.24 字符串相关函数

-- 演示字符串相关函数的使用 , 使用 emp 表来演示
-- CHARSET(str) 返回字串字符集
SELECT CHARSET(ename) FROM emp
-- CONCAT (string2 [,... ]) 连接字串, 将多个列拼接成一列
SELECT CONCAT(ename, '工作是', job) FROM emp
-- INSTR (string ,substring ) 返回 substring 在 string 中出现的位置,没有返回 0
-- dual 亚元表, 系统表 可以作为测试表使用
SELECT INSTR ('hangshunping','ping') FROM DUAL
-- UCASE (string2 ) 转换成大写
SELECT UCASE(ename) FROM emp
-- LCASE (string2 ) 转换成小写
SELECT LCASE(ename) FROM emp-- LEFT (string2 ,length )从 string2 中的左边起取 length 个字符
SELECT LEFT(ename,2) FROM emp
-- RIGHT (string2 ,length ) 从 string2 中的右边起取 length 个字符
SELECT RIGHT(ename,2) FROM emp-- LENGTH (string )string 长度[按照字节]
SELECT LENGTH(ename) FROM emp
-- REPLACE (str ,search_str ,replace_str )
-- 在 str 中用 replace_str 替换 search_str
-- 如果是 manager 就替换成 经理
SELECT ename, REPLACE(job,'MANAGER','经理') FROM emp
-- STRCMP (string1 ,string2 ) 逐字符比较两字串大小
SELECT STRCMP('hsp', 'hsp') FROM DUAL;
-- SUBSTRING (str , position [,length ])
-- 从 str 的 position 开始【从 1 开始计算】,取 length 个字符
-- 从 ename 列的第一个位置开始取出 2 个字符
SELECT SUBSTRING(ename, 1, 2) FROM emp;
-- LTRIM (string2 ) RTRIM (string2 ) TRIM(string)
-- 去除前端空格或后端空格
SELECT LTRIM(' 韩顺平教育') FROM DUAL;
SELECT RTRIM('韩顺平教育 ') FROM DUAL;
SELECT TRIM(' 韩顺平教育 ') FROM DUAL;-- 练习: 以首字母小写的方式显示所有员工 emp 表的姓名
-- 方法 1 -- 思路先取出 ename 的第一个字符,转成小写的
-- 把他和后面的字符串进行拼接输出即可
SELECT CONCAT(LCASE(SUBSTRING(ename,1,1)),SUBSTRING(ename,2)) AS new_name FROM emp
SELECT CONCAT(LCASE(LEFT(ename,1)),SUBSTRING(ename,2)) AS new_name FROM emp

1.25数学相关函数

-- 演示数学相关函数
-- ABS(num) 绝对值
SELECT ABS(-10) FROM DUAL
-- BIN (decimal_number )十进制转二进制
SELECT BIN(10) FROM DUAL;
-- CEILING (number2 ) 向上取整, 得到比 num2 大的最小整数
SELECT CEILING(-1.1) FROM DUAL;
-- CONV(number2,from_base,to_base) 进制转换
-- 下面的含义是 8 是十进制的 8, 转成 2 进制输出
SELECT CONV(8, 10, 2) FROM DUAL;
-- 下面的含义是 8 是 16 进制的 8, 转成 2 进制输出
SELECT CONV(16, 16, 10) FROM DUAL;
-- FLOOR (number2 ) 向下取整,得到比 num2 小的最大整数
SELECT FLOOR(-1.1) FROM DUAL;
-- FORMAT (number,decimal_places ) 保留小数位数(四舍五入)
SELECT FORMAT(78.125458,2) FROM DUAL;
-- HEX (DecimalNumber ) 转十六进制
-- LEAST (number , number2 [,..]) 求最小值
SELECT LEAST(0,1, -10, 4) FROM DUAL;
-- MOD (numerator ,denominator ) 求余
SELECT MOD(10, 3) FROM DUAL;
-- RAND([seed]) RAND([seed]) 返回随机数 其范围为 0 ≤ v ≤ 1.0
-- 老韩说明-- 1. 如果使用 rand() 每次返回不同的随机数 ,在 0 ≤ v ≤ 1.0 -- 2. 如果使用 rand(seed) 返回随机数, 范围 0 ≤ v ≤ 1.0, 如果 seed 不变,
-- 该随机数也不变了
SELECT RAND() FROM DUAL;
SELECT 100*RAND() FROM DUAL;
SELECT CURRENT_TIMESTAMP() FROM DUAL;

1.26时间日期相关函数 date.sql



-- 日期时间相关函数
-- CURRENT_DATE (  )    当前日期
SELECT CURRENT_DATE() FROM DUAL;
-- CURRENT_TIME (  )    当前时间
SELECT CURRENT_TIME()  FROM DUAL;
-- CURRENT_TIMESTAMP (  ) 当前时间戳
SELECT CURRENT_TIMESTAMP()  FROM DUAL;-- 创建测试表 信息表
CREATE TABLE mes(id INT , content VARCHAR(30), send_time DATETIME);-- 添加一条记录
INSERT INTO mes VALUES(1, '北京新闻', CURRENT_TIMESTAMP());
INSERT INTO mes VALUES(2, '上海新闻', NOW());
INSERT INTO mes VALUES(3, '广州新闻', NOW());SELECT * FROM mes;
SELECT NOW() FROM DUAL;-- 上应用实例
-- 显示所有新闻信息,发布日期只显示 日期,不用显示时间.
SELECT id,content,DATE(send_time) FROM mes
-- 请查询在10分钟内发布的新闻, 思路一定要梳理一下.
SELECT * FROM mes WHERE DATE_ADD(send_time, INTERVAL 10 MINUTE )>= NOW()SELECT * FROM mesWHERE send_time >= DATE_SUB(NOW(), INTERVAL 10 MINUTE) -- 请在mysql 的sql语句中求出 2011-11-11 和 1990-1-1 相差多少天
SELECT DATEDIFF('2011-11-11', '1990-01-01') FROM DUAL;
-- 请用mysql 的sql语句求出你活了多少天? [练习] 1986-11-11 出生
SELECT DATEDIFF(NOW(), '1999-11-24') FROM DUAL;
-- 如果你能活80岁,求出你还能活多少天.[练习] 1986-11-11 出生
-- 先求出活80岁 时, 是什么日期 X
-- 然后在使用 datediff(x, now()); 1986-11-11->datetime
-- INTERVAL 80 YEAR : YEAR 可以是 年月日,时分秒
-- '1986-11-11' 可以date,datetime timestamp
SELECT DATEDIFF (DATE_ADD('1986-11-11',INTERVAL 80 YEAR),NOW()) FROM DUALSELECT TIMEDIFF('10:11:11', '06:10:10') FROM DUAL;-- YEAR|Month|DAY| DATE (datetime )
SELECT YEAR(NOW()) FROM DUAL;
SELECT MONTH(NOW()) FROM DUAL;
SELECT DAY(NOW()) FROM DUAL;
SELECT MONTH('2013-11-10') FROM DUAL;
-- unix_timestamp() : 返回的是1970-1-1 到现在的秒数
SELECT UNIX_TIMESTAMP() FROM DUAL;
-- FROM_UNIXTIME() : 可以把一个unix_timestamp 秒数[时间戳],转成指定格式的日期
-- %Y-%m-%d 格式是规定好的,表示年月日
-- 意义:在开发中,可以存放一个整数,然后表示时间,通过FROM_UNIXTIME转换
--
SELECT FROM_UNIXTIME(1618483484, '%Y-%m-%d') FROM DUAL;
SELECT FROM_UNIXTIME(1618483100, '%Y-%m-%d %H:%i:%s') FROM DUAL;SELECT * FROM mysql.user \G 

1.27 加密和系统函数 MD5 pwd.sql

-- 演示加密函数和系统函数-- USER()  查询用户
-- 可以查看登录到mysql的有哪些用户,以及登录的IP
SELECT USER() FROM DUAL; -- 用户@IP地址
-- DATABASE()   查询当前使用数据库名称
SELECT DATABASE();-- MD5(str)   为字符串算出一个 MD5 32的字符串,常用(用户密码)加密
-- root 密码是 hsp -> 加密md5 -> 在数据库中存放的是加密后的密码
SELECT MD5('jhjwhduhewfij') FROM DUAL;
SELECT LENGTH(MD5('hsp')) FROM DUAL;-- 演示用户表,存放密码时,是md5
CREATE TABLE hsp_user(id INT , `name` VARCHAR(32) NOT NULL DEFAULT '', pwd CHAR(32) NOT NULL DEFAULT '');
INSERT INTO hsp_user VALUES(100, '韩顺平', MD5('hsp'));
INSERT INTO hsp_user VALUES(102, '大帅', MD5('dashuai'));
SELECT * FROM hsp_user; -- csdnSELECT * FROM hsp_user  -- SQL注入问题WHERE `name`='韩顺平' AND pwd = MD5('hsp')  -- PASSWORD(str) -- 加密函数, MySQL数据库的用户密码就是 PASSWORD函数加密SELECT PASSWORD('hsp') FROM DUAL; -- 数据库的 *81220D972A52D4C51BB1C37518A2613706220DAC-- select * from mysql.user \G     从原文密码str 计算并返回密码字符串
-- 通常用于对mysql数据库的用户密码加密
-- mysql.user 表示 数据库.表
SELECT * FROM mysql.user

1.28 流程控制函数

 # 演示流程控制语句
# IF(expr1,expr2,expr3) 如果 expr1 为 True ,则返回 expr2 否则返回 expr3
SELECT IF(TRUE, '北京', '上海') FROM DUAL;
# IFNULL(expr1,expr2) 如果 expr1 不为空 NULL,则返回 expr1,否则返回 expr2
SELECT IFNULL('giao','韩顺平') FROM DUAL
# SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END; [类似多重分支.]
# 如果 expr1 为 TRUE,则返回 expr2,如果 expr2 为 t, 返回 expr4, 否则返回 expr5
SELECT CASE WHEN TRUE THEN 'jack' WHEN FALSE THEN 'tom' ELSE 'mary' END
SELECT CASE WHEN TRUE THEN '11' WHEN FALSE THEN '22' WHEN TRUE THEN '33' ELSE '44' END-- 1. 查询 emp 表, 如果 comm 是 null , 则显示 0.0
-- 老师说明,判断是否为 null 要使用 is null, 判断不为空 使用 is notSELECT ename, IF(comm IS NULL,0.0,comm) FROM emp
SELECT ename, IFNULL(comm, 0.0) FROM emp;-- 2. 如果 emp 表的 job 是 CLERK 则显示 职员, 如果是 MANAGER 则显示经理
-- 如果是 SALESMAN 则显示 销售人员,其它正常显示
SELECT ename, (CASE WHEN job='CLERK' THEN '职员'WHEN job='MANAGER' THEN '经理'WHEN job='SALESMAN' THEN '销售人员'ELSE job END) AS 'job' FROM emp
SELECT ename, (CASE job WHEN 'CLERK' THEN '职员'WHEN 'MANAGER' THEN '经理'WHEN 'SALESMAN' THEN '销售人员'ELSE job END) AS 'job' FROM emp
SELECT * FROM emp;

1.29 mysql 表查询–加强

1.29.1 介绍

-- 查询加强
-- ■ 使用 where 子句
-- ?如何查找 1992.1.1 后入职的员工
-- 老师说明: 在 mysql 中,日期类型可以直接比较, 需要注意格式
SELECT * FROM emp WHERE hiredate > '1992-01-01'
-- ■ 如何使用 like 操作符(模糊)
-- %: 表示 0 到多个任意字符 _: 表示单个任意字符
-- ?如何显示首字符为 S 的员工姓名和工资
SELECT ename, sal FROM emp WHERE ename LIKE 'S%'
-- ?如何显示第三个字符为大写 O 的所有员工的姓名和工资
SELECT ename, sal FROM emp WHERE ename LIKE '__O%'
-- ■ 如何显示没有上级的雇员的情况
SELECT * FROM emp WHERE mgr IS NULL;
-- ■ 查询表结构 DESC emp
-- 使用 order by 子句
-- ?如何按照工资的从低到高的顺序[升序],显示雇员的信息
SELECT * FROM emp ORDER BY sal
-- ?按照部门号升序而雇员的工资降序排列 , 显示雇员信息
SELECT * FROM emp ORDER BY deptno ASC , sal DESC;

1.29.2 分页查询

-- 分页查询
-- 按雇员的 id 号升序取出, 每页显示 3 条记录,请分别显示 第 1 页,第 2 页,第 3 页
-- 第 1 页
SELECT * FROM emp
ORDER BY empno
LIMIT 0,3
-- 第二页
SELECT * FROM emp
ORDER BY empno
LIMIT 3,3
-- 第三页
SELECT * FROM emp
ORDER BY empno
LIMIT 6,3-- 推导一个公式
SELECT * FROM emp
ORDER BY empno
LIMIT 每页显示记录数 * (第几页-1) , 每页显示记录数
-- 练习:按雇员的empno降序取出,每页显示5条记录。显示第3页
SELECT * FROM emp
ORDER BY empno DESC
LIMIT 10,5-- 测试
SELECT job, COUNT(*) FROM emp GROUP BY job;
-- 显示雇员总数,以及获得补助的雇员数
SELECT COUNT(*) FROM emp WHERE mgr IS NOT NULL;

1.29.3 使用分组函数和分组子句 group by

-- 增强 group by 的使用
-- (1) 显示每种岗位的雇员总数、平均工资。
SELECT COUNT(*), job,avg(sal) FROM emp GROUP BY job
-- (2) 显示雇员总数,以及获得补助的雇员数。
-- 思路: 获得补助的雇员数 就是 comm 列为非 null, 就是 count(列),如果该列的值为 null, 是
-- 不会统计 , SQL 非常灵活,需要我们动脑筋
SELECT COUNT(*) , COUNT(comm) FROM emp
-- 老师的扩展要求:统计没有获得补助的雇员数
SELECT COUNT(if (comm IS NULL,1,NULL)) FROM emp
SELECT COUNT(*), COUNT(*) - COUNT(comm) FROM emp-- (3) 显示管理者的总人数。小技巧:尝试写->修改->尝试[正确的]
SELECT COUNT(DISTINCT mgr) FROM emp;-- (4) 显示雇员工资的最大差额。
-- 思路: max(sal) - min(sal)
SELECT MAX(sal) - MIN(sal) FROM emp;SELECT * FROM emp

1.29.4 数据分组的总结

-- 应用案例:请统计各个部门 group by 的平均工资 avg,
-- 并且是大于 1000 的 having,并且按照平均工资从高到低排序, order by
-- 取出前两行记录 limit 0, 2
SELECT avg(sal) as `sal_avg`, deptno
FROM emp
GROUP BY deptno
HAVING sal_avg >1000
ORDER BY sal_avg desc
LIMIT 0,2

1.30 mysql 多表查询

1.30.1 问题的引出(重点,难点)

1.30.2说明

在这里插入图片描述

1.30.3 多表查询练习 many_tab.sql

-- 多表查询
-- ?显示雇员名,雇员工资及所在部门的名字 【笛卡尔集】
/*
老韩分析 1. 雇员名,雇员工资 来自 emp 表2. 部门的名字 来自 dept 表 3. 需求对 emp 和 dept 查询 ename,sal,dname,deptno 4. 当我们需要指定显示某个表的列是,需要 表.列表 */
SELECT ename,sal, emp.deptno FROM dept,emp WHERE dept.deptno = emp.deptno
-- 老韩小技巧:多表查询的条件不能少于 表的个数-1, 否则会出现笛卡尔集 SELECT * FROM empSELECT * FROM deptSELECT * FROM salgradeSELECT * FROM dept,emp            -- ?如何显示部门号为 10 的部门名、员工名和工资
SELECT ename,sal, emp.deptno,dept.dname FROM dept,emp WHERE dept.deptno = emp.deptno AND emp.deptno = 10;
-- ?显示各个员工的姓名,工资,及其工资的级别
-- 思路 姓名,工资 来自 emp 13
-- 工资级别 salgrade 5
-- 写 sql , 先写一个简单,然后加入过滤条件...
SELECT ename,sal, grade FROM salgrade,emp WHERE sal BETWEEN losal and hisal;
SELECT ename,sal, grade FROM salgrade,emp WHERE sal >=losal and sal <=hisal;
-- 学员练习
-- 显示雇员名,雇员工资及所在部门名字,并按照部门排序【降序】
SELECT ename, sal, dname, emp.deptno FROM emp, deptWHERE emp.deptno=dept.deptno ORDER BY emp.deptno DESC

1.30.4 自连接

-- 多表查询的 自连接
-- 思考题: 显示公司员工名字和他的上级的名字
-- 老韩分析: 员工名字 在 emp, 上级的名字的名字 emp
-- 员工和上级是通过 emp 表的 mgr 列关联
-- 这里老师小结:
-- 自连接的特点 1. 把同一张表当做两张表使用
-- 2. 需要给表取别名 表名 表别名
-- 3. 列名不明确,可以指定列的别名 列名 as 列的别名
SELECT * from emp
SELECT  worker.ename AS '员工' ,boss.ename AS '上级'FROM emp worker, emp bosswhere worker.mgr = boss.empno

1.31 mysql 表子查询

1.31.1 什么是子查询 subquery.sql

子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询

1.31.2 单行子查询

单行子查询是指只返回一行数据的子查询语句

1.31.3 请思考:如何显示与 SMITH 同一部门的所有员工?

1.31.4 多行子查询

多行子查询指返回多行数据的子查询 使用关键字 in

-- 子查询的演示
-- 请思考:如何显示与 SMITH 同一部门的所有员工?
/* 1. 先查询到 SMITH 的部门号得到 2. 把上面的 select 语句当做一个子查询来使用*/
SELECT deptno FROM emp
WHERE ename = 'SMITH'
-- 下面的答案.
SELECT * FROM emp WHERE deptno = ( SELECT deptno FROM emp WHERE ename = 'SMITH' )-- 课堂练习:如何查询和部门 10 的工作相同的雇员的 -- 名字、岗位、工资、部门号, 但是不含 10 号部门自己的雇员./* 1. 查询到 10 号部门有哪些工作 2. 把上面查询的结果当做子查询使用 */ SELECT DISTINCT job FROM empWHERE deptno = 10SELECT * FROM empWHERE job in (SELECT DISTINCT job FROM empWHERE deptno = 10)AND deptno <>10

1.31.5 在多行子查询中使用 all 操作符

1.31.6 在多行子查询中使用 any 操作符

-- all 和 any 的使用
-- 请思考:显示工资比部门 30 的所有员工的工资高的员工的姓名、工资和部门号
SELECT salFROM empWHERE deptno=30SELECT ename,sal,deptno FROM empWHERE sal>ALL(SELECT salFROM empWHERE deptno=30)-- 可以这样写
SELECT ename, sal, deptno FROM emp WHERE sal > ( SELECT MAX(sal) FROM emp WHERE deptno = 30 )
-- 请思考:如何显示工资比部门 30 的其中一个员工的工资高的员工的姓名、工资和部门号
SELECT ename, sal, deptno FROM emp WHERE sal > any( SELECT sal FROM emp WHERE deptno = 30 )SELECT ename, sal, deptno FROM emp WHERE sal >( SELECT MIN(sal) FROM emp WHERE deptno = 30 )

1.31.7 子查询当做临时表使用 练习题 subquery.sql

-- 查询 ecshop 中各个类别中,价格最高的商品 -- 查询 商品表 -- 先得到 各个类别中,价格最高的商品 max + group by cat_id, 当做临时表 -- 把子查询当做一张临时表可以解决很多很多复杂的查询select cat_id , max(shop_price) from ecs_goods group by cat_idselect goods_id, cat_id, goods_name, shop_pricefrom ecs_goods select *from ecs_goodsSELECT  goods_id, ecs_goods.cat_id, goods_name, shop_priceFROM (select cat_id , max(shop_price) AS max_pricefrom ecs_goods group by cat_id) as temp, ecs_goodsWHERE temp.cat_id = ecs_goods.cat_idAND temp.max_price = ecs_goods.shop_priceSELECT goods_id, ecs_goods.cat_id, goods_name, shop_priceFROM ecs_goodsgroup by cat_idHAVING  MAX(shop_price)

临时表

分组 group by

这样有问题

1.31.8 多列子查询 manycolumn.sql

-- 多列子查询
-- 请思考如何查询与 allen 的部门和岗位完全相同的所有雇员(并且不含 allen 本人)
-- (字段 1, 字段 2 ...) = (select 字段 1,字段 2 from 。。。。)
-- 分析: 1. 得到 smith 的部门和岗位
SELECT deptno , job FROM emp WHERE ename = 'ALLEN'
-- 分析: 2 把上面的查询当做子查询来使用,并且使用多列子查询的语法进行匹配
SELECT * FROM emp
WHERE (deptno , job) = (
SELECT deptno , job
FROM emp
WHERE ename = 'ALLEN' )
AND ename != 'ALLEN'-- 请查询 和宋江数学,英语,语文
-- 成绩 完全相同的学生
SELECT * FROM student;
SELECT * FROM student
WHERE (math, english, chinese) = (
SELECT math, english, chinese
FROM student
WHERE `name` = '宋江' )

1.31.9 在 from 子句中使用子查询 subquery03.sql

1.31.10 在 from 子句中使用子查询—课堂小练习

-- 子查询练习
-- 请思考:查找每个部门工资高于本部门平均工资的人的资料
-- 这里要用到数据查询的小技巧,把一个子查询当作一个临时表使用
-- 1. 先得到每个部门的 部门号和 对应的平均工资
SELECT deptno, AVG(sal) AS avg_salFROM empGROUP BY deptno
-- 2. 把上面的结果当做子查询, 和 emp 进行多表查询
SELECT ename, sal, temp.avg_sal, emp.deptno FROM emp, (SELECT deptno, AVG(sal) AS avg_salFROM empGROUP BY deptno) AS tempWHERE emp.deptno = temp.deptno AND temp.avg_sal < emp.sal-- 查找每个部门工资最高的人的详细资料
SELECT deptno, MAX(sal) AS max_salFROM empGROUP BY deptno
SELECT ename, sal, temp.max_sal, emp.deptno FROM emp, (SELECT deptno, MAX(sal) AS max_salFROM empGROUP BY deptno) AS tempWHERE emp.deptno = temp.deptno AND temp.max_sal = emp.sal-- 查询每个部门的信息(包括:部门名,编号,地址)和人员数量,我们一起完成。 -- 1. 部门名,编号,地址 来自 dept 表 -- 2. 各个部门的人员数量 -》 构建一个临时表SELECT COUNT(*), deptno FROM emp GROUP BY deptno;SELECT dname, dept.deptno, loc , temp.per_num AS '人数' FROM dept,(SELECT COUNT(*) AS per_num, deptno FROM emp GROUP BY deptno) as tempWHERE dept.deptno = temp.deptno -- 还有一种写法 表.* 表示将该表所有列都显示出来, 可以简化 sql 语句 -- 在多表查询中,当多个表的列不重复时,才可以直接写列名SELECT tmp.* , dname, loc FROM dept, ( SELECT COUNT(*) AS per_num, deptno FROM emp GROUP BY deptno ) tmp WHERE tmp.deptno = dept.deptno

1.32表复制

1.32.1 自我复制数据(蠕虫复制)

-- 表的复制
-- 为了对某个 sql 语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据
CREATE TABLE my_tab01 (
id INT,
`name` VARCHAR(32),
sal DOUBLE,
job VARCHAR(32),
deptno INT);
DESC my_tab01
SELECT * FROM my_tab01;
-- 演示如何自我复制
-- 1. 先把 emp 表的记录复制到 my_tab01
INSERT INTO my_tab01(id,`name`,sal, job, deptno)SELECT empno, ename, sal, job, deptno FROM emp
-- 2. 自我复制
INSERT INTO my_tab01SELECT * FROM my_tab01
SELECT COUNT(*) FROM my_tab01;-- 如何删除掉一张表重复记录
-- 1. 先创建一张表 my_tab02,
-- 2. 让 my_tab02 有重复的记录
CREATE TABLE my_tab02 LIKE emp; -- 这个语句 把 emp 表的结构(列),复制到 my_tab02
INSERT INTO my_tab02 SELECT * FROM emp
SELECT * FROM my_tab02
-- 3. 考虑去重 my_tab02 的记录
/* 思路(1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样(2) 把 my_tmp 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp (3) 清除掉 my_tab02 记录 (4) 把 my_tmp 表的记录复制到 my_tab02 (5) drop 掉 临时表 my_tmp */-- (1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样
create table my_tmp like my_tab02
-- (2) 把 my_tmp 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp
insert into my_tmp select distinct * from my_tab02;
-- (3) 清除掉 my_tab02 记录
delete from my_tab02;
-- (4) 把 my_tmp 表的记录复制到 my_tab02
insert into my_tab02 select * from my_tmp;
-- (5) drop 掉 临时表
my_tmp drop table my_tmp;
select * from my_tab02;

1.33 合并查询

1.33.1 介绍

-- 合并查询
SELECT ename, sal, job FROM emp WHERE sal > 2500;SELECT ename, sal, job FROM emp WHERE job='MANAGER';-- union all 就是将两个查询结果合并,不会去重
SELECT ename, sal, job FROM emp WHERE sal > 2500
UNION ALL
SELECT ename, sal, job FROM emp WHERE job='MANAGER';
-- union 就是将两个查询结果合并,会去重
SELECT ename, sal, job FROM emp WHERE sal > 2500
UNION
SELECT ename, sal, job FROM emp WHERE job='MANAGER';

1.34 mysql 表外连接

1.34.1 提出一个问题

-- 外连接
-- 比如:列出部门名称和这些部门的员工名称和工作,
-- 同时要求 显示出那些没有员工的部门。
-- 使用我们学习过的多表查询的 SQL, 看看效果如何?
SELECT dname, ename, job
FROM emp, dept
WHERE emp.deptno = dept.deptno
ORDER BY dname-- 创建 stu
/*id
name 1
Jack 2
Tom
3 Kity
4 nono */
CREATE TABLE stu (
id INT, `name` VARCHAR(32));
INSERT INTO stu VALUES(1, 'jack'),(2,'tom'),(3, 'kity'),(4, 'nono');
SELECT * FROM stu;-- 创建 exam
/*id grade
1 56
2 76
11 8
*/
CREATE TABLE exam(
id INT, grade INT);
INSERT INTO exam VALUES(1, 56),(2,76),(11, 8);
SELECT * FROM exam;-- 使用左连接
-- (显示所有人的成绩,如果没有成绩,也要显示该人的姓名和 id 号,成绩显示为空)
SELECT `name`,stu.id, grade
FROM stu, exam
WHERE  stu.id = exam.id-- 改成左外连接
SELECT `name`,stu.id, grade
FROM stu
LEFT JOIN exam
ON stu.id = exam.id-- 使用右外连接(显示所有成绩,如果没有名字匹配,显示空)
-- 即:右边的表(exam) 和左表没有匹配的记录,也会把右表的记录显示出来
SELECT `name`,stu.id, grade
FROM stu
RIGHT JOIN exam
ON stu.id = exam.id-- 列出部门名称和这些部门的员工信息(名字和工作),
-- 同时列出那些没有员工的部门名。5min
-- 使用左外连接实现
SELECT * FROM empSELECT dname, ename,job, sal
FROM dept
LEFT JOIN emp
ON dept.deptno = emp.deptno
-- 使用右外连接实现
SELECT dname, ename, job
FROM emp
RIGHT JOIN dept
ON dept.deptno = emp.deptno

1.34.3 课堂练习

1.35 mysql 约束

1.35.1 基本介绍

1.35.2 primary key(主键)-基本使用

-- 主键使用-- id name    email
CREATE TABLE t17(id INT PRIMARY KEY, -- 表示id列是主键 `name` VARCHAR(32),email VARCHAR(32));-- 主键列的值是不可以重复
INSERT INTO t17VALUES(1, 'jack', 'jack@sohu.com');
INSERT INTO t17VALUES(2, 'tom', 'tom@sohu.com');INSERT INTO t17VALUES(1, 'hsp', 'hsp@sohu.com');SELECT * FROM t17;-- 主键使用的细节讨论
-- primary key不能重复而且不能为 null。
INSERT INTO t17VALUES(NULL, 'hsp', 'hsp@sohu.com');
-- 一张表最多只能有一个主键, 但可以是复合主键(比如 id+name)
CREATE TABLE t18(id INT PRIMARY KEY, -- 表示id列是主键 `name` VARCHAR(32) PRIMARY KEY -- 错误的email VARCHAR(32));
-- 演示复合主键 (id 和 name 做成复合主键)
CREATE TABLE t18(id INT , `name` VARCHAR(32), email VARCHAR(32),PRIMARY KEY (id, `name`) -- 这里就是复合主键);INSERT INTO t18VALUES(1, 'tom', 'tom@sohu.com');
INSERT INTO t18VALUES(1, 'jack', 'jack@sohu.com');
INSERT INTO t18VALUES(1, 'tom', 'xx@sohu.com'); -- 这里就违反了复合主键
SELECT * FROM t18;-- 主键的指定方式 有两种
-- 1. 直接在字段名后指定:字段名  primakry key
-- 2. 在表定义最后写 primary key(列名);
CREATE TABLE t19(id INT , `name` VARCHAR(32) PRIMARY KEY, email VARCHAR(32));CREATE TABLE t20(id INT , `name` VARCHAR(32) , email VARCHAR(32),PRIMARY KEY(`name`) -- 在表定义最后写 primary key(列名));-- 使用desc 表名,可以看到primary key的情况DESC t20 -- 查看 t20表的结果,显示约束的情况
DESC t18

1.35.3 not null(非空)

1.35.4 unique(唯一)

-- unique的使用CREATE TABLE t21(id INT UNIQUE ,  -- 表示 id 列是不可以重复的.`name` VARCHAR(32) , email VARCHAR(32));INSERT INTO t21VALUES(1, 'jack', 'jack@sohu.com');INSERT INTO t21VALUES(1, 'tom', 'tom@sohu.com');-- unqiue使用细节
-- 1. 如果没有指定 not null , 则 unique 字段可以有多个null
-- 如果一个列(字段), 是 unique not null 使用效果类似 primary key
INSERT INTO t21VALUES(NULL, 'tom', 'tom@sohu.com');
SELECT * FROM t21;
-- 2. 一张表可以有多个unique字段CREATE TABLE t22(id INT UNIQUE ,  -- 表示 id 列是不可以重复的.`name` VARCHAR(32) UNIQUE , -- 表示name不可以重复 email VARCHAR(32));
DESC t22

1.35.5 foreign key(外键)

-- 外键演示
-- 创建 主表 my_class
CREATE TABLE my_class (id INT PRIMARY KEY,`name` VARCHAR(32) NOT NULL DEFAULT '');-- 创建 从表  my_stu
CREATE TABLE my_stu ( id INT PRIMARY KEY , -- 学生编号 `name` VARCHAR(32) NOT NULL DEFAULT '', class_id INT , -- 学生所在班级的编号 -- 下面指定外键关系 FOREIGN KEY (class_id) REFERENCES my_class(id))
-- 测试数据
INSERT INTO my_class
VALUES(100, 'java'), (200, 'web'); INSERT INTO my_class
VALUES(300, 'php');SELECT * FROM my_class;
SELECT * FROM my_stu;INSERT INTO my_stu VALUES(1, 'tom', 100);
INSERT INTO my_stu VALUES(2, 'jack', 200);
INSERT INTO my_stu VALUES(3, 'hsp', 300);
INSERT INTO my_stu VALUES(4, 'mary', 400); -- 这里会失败...因为 400 班级不存在INSERT INTO my_stu VALUES(5, 'king', NULL); -- 可以, 外键 没有写 not null
SELECT * FROM my_class;-- 一旦建立主外键的关系,数据不能随意删除了
DELETE FROM my_class WHERE id = 100;

1.35.6 check

-- 演示 check 的使用
-- mysql5.7 目前还不支持 check ,只做语法校验,但不会生效
-- mysq8.0及以上版本已经支持
-- 学习 oracle, sql server, 这两个数据库是真的生效
-- 测试
CREATE TABLE t23 (
id INT PRIMARY KEY,
`name` VARCHAR(32) ,
sex VARCHAR(6) CHECK (sex IN('man','woman')),
sal DOUBLE CHECK ( sal > 1000 AND sal < 2000) );
-- 添加数据
INSERT INTO t23 VALUES(1, 'jack', 'mid', 1);
SELECT * FROM t23

1.35.7 商店售货系统表设计案例[先练,再评 10min]

-- 使用约束的课堂练习
CREATE DATABASE shop_db;
-- 现有一个商店的数据库 shop_db,记录客户及其购物情况,由下面三个表组成:
-- 商品 goods(商品号 goods_id,商品名 goods_name,单价 unitprice,商品类别 category,
-- 供应商 provider);
-- 客户 customer(客户号 customer_id,姓名 name,住址 address,电邮 email 性别 sex,身份证 card_Id);
-- 购买 purchase(购买订单号 order_id,客户号 customer_id,商品号 goods_id,购买数量 nums);
-- 1 建表,在定义中要求声明 [进行合理设计]:
-- (1)每个表的主外键;
-- (2)客户的姓名不能为空值;
-- (3)电邮不能够重复;
-- (4)客户的性别[男|女] check 枚举..
-- (5)单价 unitprice 在 1.0 - 9999.99 之间 check
CREATE TABLE goods ( -- 商品goods_id INT PRIMARY KEY,goods_name VARCHAR(64) NOT NULL DEFAULT'',unitprice DECIMAL(10,2) NOT NULL DEFAULT 0CHECK (unitprice >= 1.0 AND unitprice <= 9999.99),category INT NOT NULL DEFAULT 0,provider VARCHAR(64) NOT NULL DEFAULT '');CREATE TABLE customer(-- 客户customer_id char(8) PRIMARY KEY,`name` VARCHAR(64) NOT NULL DEFAULT '',address VARCHAR(64) NOT NULL DEFAULT'',email VARCHAR(64) UNIQUE NOT NULL , -- UNIQUEsex ENUM('男','女') NOT NULL , -- 这里老师使用的枚举类型, 是生效card_Id CHAR(18));
-- 购买 purchase(购买订单号 order_id,客户号 customer_id,商品号 goods_id, 购买数量 nums);
CREATE TABLE purchase( order_id INT UNSIGNED PRIMARY KEY, customer_id CHAR(8) NOT NULL DEFAULT '', -- 外键约束在后 goods_id INT NOT NULL DEFAULT 0 , -- 外键约束在后 nums INT NOT NULL DEFAULT 0, FOREIGN KEY (customer_id) REFERENCES customer(customer_id), FOREIGN KEY (goods_id) REFERENCES goods(goods_id));

1.36自增长

1.36.1 自增长基本介绍 一个问题

1.36.2 自增长使用细节

-- 演示自增长的使用
-- 创建表
CREATE TABLE t24 (
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(32)NOT NULL DEFAULT '',
`name` VARCHAR(32)NOT NULL DEFAULT '');
DESC t24
-- 测试自增长的使用
INSERT INTO t24 VALUES(NULL, 'tom@qq.com', 'tom');
INSERT INTO t24 (email, `name`) VALUES('hsp@sohu.com', 'hsp');
SELECT * FROM t24;-- 修改默认的自增长开始值
ALTER TABLE t25 AUTO_INCREMENT = 100
CREATE TABLE t25 (id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(32)NOT NULL DEFAULT '',
`name` VARCHAR(32)NOT NULL DEFAULT '');
SELECT * FROM t25
INSERT INTO t25 VALUES(NULL, 'mary@qq.com', 'mary');
INSERT INTO t25 VALUES(666, 'hsp@qq.com', 'hsp');

1.37mysql 索引

1.37.1 索引快速入门

-- 创建测试数据库 tmp
CREATE DATABASE tmp;CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT   UNSIGNED  NOT NULL  DEFAULT 0,
dname VARCHAR(20)  NOT NULL  DEFAULT "",
loc VARCHAR(13) NOT NULL DEFAULT ""
) ;#创建表EMP雇员
CREATE TABLE emp
(empno  MEDIUMINT UNSIGNED  NOT NULL  DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2)  NOT NULL,/*薪水*/
comm DECIMAL(7,2) NOT NULL,/*红利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
) ;#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
losal DECIMAL(17,2)  NOT NULL,
hisal DECIMAL(17,2)  NOT NULL
);#测试数据
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);DELIMITER $$#创建一个函数,名字 rand_string,可以随机返回我指定的个数字符串
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255) #该函数会返回一个字符串
BEGIN
#定义了一个变量 chars_str, 类型  varchar(100)
#默认给 chars_str 初始值   'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'DECLARE chars_str VARCHAR(100) DEFAULT'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; DECLARE return_str VARCHAR(255) DEFAULT '';DECLARE i INT DEFAULT 0; WHILE i < n DO# concat 函数 : 连接函数mysql函数SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));SET i = i + 1;END WHILE;RETURN return_str;END $$#这里我们又自定了一个函数,返回一个随机的部门号
CREATE FUNCTION rand_num( )
RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(10+RAND()*500);
RETURN i;
END $$#创建一个存储过程, 可以添加雇员
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
#set autocommit =0 把autocommit设置成0#autocommit = 0 含义: 不要自动提交SET autocommit = 0; #默认不提交sql语句REPEATSET i = i + 1;#通过前面写的函数随机产生字符串和部门编号,然后加入到emp表INSERT INTO emp VALUES ((START+i) ,rand_string(6),'SALESMAN',0001,CURDATE(),2000,400,rand_num());UNTIL i = max_numEND REPEAT;#commit整体提交所有sql语句,提高效率COMMIT;END $$#添加8000000数据
CALL insert_emp(100001,8000000)$$#命令结束符,再重新设置为;
DELIMITER;

1.37.1索引的原理

SELECT COUNT(*) FROM emp;-- 在没有创建索引时,我们的查询一条记录
SELECT * FROM emp WHERE empno = 1234567
-- 使用索引来优化一下, 体验索引的牛-- 在没有创建索引前 , emp.ibd 文件大小 是 524m
-- 创建索引后 emp.ibd 文件大小 是 655m [索引本身也会占用空间.]
-- 创建ename列索引,emp.ibd 文件大小 是 827m-- empno_index 索引名称
-- ON emp (empno) : 表示在 emp表的 empno列创建索引
CREATE INDEX empno_index ON emp (empno)
CREATE INDEX empno_index ON emp (empno)
-- 创建索引后, 查询的速度如何SELECT * FROM emp WHERE empno = 1234578 -- 0.003s 原来是4.5s-- 创建索引后,只对创建了索引的列有效
SELECT * FROM emp WHERE ename = 'PjDlwy' -- 没有在ename创建索引时,时间4.7sCREATE INDEX ename_index ON emp (ename) -- 在ename上创建索引

1.37.3 索引的类型

1.37.4 索引使用

-- 演示 mysql 的索引的使用
-- 创建索引
CREATE TABLE t25 (
id INT ,
`name` VARCHAR(32));
-- 查询表是否有索引
SHOW INDEX FROM t25
-- 添加索引
-- 添加唯一索引
CREATE UNIQUE INDEX id_index ON t25(id)
-- 添加普通索引方式 1
CREATE INDEX id_index ON t25(id)
-- 如何选择
-- 1. 如果某列的值,是不会重复的,则优先考虑使用 unique 索引, 否则使用普通索引
-- 添加普通索引方式 2
ALTER TABLE t25 ADD INDEX id_index (id)
-- 添加主键索引
CREATE TABLE t26 (
id INT PRIMARY KEY,
`name` VARCHAR(32)); SHOW INDEX FROM t26
ALTER TABLE t26 ADD PRIMARY KEY (id)-- 删除索引
DROP INDEX id_index ON t25
-- 删除主键索引
ALTER table t26 DROP PRIMARY KEY
-- 修改索引 , 先删除,在添加新的索引
-- 查询索引 -- 1. 方式
SHOW INDEX FROM t25
-- 2. 方式
SHOW INDEXES FROM t25
-- 3. 方式
SHOW KEYS FROM t25
-- 4 方式
DESC t25

1.37.5 索引课堂练习

CREATE TABLE `order` (id INT PRIMARY KEY,`name` VARCHAR(32) NOT NULL DEFAULT '',order_person VARCHAR(32) NOT NULL DEFAULT'',num INT);
CREATE TABLE `order1` (id INT UNIQUE NOT NULL,`name` VARCHAR(32) NOT NULL DEFAULT '',order_person VARCHAR(32) NOT NULL DEFAULT'',num INT);
SHOW INDEX FROM `order`
SHOW INDEX FROM `order1`CREATE TABLE `menu` (id INT PRIMARY KEY,`menu_name` VARCHAR(32) NOT NULL DEFAULT '',cook VARCHAR(32) NOT NULL DEFAULT'',customer_id INT(18) UNIQUE NOT NULL)
SHOW INDEX FROM `menu`CREATE TABLE `sportman` (id INT PRIMARY KEY,`name` VARCHAR(32) NOT NULL DEFAULT '',specialty VARCHAR(32) )
CREATE INDEX name_index ON sportman(`name`)
SHOW INDEX FROM `sportman`

1.37.6 小结: 哪些列上适合使用索引

1.38 mysql 事务

1.38.1 什么是事务

1.38.2 事务和锁

-- 事务的一个重要的概念和具体操作
-- 看一个图[看示意图]
-- 演示
-- 1. 创建一张测试表
CREATE TABLE t27 ( id INT, `name` VARCHAR(32))
-- 2. 开始事务
START TRANSACTION
-- 3. 设置保存点
SAVEPOINT a
-- 执行 dml 操作
INSERT INTO t27 VALUES(100, 'tom');
SELECT * FROM t27;SAVEPOINT b
-- 执行 dml 操作
INSERT INTO t27 VALUES(200, 'jack');
-- 回退到 b
ROLLBACK TO b
-- 继续回退 a
ROLLBACK TO a
-- 如果这样, 表示直接回退到事务开始的状态.
ROLLBACK
-- 提交事务
COMMIT

1.38.3 回退事务

1.38.4 提交事务

1.38.5 事务细节讨论 transaction_detail.sql

1.39 mysql 事务隔离级别

1.39.1 事务隔离级别介绍

1.39.2 查看事务隔离级别

1.39.3 事务隔离级别

查询资料后:

mysql中的innoDB引擎(上下两图指的同一个):

1.39.4 mysql 的事务隔离级–案例

1.39.5 设置事务隔离级别

-- 演示 mysql 的事务隔离级别
-- 1. 开了两个 mysql 的控制台
-- 2. 查看当前 mysql 的隔离级别
SELECT @@tx_isolation;
-- mysql> SELECT @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+
-- 3.把其中一个控制台的隔离级别设置
Read uncommitted SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 4. 创建表
CREATE TABLE `account`(
id INT,
`name` VARCHAR(32),
money INT);
-- 查看当前会话隔离级别
SELECT @@tx_isolation
-- 查看系统当前隔离级别
SELECT @@global.tx_isolation
-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [你设置的级别]

1.39.6 事务的课堂练习 [一定要自己去练习,体会]

3:在读未提交的隔离级别下,出现了脏读数据

4:在读已提交的隔离级别下,出现还是才登陆时的数据。当A提交后,C就会看到更新后的数据,出现了不可重复读和幻读。

1.40 mysql 表类型和存储引擎

1.40.1 基本介绍

1.41.2 主要的存储引擎/表类型特点

1.41.3 细节说明

我这里重点给大家介绍三种: MyISAM、InnoDB、MEMORY

1.41.4 三种存储引擎表使用案例

1.41.5 如何选择表的存储引擎

1.41.6修改存储引擎

1.42视图(view)

1.42.1 看一个需求

1.42.2 基本概念

1.42.3 视图的基本使用

1.42.4 完成前面提出的需求 view.sql

-- 视图的使用
-- 创建一个视图 emp_view01,只能查询 emp 表的(empno、ename, job 和 deptno ) 信息
-- 创建视图
CREATE VIEW emp_view1asSELECT empno, ename, job, deptno FROM emp
-- 查看视图         DESC emp_view1SELECT * FROM emp_view1SELECT empno, job FROM emp_view1;-- 查看创建视图的指令SHOW CREATE VIEW emp_view1 -- 删除视图 DROP VIEW emp_view01;
-- 视图的细节
-- 1. 创建视图后,到数据库去看,对应视图只有一个视图结构文件(形式: 视图名.frm)
-- 2. 视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]
-- 修改视图 会影响到基表
UPDATE emp_view1 SET job = 'MANAGER' WHERE empno = 7369SELECT * FROM emp; -- 查询基表
SELECT * FROM emp_view1
-- 修改基本表, 会影响到视图
UPDATE emp SET job = 'SALESMAN' WHERE empno = 7369
-- 3. 视图中可以再使用视图 , 比如从 emp_view01 视图中,选出 empno,和 ename 做出新视图
DESC emp_view1
CREATE VIEW emp_view2 AS SELECT empno, ename FROM emp_view1
SELECT * FROM emp_view2

1.42.5 视图细节讨论

1.42.6 视图最佳实践

1.42.7 视图课堂练习(学员练习)

-- 视图的使用
-- 创建一个视图 emp_view01,只能查询 emp 表的(empno、ename, job 和 deptno ) 信息
-- 创建视图
CREATE VIEW emp_view1asSELECT empno, ename, job, deptno FROM emp
-- 查看视图         DESC emp_view1SELECT * FROM emp_view1SELECT empno, job FROM emp_view1;-- 查看创建视图的指令SHOW CREATE VIEW emp_view1 -- 删除视图 DROP VIEW emp_view01;
-- 视图的细节
-- 1. 创建视图后,到数据库去看,对应视图只有一个视图结构文件(形式: 视图名.frm)
-- 2. 视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]
-- 修改视图 会影响到基表
UPDATE emp_view1 SET job = 'MANAGER' WHERE empno = 7369SELECT * FROM emp; -- 查询基表
SELECT * FROM emp_view1
-- 修改基本表, 会影响到视图
UPDATE emp SET job = 'SALESMAN' WHERE empno = 7369
-- 3. 视图中可以再使用视图 , 比如从 emp_view01 视图中,选出 empno,和 ename 做出新视图
DESC emp_view1
CREATE VIEW emp_view2 AS SELECT empno, ename FROM emp_view1
SELECT * FROM emp_view2

1.43 Mysql 管理

1.43.1 Mysql 用户

1.43.2 创建用户

1.43.3 删除用户

1.43.4 用户修改密码

1.43.5 mysql 中的权限

1.43.6 给用户授权

1.43.7 回收用户授权

1.43.8 权限生效指令

1.43.9 课堂练习题 grant.sq

-- 演示 用户权限的管理
-- 创建用户 shunping 密码 123 , 从本地登录
CREATE USER 'shunping'@'localhost' IDENTIFIED by '123'-- 使用 root 用户创建 testdb ,表 news
CREATE DATABASE testdbCREATE TABLE news ( id INT , content VARCHAR(32));
-- 添加一条测试数据
INSERT INTO news VALUES(100, '北京新闻');
SELECT * FROM news;
-- 给 shunping 分配查看 news 表和 添加 news 的权限
GRANT SELECT ,
INSERT ON testdb.news
TO 'shunping'@'localhost'
-- 可以增加 update 权限
GRANT UPDATE
ON testdb.news
TO 'shunping'@'localhost'
-- 修改 shunping 的密码为 abc
SET PASSWORD FOR 'shunping'@'localhost' = PASSWORD('abc');
-- 回收 shunping 用户在 testdb.news 表的所有权限
REVOKE SELECT , UPDATE, INSERT ON testdb.news FROM 'shunping'@'localhost'
REVOKE ALL ON testdb.news FROM 'shunping'@'localhost'
-- 删除shunping
DROP USER 'shunping'@'localhost'

1.43.10 细节说明 manage_detail.sql

-- 说明 用户管理的细节
-- 在创建用户的时候,如果不指定Host, 则为% , %表示表示所有IP都有连接权限
-- create user  xxx;CREATE USER jackSELECT `host`, `user` FROM mysql.user-- 你也可以这样指定
-- create user  'xxx'@'192.168.1.%'  表示 xxx用户在 192.168.1.*的ip可以登录mysqlCREATE USER 'smith'@'192.168.1.%'-- 在删除用户的时候,如果 host 不是 %, 需要明确指定  '用户'@'host值'DROP USER jack -- 默认就是 DROP USER 'jack'@'%'DROP USER 'smith'@'192.168.1.%'

我亦无他,惟手熟尔

JavaStudy13(MySQL)—B站韩顺平相关推荐

  1. JavaStudy7(18章-坦克大战2)—B站韩顺平

    JavaStudy7(18章-坦克大战2)-B站韩顺平 1.坦克大战 1.1线程-应用到坦克大战 1.1.1 坦克大战 0.3 代码演示: //为了监听 键盘事件, 实现 KeyListener pu ...

  2. JavaStudy5(坦克大战)—B站韩顺平

    JavaStudy5(坦克大战01)-B站韩顺平 跳转坦克大战02: 跳转坦克大战03: 1. 坦克大战 1.1坦克大战游戏演示 1.1.1游戏演示 1.1.2 为什么写这个项目 1.1.3 写项目前 ...

  3. JavaStudy15(27章-满汉楼)—B站韩顺平

    JavaStudy12(27章-满汉楼)-B站hsp 1.程序框架图 2 代码演示 2.1 DAO层 package com.qinbo.mhl.dao;import com.qinbo.mhl.ut ...

  4. Java基础易忘重点内容笔记【附B站韩顺平老师课程链接】

    B站课程链接:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0 1. 文档注释 用于对Java方法的注释,可据此生 ...

  5. JavaStudy4(集合+泛型)—B站韩顺平

    JavaStudy4(集合+泛型)-B站hsp 1.集合 1.1 集合的理解和好处 ​ 前面我们保存多个数据使用的是数组,那么数组有不足的地方,我们分析一下 1.1.1 数组 1.1.2 集合 1.2 ...

  6. B站韩顺平java学习笔记(二十三)-- MYSQL基础篇 章节

    目录 一  数据库 1  数据库简单原理图 2  使用命令行窗口连接MYSQL数据库 3  MySQL三层结构 4  数据在数据库中的存储方式 5  SQL语句分类 6  创建数据库 7  查看.删除 ...

  7. mysql数据库优化韩顺平_韩顺平 Mysql数据库优化(一) 优化概述

    第 1 章Mysql优化概述 网站的瓶颈在web层(web吞吐量),程序对mysql的操作.我们前面讲的页面静态化技术和memcached技术目的减少对mysql访问,但是总是访问数据库,所以我们需要 ...

  8. B站韩顺平老师Linux笔记(截止到85集)

    虚拟机的克隆 虚拟机的快照功能 共享文件夹 主机上的文件夹 虚拟机同步到的文件夹 远程文件的传输 Xftp Vim 输入i进入编辑模式 先按Esc再输入:就进入命令行模式了 输入wq就可以保存并且退出 ...

  9. JavaStudy11(22章-多用户即时通信系统qq)—B站韩顺平

    JavaStudy11(22章-多用户即时通信系统)-B站hsp 1.22章-多用户即时通信系统 1.1 QQ 聊天项目演示 1.1.1 项目 QQ 演示 1.2 为什么选择这个项目 1.2.1 项目 ...

  10. B站韩顺平java学习笔记(十六)-- 多线程基础章节

    目录 一  线程介绍 1  线程相关概念 (1)程序 (2)进程 (3)什么是线程 (4)其他相关概念 (5)查看电脑有多少个cpu核 二  线程的使用 1  线程的创建 (1)继承Thread类,重 ...

最新文章

  1. 国内 Java 开发者必备的两个神器:Maven国内镜像和Spring国内脚手架
  2. META Header
  3. 剑灵选区界面一直正在连接服务器,如何选择服务器 选择困难症的指南
  4. VC问题 IntelliSense:“没有可用的附加信息”,[请参见“C++项目 IntelliSense 疑难解答”,获得进一步的帮助]...
  5. IOS开发之sqlite封装
  6. 计算机内存不足提示栻框,【计算机】计算机文化基础.ppt
  7. XCode6 生成prefix.pch文件
  8. 莫队算法(Mo's_Algorithm)
  9. 『设计模式』我能进来坐坐吗?--访问者模式
  10. numpy 线性代数_数据科学家的线性代数—用NumPy解释
  11. R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean (三,相似距离)
  12. 《CUDA C编程权威指南》——2.4节设备管理
  13. unity3d脚本控制骨骼旋转
  14. tibco往服务器发消息,Tibco EMS 初级使用方法小结
  15. html图片慢慢消失的事件,[Web前端]用javascript实现默认图片替代未显示的图片
  16. cf登录服务器未响应,大神详解win7系统玩cf未响应的图文方法
  17. 图元变形lisp源码_收集和整理的lisp源码 收集整理出来的lisp源代码 - 下载 - 搜珍网...
  18. The Preliminary Contest for ICPC Asia Shanghai 2019 BDL
  19. 红旗桌面4.0正式版最新使用方法和问题解答100例
  20. web服务器的相关配置

热门文章

  1. 微信屏蔽网站域名,提示“已停止访问该网页”该怎么办?
  2. c语言判定条件 i什么意思,c语言 if(!x)中条件!x是什么意思
  3. SCI论文分区有两种方法
  4. Python学习笔记-系统性能信息模块psutil
  5. 若梦博客-优质个人博客
  6. 计算机网络和智能家居,华中科技大学计算机网络专题智能家居与普适计算.ppt...
  7. 微信小程序根据用户当前位置并打开地图选择周边地址,完成外卖地址选择并计算距离
  8. 计算机模糊,电脑显示不清晰_如果计算机显示器模糊或不清楚,该怎么办
  9. 计算机毕业论文房地产营销,万科集团四季花城房地产营销策略研究(毕业论文)...
  10. 关于android 使用audiorecord 录制pcm文件 音频速度变快的问题求教