MySQL

文章目录

数据库

1.DB:数据库,保存一组有组织的数据的容器
2.DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据。
3.SQL:结构化查询语言,用于和DBMS通信的语言

一、MySQL入门

一、安装

mysql-5.5.15-win32.msi

链接:https://pan.baidu.com/s/18qUIwf3gg3rVTZa0tdaiLA
提取码:i0za

1. 环境搭建

image-20210724173429334

image-20210724173713252

image-20210724173724807

image-20210724173733255

image-20210724173808141

image-20210724173820270

image-20210724173829738

image-20210724174012073

image-20210724174044329

2. 安装失败解决办法
  1. 卸载MySQL
  2. 显示隐藏文件选项,从C:\ProgramData\MySQL删除文件目录
  3. 重新安装即可

二、MySql的基础命令

1. 服务启动/停止
net start MySQL
net stop MySQL
2. 登录MySQL
1. mysql -u 用户名 -p 密码
2. mysql -h 主机名 -p 端口号 -u 用户名 -p 密码

_名称插曲及后续使用的文件

名称解释命令
DDL (数据定义语言)定义和管理数据对象,如数据库,数据表等CREATE、DROP、 ALTER
DML (数据操作语 言)用于操作数据库对象中所包含的数据INSERT、UPDATE、 DELETE
DQL (数据查询语 言)用于查询数据库数据SELECT
DCL (数据控制语言)用于管理数据库的语言,包括管理权限及数据更改GRANT、commit、 rollback

链接:https://pan.baidu.com/s/18qUIwf3gg3rVTZa0tdaiLA
提取码:i0za

**注意:**同上网盘连接,内容都有,一样

二、DQL语言(select)

1. 基本语法

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 联合查询
[WHERE ...] -- 指定结果需满足的条件
[GROUP BY ...] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ...] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
-- 指定查询的记录从哪条至哪条

注意:[ ] 括号代表可选的 , { }括号代表必选得

1.1 例子
-- 查询所有学生信息
SELECT * FROM student;
-- 查询指定列(学号 , 姓名)
SELECT studentno,studentname FROM student;

2.起别名

  • 用AS关键字时,按需加双引号;别名中有空格,必须加双引号
-- 这里是为列取别名(当然as关键词可以省略)
SELECT studentno AS 学号,studentname AS 姓名 FROM student;
-- 使用as也可以为表取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;
-- 使用as,为查询结果取一个新名字
-- CONCAT()函数拼接字符串
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;
SELECT salary AS "out put" FROM employees;

2.去重(distinct)

  • 作用 : 去掉SELECT查询返回的记录结果中重复的记录 ( 返回所有列的值都相同 ) , 只返回一条
-- # 查看哪些同学参加了考试(学号) 去除重复项
SELECT * FROM result; -- 查看考试成绩
SELECT studentno FROM result; -- 查看哪些同学参加了考试
SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重复项 , (默认是ALL)

3.表达式

-- selcet查询中可以使用表达式
SELECT @@auto_increment_increment; -- 查询自增步长
SELECT VERSION(); -- 查询版本号
SELECT 100*3-1 AS 计算结果; -- 表达式
-- 学员考试成绩集体提分一分查看
SELECT studentno,StudentResult+1 AS '提分后' FROM result;

4. where条件语句

操作符名称语法描述
AND 或 &&a AND b 或 a && b逻辑与,同时为真结果才为真
OR 或 ||a OR b || a逻辑或,只要一个为真,则结果为真
NOT 或 !NOT a 或 !a逻辑非,若操作数为假,则结果为真!
4.1 例子
-- 满足条件的查询(where)
SELECT Studentno,StudentResult FROM result;
-- 查询考试成绩在95-100之间的
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;
-- AND也可以写成 &&
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 && StudentResult<=100;
-- 模糊查询(对应的词:精确查询)
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult BETWEEN 95 AND 100;
-- 除了1000号同学,要其他同学的成绩
SELECT studentno,studentresult
FROM result
WHERE studentno!=1000;
-- 使用NOT
SELECT studentno,studentresult
FROM result
WHERE NOT studentno=1000;

5. 比较操作符

操作符名称语法描述
IS NULLa IS NULL若操作符为NULL,则结果为真
IS NOT NULLa IS NOT NULL若操作符不为NULL,则结果为真
BETWEENa BETWEEN b AND c若 a 范围在 b 与 c 之间,则结果为真
LIKEa LIKE bSQL 模式匹配,若a匹配b,则结果为真
INa IN (a1,a2,a3,…)若 a 等于 a1,a2… 中的某一个,则结果为真
5.1 like
-- 查询姓刘的同学的学号及姓名
-- like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘%';
-- 查询姓刘的同学,后面只有一个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘_';
-- 查询姓刘的同学,后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘__';
-- 查询姓名中含有 嘉 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '%嘉%';
5.2 in

说明:用于判断某字段的值是否属于in列表中的某一项

  • in不支持通配符
-- 查询学号为1000,1001,1002的学生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);
-- 查询地址在北京,南京,河南洛阳的学生
SELECT studentno,studentname,address FROM student
WHERE address IN ('北京','南京','河南洛阳');
5.3 NULL
-- 查询出生日期没有填写的同学
-- 不能直接写=NULL , 这是代表错误的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;
-- 查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;
-- 查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;
5.4 between

注意事项
①使用between and 可以提高语句的简洁度
②两个临界值不要调换顺序

 --查询员工编号在100到120之间的员工信息
select * from employees where employee_id between 100 and  120;
5.5 is null
--查询没有将近的员工名和奖金率
select last_name,commission_pct from employees where commission_pct is NULL;
  • is null:仅仅可以判断null值,可读性较高
  • < = >:既可以判断NULL值,又可以判断普通的数值,但可读性较低

6. 排序查询

select 查询列表 
from[where 筛选条件] 
order by 排序列表 
[asc(升序)/desc(降序)]
6.1 注意
  1. 不写默认是升序
  2. order by子句中可以支持单个字段、多个字段、表达式、函数、别名
  3. order by子句一般是放在查询语句的最后面,limit子句除外
6.2 例子
--查询员工信息,要求工资从高到低排序
select * from employees order by salary desc
--查询部门编号>=90的员工信息,按入职时间的先后进行排序
select * from employees where department_id>=90 order BY hiredate asc 
--按年薪的高低显示员工的信息和年薪【按表达式排序】
select *,salary*12*(1+ifnull(commission_pct,0)) 年薪 from employees order by salary*12*(1+ifnull(commission_pct,0)) desc
--按年薪的高低显示员工的信息和年薪【按别名排序】
select *,salary*12*(1+ifnull(commission_pct,0)) 年薪 from employees order by 年薪 desc
--按姓名的长度显示员工的姓名和工资【按函数排序】 length()
select LENGTH(last_name) 字节长度,last_name,salary from employees ORDER BY length(last_name) desc;
--查询员工信息,要求先按工资排序,再按员工编号排序【按多个字段排序】
----说明:先紧着第一个排序的顺序来,如果第一个顺序有相同的,那么就安排安第二个顺序来
select * from employees ORDER BY salary asc,employee_id desc;
6.3 练习
--查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
select last_name,department_id,salary*12*(1+ifnull(commission_pct,0)) 年薪 from employees ORDER BY 年薪 desc,last_name  ASC
--选择工资不在8000到17000的员工的姓名和工资,按工资降序
select last_name,salary from employees where salary<8000 or salary>17000 ORDER BY salary DESC
select last_name,salary from employees where salary not BETWEEN 8000 and 17000 ORDER BY salary DESC
--查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
select *,LENGTH(email) 字符长度 from employees where email like '%e%' order by LENGTH(email)  desc ,department_id asc

7. 连接查询(JOIN)

按年代分类按功能分类
sql92标准内连接(等值连接、非等职连接)
sql92标准(推荐)外连接(左外连接、右外连接、全外连接)
交叉连接
操作符名称描述
INNER JOIN如果表中有至少一个匹配,则返回行
LEFT JOIN即使右表中没有匹配,也从左表中返回所有的行
RIGHT JOIN即使左表中没有匹配,也从右表中返回所有的行

image-20210724182820330

image-20210725102503438

image-20210725103005519

7.1 内连接
7.1.1 定义
  • 查询两个表中的结果集中的交集

  • select 查询列表
    from1 别名 [连接类型]
    join2 别名
    on 连接条件
    [here 筛选条件 (相当于92and)]
    [group by 分组]
    [having 筛选条件]
    [order by 排序列表]
    
7.1.2 例子
--查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
7.2 外连接(outer join)
7.2.1 左外连接(left join)
  • 以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充
-- 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
-- 查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL
7.2.2 右外连接(right join)
  • 以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno
7.3 自连接

image-20210725115238794

-- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
-- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`
-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno
-- 查询学员及所属的年级(学号,学生姓名,年级名)
SELECT studentno AS 学号,studentname AS 学生姓名,gradename AS 年级名称
FROM student s
INNER JOIN grade g
ON s.`GradeId` = g.`GradeID`
-- 查询科目及所属的年级(科目名称,年级名称)
SELECT subjectname AS 科目名称,gradename AS 年级名称
FROM SUBJECT sub
INNER JOIN grade g
ON sub.gradeid = g.gradeid
-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'

8. 排序和分页

8.1 排序(Order By)
  • ORDER BY 语句用于根据指定的列对结果集进行排序。
  • ORDER BY 语句默认按照ASC升序对记录进行排序。
  • 如果你希望按照降序对记录进行排序,可以使用 DESC 关键字。
8.1.1 事例
-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
-- 按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC
8.2 分页
8.2.1 语法
SELECT * FROM table
LIMIT [offset,] rows | rows OFFSET offset
8.2.2 分页公式
第一页 : limit 0,5
第二页 : limit 5,5
第三页 : limit 10,5
	...
	...
第N页 : limit (pageNo-1)*pageSzie,pageSzie
[pageNo:页码,pageSize:单页面显示条数]
8.2.3 案例
-- 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5
-- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一学年'
ORDER BY StudentResult DESC
LIMIT 0,10

9. 子查询

9.1 定义
  • 在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
  • 嵌套查询可由多个子查询组成,求解的方式是由里及外;
  • 子查询返回的结果一般都是集合,故而建议使用IN关键字;
9.2 案例
  • 查询数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
-- 方法一:使用连接查询
SELECT studentno,r.subjectno,StudentResult
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult DESC;
-- 方法二:使用子查询(执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
SELECT subjectno FROM `subject`
WHERE subjectname = '数据库结构-1'
)
ORDER BY studentresult DESC;
  • 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名
-- 方法一:使用连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo` = r.`SubjectNo`
WHERE subjectname = '高等数学-2' AND StudentResult>=80
-- 方法二:使用连接查询+子查询
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject`
WHERE subjectname = '高等数学-2'
)
-- 方法三:使用子查询
-- 分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
)
) 
9.3 其他表的相关案例

image-20210725130359443

9.3.1 查询编号>3的女神的男朋友信息,如果有则列出详细,如果没有,用null填充
select g.id,g.`name`,b.*
from beauty g
left outer join boys b
on g.boyfriend_id=b.id
where g.id>3
9.3.2 查询哪个城市没有部门
select city,d.*
from locations l
LEFT OUTER JOIN departments d
on d.location_id=l.location_id
where d.department_id is null
9.3.3 查询部门名为SAL 或IT的员工信息
select department_name,e.*
from employees e
right outer join departments d
on e.department_id=d.department_id
where d.department_name IN('SAL','IT')
9.3.4 谁的工资比Abel高
select * 
from employees 
where salary >  (select salary 
from employees
where last_name ='Abel'
) 
9.3.5 返回job_id与141号员工相同,salary比143号与阿侬多的员工姓名,job_id和工资
SELECT last_name,job_id,salary
from employees
where job_id = (select job_id from employees where employee_id = '141') 
and salary > (select salary from employees where employee_id='143')
9.3.6 返回公司工资最少的员工的last_name,job_id和salary
select last_name,salary,job_id
from employees
where salary=(select min(salary) from employees)
9.3.7 查询最低工资大于50号部门最低工资的部门id和其最低工资
select min(salary),depatment_id
from employees
GROUP BY department_id
HAVING min(salary)>(
select min(salary)
from employees
where department_id = 50
)
9.3.8 返回location_id是1400或1700的部门中的所有员工姓名
select last_name
from employees
where department_id in (
	select DISTINCT department_id
	from departments
	where location_id in (1400,1700)
)
9.3.9 返回其他工种中比job_id为’IT_PROG’部门任一工资低的员工的员工号、姓名、job_id以及salary
select last_name,employee_id,job_id,salary
from employees
where salary < any(
	select distinct salary
	from employees
	where job_id='IT_PROG'
) and job_id <> 'IT_PROG'
9.3.10 查询员工编号最小并且工资最高的员工信息
//用的是之前的方法
select * 
from employees
where employee_id=(
	select min(employee_id)
	from employees
)AND salary = (
	select max(salary)
	from employees
)

//用的是行子查询
select * 
from employees
where (employee_id,salary)=(
	select min(employee_id),max(salary)
	from employees
)
9.3.11 查询每个部门的员工个数
select d.*,(
	select count(*) 
	from employees e
	where e.department_id = d.department_id
) 个数
from departments d
9.3.12 查询员工号=102的部门名
select (
select department_name
from employees,departments d 
where employee_id=102 
and employees.department_id=d.department_id
)
9.3.13 查询每个部门的平均工资的工资登记
select ag_dep.*,g.grade_level
from (
SELECT avg(salary) ag,department_id
from employees e
GROUP BY department_id
) ag_dep
INNER JOIN job_grades g
on ag_dep.ag BETWEEN lowest_sal and highest_sal
9.3.14 查询员工的部门名
select department_name
from departments d
where EXISTS(
	select * 
	from employees e
	where e.department_id=d.department_id
)
9.3.15 查询和Zlotkey相同部门的员工姓名和工资
select last_name,salary
from employees
where department_id = (
	select department_id
	from employees
	where last_name='Zlotkey'
)
9.3.16 查询工资比公司平均工资高的员工的员工号,姓名和工资
select employee_id,last_name,salary
from employees 
where salary > (
	select avg(salary)
	from employees	
)
9.3.17 查询各部门中工资比本部门平均工资高的员工的员工号,姓名和工资
SELECT employee_id,last_name,salary,e.department_id
from employees e
INNER JOIN (
		select avg(salary) ag,department_id
		from employees
		GROUP BY department_id
) ag_dep 
on e.department_id = ag_dep.department_id
where e.salary > ag_dep.ag
9.3.18 查询和姓名中包含字母u的员工共在相同部门的员工的员工号和姓名
select last_name,employee_id
from employees
where department_id IN(
	select DISTINCT department_id
	from employees
	where last_name like '%u%'
)
9.3.19 查询在部门的location_id为1700的部门工作的员工的员工号
select employee_id
from employees
where department_id in (
select department_id
from departments
where location_id=1700
)
9.3.20 查询管理者是King的员工的姓名和工资
select last_name,salary
from employees
where manager_id in(
select employee_id
from employees
where last_name='K_ing'
)
9.3.21 查询工资最高的员工的姓名,要求first_name和last_name显示为一列,列名为姓,名
select CONCAT(last_name,' ',first_name) "姓.名"
from employees 
where salary = (
select max(salary)
from employees
)
9.3.22 查询工资最低的员工信息:last_name,salary
select last_name,salary
from employees
where salary = (
	select min(salary)
	from employees
)
9.3.23 查询平均工资最低的部门信息
select * 
from departments
where department_id=(
		select department_id
		from employees
		GROUP BY department_id
		ORDER BY avg(salary)
		LIMIT 1 
)
9.3.24 查询平均工资最低的部门信息和该部门的平均工资
select d.*,ag 平均工资
from departments d
INNER JOIN(
		select avg(salary) ag,department_id
		from employees
		GROUP BY department_id
		ORDER BY avg(salary)
		LIMIT 1 
) gg
on d.department_id = gg.department_id
9.3.25 查询平均工资最高的job信息
select * 
from jobs
where job_id=(
select job_id
from employees
GROUP BY job_id
ORDER BY avg(salary) DESC
limit 1
)
9.3.26 查询平均工资高于公司平均工资的部门有哪些
select avg(salary),department_id
from employees
GROUP BY department_id
having avg(salary)>(
select avg(salary)
FROM employees
)
9.3.27 查询除公司种所有manager的详细信息
select * 
from employees
where employee_id in(
select DISTINCT manager_id
from employees
)
9.3.28 各个部门中,最高工资中最低的那个部门的最低工资是多少
select min(salary)
from employees
where department_id=(
	select department_id
	from employees
	GROUP BY department_id
	ORDER BY max(salary)
	limit 1 
)
9.3.29 查询平均工资最高的部门的manager的详细信息:last_name,department_id,email,salary
select last_name,d.department_id,email,salary
from employees e
INNER JOIN departments d 
on d.manager_id=e.employee_id
where d.department_id=(
	select department_id
	from employees
	GROUP BY department_id
	ORDER BY avg(salary) desc
	limit 1 
9.3.30 查询每个专业的学生人数
select majorid,count(*)
from student
GROUP BY majorid
9.3.31 查询参加考试的学生中,每个学生的平均分、最高分
select avg(score),max(score),studentno
from result
GROUP BY studentno
9.3.32 查询姓张的每个学生的最低分大于60的学号、姓名
select s.studentno,s.studentname,min(score)
from student s
join result r
on s.studentno=r.studentno
where s.studentname like '张%'
GROUP BY s.studentno
HAVING min(score) > 60
9.3.33 查询生日再‘1998-1-1’后的学生姓名、专业名称
select studentname,majorname
from student s
join major m
on s.majorid=m.majorid
where datediff(borndate,'1988-1-1')>0
9.3.34 查询每个专业的男生人数和女生人数分别是多少
select majorid,
(select count(*) from student where sex='男' and majorid = s.majorid),
(select count(*) from student where sex='女' and majorid = s.majorid)from student s
GROUP BY majorid
9.3.35 查询专业和张翠山一样的学生的最低分
select min(score)
from result
where studentno in (
select studentno
		from student
		where majorid=(
		select majorid
		from student
		where studentname='张翠山'
)
)
9.3.36 查询大于60分的学生的姓名、密码、专业名
select studentname,loginpwd,majorname
from student s
join (
select studentno
from result
where score >60
) a
join major m
on s.studentno=a.studentno
and m.majorid=s.majorid
9.3.37 按邮箱位数分组,查询每组的学生个数
select LENGTH(email),count(*)
from student 
GROUP BY LENGTH(email)
9.3.38 查询学生名、专业名、分数
select studentname,majorname,score
from student s
join major m on s.majorid = m.majorid
left join result r on s.studentno = r.studentno
9.3.39 查询哪个专业没有学生,分别用左连接和有连接实现
select m.majorid,s.*
from major m
LEFT JOIN student s
on m.majorid = s.majorid
where s.studentname is null
9.3.40 查询没有成绩的学生人数
select count(*)
from student s
LEFT JOIN result r on s.studentno=r.studentno
where r.studentno is null

10 练习

10.1 查询90号部门员工的job_id和90号部门的location_id
select job_id,location_id from employees e,departments d where e.department_id = d.department_id and e.department_id=90
10.2 选择所有有奖金的员工的last_name,department_name,location_id,city
select e.last_name,d.department_name,l.location_id,l.city from employees e,locations l,departments d where e.department_id=d.department_id and d.location_id=l.location_id and e.commission_pct is not null
10.3 选择city在Toronto工作的员工的last_name,job_id,department_id,department_name
select last_name,e.job_id,e.department_id,d.department_name from employees e,departments d,locations l where e.department_id=d.department_id and d.location_id=l.location_id and city='Toronto'
10.4 查询每个工种、每个部门的部门名、工种名和最低工资
select job_title,department_name,min(salary) 最低工资 from employees e,departments d,jobs j where e.department_id=d.department_id and j.job_id=e.job_id GROUP BY department_name,job_title
10.5 查询每个国家下的部门个数大于2的国家编号
select l.country_id,count(*) 部门个数 from departments d,locations l where d.location_id=l.location_id group by country_id having count(*)>2

三、常见函数

调用

select 函数名()from 表】;

分类

1. 数据函数

函数用法说明
SELECT ABS(-8);绝对值
SELECT CEILING(9.4);向上取整
SELECT RAND();随机数,返回一个0-1之间的随机数
SELECT SIGN(0);符号函数: 负数返回-1,正数返回1,0返回0
select floor(9.99);//9
select floor(-9.99);//-10
floor 向下取整(<=该参数的最大整数)
select truncate(1.69999,2) 结果1.69截断小数点后几位
select mod(10,3);求余(符号和被除数一样)
1.1 事例
-- 数值函数
abs(x) -- 绝对值 abs(-10.9) = 10
format(x, d) -- 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46
ceil(x) -- 向上取整 ceil(10.1) = 11
floor(x) -- 向下取整 floor (10.1) = 10
round(x) -- 四舍五入去整
mod(m, n) -- m%n m mod n 求余 10%3=1
pi() -- 获得圆周率
pow(m, n) -- m^n
sqrt(x) -- 算术平方根
rand() -- 随机数
truncate(x, d) -- 截取d位小数

2. 字符串函数

函数用法说明
SELECT CHAR_LENGTH(‘Jerry&Crj’);返回字符串包含的字符数
SELECT CONCAT(‘我’,‘爱’,‘Jerry’);合并字符串,参数可以有多个
SELECT INSTR(‘abdefghijkl’,‘def’);//3替换字符串,从某个位置开始替 换某个长度
SELECT LOWER(‘JerryTom’);小写
SELECT UPPER(‘KuangShen’);大写
SELECT LEFT(‘hello,world’,5);从左边截取
SELECT RIGHT(‘hello,world’,5);从右边截取
SELECT REPLACE(‘Jerry坚持就能成功’,‘坚持’,‘努力’);替换字符串
SELECT SUBSTR(‘Jerry坚持就能成功’,4,6);截取字符串,开始和长度
SELECT REVERSE(‘Jerry坚持就能成功’);反转字符串
SELECT TRIM(’ JERRY’);去前后空格
2.1 事例
length(string) 				-- string长度,字节
char_length(string) 		-- string的字符个数
substring(str, position [,length]) 		-- 从str的position开始,取length个字符
replace(str ,search_str ,replace_str) 	-- 在str中用replace_str替换search_str
instr(string ,substring) 	-- 返回substring首次在string中出现的位置
concat(string [,...]) 		-- 连接字串
charset(str) 				-- 返回字串字符集
lcase(string) 				-- 转换成小写
left(string, length) 		-- 从string2中的左边起取length个字符
load_file(file_name) 		-- 从文件读取内容
locate(substring, string [,start_position]) -- 同instr,但可指定开始位置
lpad(string, length, pad) -- 重复用pad加在string开头,直到字串长度为length
ltrim(string) 				-- 去除前端空格
repeat(string, count) 		-- 重复count次
rpad(string, length, pad) 	--在str后用pad补充,直到长度为length
rtrim(string) 				-- 去除后端空格
strcmp(string1 ,string2) 	-- 逐字符比较两字串大小

3. 日期和时间函数

函数用法说明
SELECT CURRENT_DATE();获取当前日期
SELECT CURDATE();获取当前日期
SELECT NOW();获取当前日期和时间
SELECT LOCALTIME();获取当前日期和时间
SELECT SYSDATE();获取当前日期和时间
select str_to_date(‘98-3-2’,’%y-%c-%d’) as out_put将日期格式的字符转换成指定格式的日期
函数用法说明
SELECT YEAR(NOW());当前年份
SELECT MONTH(NOW());当前月份
SELECT DAY(NOW());当前天
SELECT HOUR(NOW());当前小时
SELECT MINUTE(NOW());当前分钟
SELECT SECOND(NOW());当前秒数

在这里插入图片描述

3.1 案例
-- 时间日期函数
now(), current_timestamp(); -- 当前日期时间
current_date(); -- 当前日期
current_time(); -- 当前时间
date('yyyy-mm-dd hh:ii:ss'); -- 获取日期部分
time('yyyy-mm-dd hh:ii:ss'); -- 获取时间部分
date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化时间
unix_timestamp(); -- 获得unix时间戳
from_unixtime(); -- 从时间戳获得时间

--查询入职日期为1992-4-3的员工信息 
	select * 
	from employees 
	where hiredate = '1992-4-3'
---------------------------------
	select * 
	from employees 
	where hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y')
	
--date_format  将日期转换成字符
	select date_format(now(),'%Y年%m月%d日') 
	as 时间
	
--查询有奖金的员工名和入职日期(xx月/xx日 xx年)
	select last_name,DATE_FORMAT(hiredate,'%m月/%d日 %Y年') 入职日期 
    from employees 
    where commission_pct 
    is not null	

4. 系统信息函数

  • SELECT VERSION();//版本
  • SELECT USER();//用户

5. 聚合函数

函数名称说明
COUNT()返回满足Select条件的记录总和数,如 select count(*) 【不建议使用 *,效率低】
SUM()返回数字字段或表达式列作统计,返回一列的总和。
AVG()通常为数值字段或表达列作统计,返回一列的平均值
MAX()可以为数值字段,字符字段或表达式列作统计,返回最大的值。
MIN()可以为数值字段,字符字段或表达式列作统计,返回最小的值。
ROUND()四舍五入
5.1 事例
select sum(salary)  from employees
select avg(salary)  from employees
select max(salary)  from employees
select min(salary)  from employees
select count(salary)  from employees

 select sum(salary),
 avg(salary) 平均,
 max(salary) 最高,
 min(salary) 最低,
 count(salary) 个数 
 from employees
 
 select sum(salary),
 ROUND(avg(salary),2) 平均,
 max(salary) 最高,
 min(salary) 最低,
 count(salary) 个数 
 from employees
5.2 count(1) 和 count(*)的区别
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student;//推荐
  • count(*) 包括了所有的列,相当于行数,在统计结果的时候,包含字段为null 的记录;
  • count(1) 用1代表代码行,在统计结果的时候,包含字段为null 的记录 。
5.3 练习
-- 查询不同课程的平均分,最高分,最低分
-- 前提:根据不同的课程进行分组
SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高
分,MIN(StudentResult) AS 最低分
FROM result AS r
INNER JOIN `subject` AS s
ON r.subjectno = s.subjectno
GROUP BY r.subjectno
HAVING 平均分>80;
5.4 注意

where写在group by前面. 要是放在分组后面的筛选 要使用HAVING… 因为having是从前面筛选的字段再筛选,而where是从数据表中的>字段直接进行的筛选的

6. 流程控制函数

6.1 if函数:if else 的效果
select if(10<5,'大','小')
select last_name,commission_pct,
if(commission_pct is null,'没奖金','有') 备注 
from employees
6.2 case函数 使用一 类似于if else
  • 语法:
case 要判断的字段或表达式
when 常量1 then 要显示的值1(值不要加分号)或语句1;
when 常量2 then 要显示的值2或语句2;
...
else 要显示的值n或语句n
end
--查询员工的工资,要求:部门号=30,显示的工资为1.1倍,部门号=40,显示的工资为1.2倍部门号=50,显示的工资为1.3倍,其他部门,显示的工资为原工资
SELECT salary 原始工资,department_id,
case department_id
when 30 then salary*1.1
when 40 then salary*1.2
when 50 then salary*1.3
else salary
end as 新工资
from employees
6.3 case函数 使用二:类似于 多重 if
  • 语法:
case 
when 条件1 then 要显示的值1语句;
when 条件2 then 要显示的值2语句;
....
else	要显示的值n或语句n
end
--查询员工的工资的情况
----如果工资>20000,显示A级别
----如果工资>15000,显示B级别
----如果工资>10000,显示C级别
select salary,
case 
when salary>20000 then 'A'
when salary>15000	then 'B'
when salary>10000 then 'C'
else 'D'
END as 级别
from employees

7. MD5加密

7.1 insert
--插入新的数据自动加密
INSERT INTO testmd5 VALUES(4,'kuangshen3',md5('123456'));
7.2 select
--查询登录用户信息(md5对比使用,查看用户输入加密后的密码进行比对)
SELECT * FROM testmd5 WHERE `name`='kuangshen' AND pwd=MD5('123456');
7.3 update
--单独对某个用户(如kuangshen)的密码加密:
update testmd5 set pwd = md5(pwd) where name = 'kuangshen2';

四、DML语言(插入、修改、删除)

1. 插入语句

1.1 语法
INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')
1.2 注意
  • 字段或值之间用英文逗号隔开

  • ‘字段1,字段2…’ 该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致

  • 可同时插入多条数据 , values 后用英文逗号隔开

  • 一次插入多条

    • insert into 表名【(字段名,..)values(值,..),(值,...),...;
      
1.3 举例
INSERT INTO grade(gradename) VALUES ('大一');

2. 修改语句

2.1 语法
update1 [别名] 
[left|right|inner join2 别名] 
[on 连接条件]  
set 字段=[,字段=,...]where 筛选条件】;
2.2 注意
  • column_name 为要更改的数据列
  • value 为修改后的数据,可以为变量,具体指,表达式或者嵌套的SELECT结果
  • condition 为筛选条件 , 如不指定则修改该表的所有列数据
2.3 举例
-- 修改年级信息
UPDATE grade SET gradename = '高中' WHERE gradeid = 1;

3. 删除语句

3.1 DELETE
3.1.1 语法
delete1别名,表2别名
from1 别名
inner|left|right join2 别名 on 连接条件
where 筛选条件
3.1.2 举例
-- 删除最后一个数据
DELETE FROM grade WHERE gradeid = 5
3.2 TRUNCATE
3.2.1 语法
truncate table 表名
3.2.2 举例
-- 清空年级表
TRUNCATE grade
3.3 TRUNCATE区别于DELETE命令
  • 相同点
    1. 都能删除数据,不删除表结构,但TRUNCATE速度更快
  • 不同点
    1. truncate删除后,如果再插入,标识列从1开始;delete删除后,如果再插入,标识列从断点开始
    2. truncate不可以添加筛选条件;delete可以添加筛选条件
    3. truncate不可以回滚;delete可以回滚

五、DDL语言(库和表的管理)

1. 库的管理

1.1 创建数据库
create database [if not exists] 数据库名;
1.2 删除数据库
drop database [if exists] 数据库名;
1.3 查看数据库
show databases;
1.4 使用数据库
use 数据库名;

2. 表的管理

2.1 创建数据表
create table [if not exists] `表名`(
'字段名1' 列类型 [属性][索引][注释],
'字段名2' 列类型 [属性][索引][注释],
 ...
'字段名n' 列类型 [属性][索引][注释]
)[表类型][表字符集][注释];
2.2 修改数据表
2.2.1 修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
2.2.2 添加字段
ALTER TABLE 表名 ADD字段名 列属性[属性]
2.2.3 修改字段
ALTER TABLE 表名 MODIFY 字段名 列类型[属性]

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性]
2.2.4 删除字段
ALTER TABLE 表名 DROP 字段名
2.3 删除数据表
 DROP TABLE [IF EXISTS] 表名
 	--IF EXISTS 为可选 , 判断是否存在该数据表
 	--如删除不存在的数据表会抛出错误

3. 类型字段

3.1 数值类型

image-20210725162307500

3.2 字符串类型

image-20210725162336104

3.3 日期类型

image-20210725162355354

4. 数据字段属性

字段属性注意点
UnSigned①无符号的
②声明该数据列不允许负数
ZEROFILL①0填充的
②不足位数的用0来填充 , 如int(3),5则为005
Auto_InCrement(1)自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)
(2)通常用于设置主键 , 且为整数类型
(3)可定义起始值和步长
①当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表
③SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)
NULL 和 NOT NULL①默认为NULL , 即没有插入该列的数值
如果设置为NOT NULL , 则该列必须有值
DEFAULT默认的;用于设置默认值

5. 数据表的类型

CREATE TABLE 表名(
-- 省略一些代码
-- Mysql注释
-- 1. # 单行注释
-- 2. /*...*/ 多行注释
)ENGINE = MyISAM (or InnoDB)
-- 查看mysql所支持的引擎类型 (表类型)
SHOW ENGINES;
  • MySQL的数据表的类型 : MyISAM , InnoDB , HEAP , BOB , CSV等…
5.1 常见的 MyISAM 与 InnoDB 类型:
名称MyISAMInnoDB
事务处理不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间大小教小较大,约 2 倍!
  • 适用 MyISAM的情况: 节约空间及相应速度
  • 适用 InnoDB的情况: 安全性 , 事务处理及多用户操作数据表

二、修改表
1.添加列
alter table 表名 add column 列名 类型 【first|after 字段名】;
2.修改列的类型或约束
alter table 表名 modify column 列名 新类型 【新约束】;
3.修改列名
alter table 表名 change column 旧列名 新列名 类型;
4 .删除列
alter table 表名 drop column 列名;
5.修改表名
alter table 表名 rename 【to】 新表名;

三、删除表
drop table【if exists】 表名;

四、复制表
1、复制表的结构
create table 表名 like 旧表;
2、复制表的结构+数据
create table 表名
select 查询列表 from 旧表【where 筛选】;

6. 其他

6.1 通配符
_ 任意单个字符
% 任意多个字符,甚至包括零字符
单引号需要进行转义 \'
6.2 外键
6.2.1 外键的创建
①方式一
create table 表名(
	字段名 字段类型 not null,#非空
	字段名 字段类型 primary key,#主键
	字段名 字段类型 unique,#唯一
	字段名 字段类型 default,#默认
	constraint 约束名 foreign key(字段名) references 主表(被引用列)
    //例如
    CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`
(`gradeid`)
)
②方式二
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`
(`gradeid`);
6.2.2 外键的删除

注意:: 删除具有主外键关系的表时 , 要先删子表 , 后删主表

-- 删除外键
ALTER TABLE student DROP FOREIGN KEY FK_gradeid;
-- 发现执行完上面的,索引还在,所以还要删除索引
-- 注:这个索引是建立外键的时候默认生成的
ALTER TABLE student DROP INDEX FK_gradeid;

六、TCL语言

1. 事务

1.1 定义
  • 事务就是将一组SQL语句放在同一批次内去执行
  • 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
  • MySQL事务处理只支持InnoDB和BDB数据表类型
1.2 特点(ACID)
  • A 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
  • C 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
  • I 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
  • D 持久性:一个事务一旦提交了,则永久的持久化到本地,并不会被回滚。
1.3 隔离性问题
  1. 脏读:脏读指一个事务读取了另外一个事务未提交的数据。
  2. 不可重复读:不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同。
  3. 虚读(幻读) : 虚读(幻读)是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
1.3 事务实现
1.3.1 语法
-- 使用set语句来改变自动提交模式
SET autocommit = 0; /*关闭*/
SET autocommit = 1; /*开启*/

注意

  • MySQL中默认是自动提交
  • 使用事务时应先关闭自动提交
-- 开始一个事务,标记事务的起始点
START TRANSACTION

-- 提交一个事务给数据库
COMMIT

-- 将事务回滚,数据回到本次事务的初始状态
ROLLBACK

-- 还原MySQL数据库的自动提交
SET autocommit =1;

-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
1.3.2 事例
  • A在线买一款价格为500元商品,网上银行转账. A的银行卡余额为2000,然后给商家B支付500. 商家B一开始的银行卡余额为10000
  • 创建数据库shop和创建表account并插入2条数据
CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `shop`;
CREATE TABLE `account` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`cash` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO account (`name`,`cash`)
VALUES('A',2000.00),('B',10000.00)
-- 转账实现
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION; -- 开始一个事务,标记事务的起始点
UPDATE account SET cash=cash-500 WHERE `name`='A';
UPDATE account SET cash=cash+500 WHERE `name`='B';
COMMIT; -- 提交事务
# rollback;
SET autocommit = 1; -- 恢复自动提交

七、索引

1. 索引作用

  1. 提高查询速度
  2. 确保数据唯一性
  3. 可以加速表和表之间的连接 , 实现表与表之间的参照完整性
  4. 全文检索字段进行搜索优化

2. 索引分类

2.1 主键索引 (Primary Key)
  • 主键 : 某一个属性组能唯一标识一条记录
  • 特点
    1. 确定特定数据记录在数据库中的位置
    2. 最常见的索引类型
2.2 唯一索引 (Unique)
  • 作用 : 避免同一个表中某数据列中的值重复
  • 与主键索引的区别
    • 主键索引只能有一个
    • 唯一索引可能有多个
CREATE TABLE `Grade`(
`GradeID` INT(11) AUTO_INCREMENT PRIMARYKEY,
`GradeName` VARCHAR(32) NOT NULL UNIQUE
-- 或 UNIQUE KEY `GradeID` (`GradeID`)
)
2.3 常规索引 (Index)
  • 作用 : 快速定位特定数据
  • 注意
    1. index 和 key 关键字都可以设置常规索引
    2. 应加在查询找条件的字段
CREATE TABLE `result`(
-- 省略一些代码
INDEX/KEY `ind` (`studentNo`,`subjectNo`) -- 创建表时添加
)
-- 创建后添加
ALTER TABLE `result` ADD INDEX `ind`(`studentNo`,`subjectNo`);
2.4 全文索引 (FullText)
  • 作用 : 快速定位特定数据

3. 索引的数据结构

-- 我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
-- 不同的存储引擎支持的索引类型也不一样
InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive 不支持事务,支持表级别锁定,不支持 B-tree、HashFull-text 等索引;

4. 数据库索引的原理

CodingLabs - MySQL索引背后的数据结构及算法原理

八、权限管理

1. 基本命令

/* 用户和权限管理 */ ------------------
用户信息表:mysql.user
-- 刷新权限
FLUSH PRIVILEGES

-- 增加用户 CREATE USER kuangshen IDENTIFIED BY '123456'
CREATE USER 用户名 IDENTIFIED BY [PASSWORD] 密码(字符串)
- 必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
- 只能创建用户,不能赋予权限。
- 用户名,注意引号:如 'user_name'@'192.168.1.1'
- 密码也需引号,纯数字密码也要加引号
- 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的
混编值,需包含关键字PASSWORD

-- 重命名用户 RENAME USER kuangshen TO kuangshen2
RENAME USER old_user TO new_user

-- 设置密码
SET PASSWORD = PASSWORD('密码') -- 为当前用户设置密码
SET PASSWORD FOR 用户名 = PASSWORD('密码') -- 为指定用户设置密码
-- 删除用户 DROP USER kuangshen2
DROP USER 用户名
-- 分配权限/添加用户
GRANT 权限列表 ON 表名 TO 用户名 [IDENTIFIED BY [PASSWORD] 'password']
- all privileges 表示所有权限
- *.* 表示所有库的所有表
- 库名.表名 表示某库下面的某表
-- 查看权限 SHOW GRANTS FOR root@localhost;
SHOW GRANTS FOR 用户名
-- 查看当前用户权限
SHOW GRANTS;SHOW GRANTS FOR CURRENT_USER;SHOW GRANTS FOR
CURRENT_USER();
-- 撤消权限
REVOKE 权限列表 ON 表名 FROM 用户名
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用户名 -- 撤销所有权限

2. 权限解释

-- 权限列表
ALL [PRIVILEGES] -- 设置除GRANT OPTION之外的所有简单权限
ALTER -- 允许使用ALTER TABLE
ALTER ROUTINE -- 更改或取消已存储的子程序
CREATE -- 允许使用CREATE TABLE
CREATE ROUTINE -- 创建已存储的子程序
CREATE TEMPORARY TABLES -- 允许使用CREATE TEMPORARY TABLE
CREATE USER -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL
PRIVILEGESCREATE VIEW -- 允许使用CREATE VIEW
DELETE -- 允许使用DELETE
DROP -- 允许使用DROP TABLE
EXECUTE -- 允许用户运行已存储的子程序
FILE -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX -- 允许使用CREATE INDEX和DROP INDEX
INSERT -- 允许使用INSERT
LOCK TABLES -- 允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS -- 允许使用SHOW FULL PROCESSLIST
REFERENCES -- 未被实施
RELOAD -- 允许使用FLUSH
REPLICATION CLIENT -- 允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE -- 用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT -- 允许使用SELECT
SHOW DATABASES -- 显示所有数据库
SHOW VIEW -- 允许使用SHOW CREATE VIEW
SHUTDOWN -- 允许使用mysqladmin shutdown
SUPER -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,
mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE -- 允许使用UPDATE
USAGE -- “无权限”的同义词
GRANT OPTION -- 允许授予权限

3. 表维护

-- 分析和存储表的关键字分布
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...
-- 检查一个或多个表是否有错误
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- 整理数据文件的碎片
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

九、规范化数据库设计

1. 三大范式

1.1 第一范式 (1st NF)
  • 第一范式的目标是确保每列的原子性,如果每列都是不可再分的最小数据单元,则满足第一范式
1.2 第二范式(2nd NF)
  • 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一 范式(1NF)。
  • 第二范式要求每个表只描述一件事情
1.3 第三范式(3rd NF)
  • 如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式. 第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值