mysql 8.0.26学习笔记超详细入门到精通

目录

1.基本的SELECT语句

 1.1 查询表中特定字段

1.2 字段取别名 

 1.3 数据去重

  1.4 数据空值替换

 1.5 显示表的结构

 1.6 条件查询where

 2.算术运算符

3.比较运算符

要注意一点 不要让null参与比较运算 

 3.1非符号类型的运算符

 3.2 最大最小运算

 3.3 between...and...

 3.4  noot between...and...

3.5 in 、not in

 3.6 模糊查询 like 

3.7 转义字符\

4.逻辑运算符 

 4.2 优先级

5.排序与分页

5.1 排序规则

5.2分页

 6. 多表查询

6.1表去取别名 

6.2 多表查询的分类

6.2.1 等值连接和非等值连接

6.2.2 自连接,非自连接

 6.2.3 内连接和外连接

7.单行函数

 7.1日期函数的的运用

 7.2日期与时间戳的转换

7.3获取月份、星期、星期数、天数等函数

 7.4 日期格式化和解析

 7.4流程控制函数

 8.聚合函数

8.1 AVG和SUM函数

8.2 MIN和MAX函数

8.3 COUNT函数

8.3 GROUP BY

8.4HAVING

9.子查询

9.1单行子查询

9.2多行子查询

 9.3子查询的其他应用场景

9.4相关子查询

我们发现子查询可以嵌套在很多关键字和函数中我们总结一下

10.EXISTS 与 NOT EXISTS关键字

11.创建数据库

11.1数据库管理

11.2删除数据库

12 创建数据表

12.1创建表

12.2基于现有的表,同时导入数据

12.3 新创建的表的字段的名称基于别名。

​编辑

 12.4表的复制

​编辑

12.5修改表

13.数据处理之增删改

 13.1 单行插入数据

 13. 2 多行插入数据

 13. 3 修改数据

 13. 4删除数据

13.5mysql8新特性计算

数据库材料sql语句


这次选用8.0.26的数据库和Navicat Premium 15作为图像化工具

1.基本的SELECT语句

select * from employees

*代表这个表的全部字段 ,employees表示数据源自那个表

结果

mysql 8.0.26学习笔记超详细入门到精通_第1张图片

 1.1 查询表中特定字段

select employee_id,email,job_id
from employees

注意每个字段要用英文的,隔开

结果

mysql 8.0.26学习笔记超详细入门到精通_第2张图片

1.2 字段取别名 

可以在字段后面

  • {字段}as {别名}
  • {字段} {别名} (中间有空格)
  • {字段} “别名” (中间有空格,不要用单引号)
select employee_id eId,email "邮箱",job_id as jId ,last_name "last name"
from employees

mysql 8.0.26学习笔记超详细入门到精通_第3张图片

 1.3 数据去重

 

 这样查询我们发现会有很多重复的记录

select DISTINCT job_id as jId
from employees

这样就取出重复数据

  1.4 数据空值替换

空值:null 不等同 0和“ ”

mysql 8.0.26学习笔记超详细入门到精通_第4张图片

我们的comm.._ptc(工资增长率)这个字段是有空值和数字的

假如我们计算一个员工一年的的工资 

select employee_id ,salary "一个月的工资",salary*(1+commission_pct )*12 "一年的工资"
from employees

mysql 8.0.26学习笔记超详细入门到精通_第5张图片

 我们发现有的是空有的是有值这个时候我们要替换空的值IFNULL(commission_pct,0)如果这个字段为空我们替换为0

select employee_id ,salary "一个月的工资",salary*(1+IFNULL(commission_pct,0) )*12 "一年的工资"
from employees

 1.5 显示表的结构

或者DESC {表名}

mysql 8.0.26学习笔记超详细入门到精通_第6张图片

 1.6 条件查询where

SELECT * 
FROM employees
WHERE department_id=50;

mysql 8.0.26学习笔记超详细入门到精通_第7张图片

 2.算术运算符

这里比较简单介绍一下即可

加减运算

mysql 8.0.26学习笔记超详细入门到精通_第8张图片

 乘除运算mysql 8.0.26学习笔记超详细入门到精通_第9张图片

取模 

 mysql 8.0.26学习笔记超详细入门到精通_第10张图片

3.比较运算符

要注意一点 不要让null参与比较运算 

mysql 8.0.26学习笔记超详细入门到精通_第11张图片

        等号运算符(=)判断等号两边的值、字符串或表达式是否相等,如果相等则返回1,不相等则返回 0。

        在使用等号运算符时,遵循如下规则: 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的 是每个字符串中字符的ANSI编码是否相等。 如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。 如果等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。 如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。

        对比:SQL中赋值符号使用 :=

        如果不可避免null参与运算,我们要引用<=>这个可以判断null的值

!=null,=null、 <=>null案例

mysql 8.0.26学习笔记超详细入门到精通_第12张图片

 mysql 8.0.26学习笔记超详细入门到精通_第13张图片

 mysql 8.0.26学习笔记超详细入门到精通_第14张图片

 3.1非符号类型的运算符

        在上面的案例讲到和null做运算会有很多不必要的麻烦,然而我们只可以用<=>查询等于空的值我们不能用!=查询不等于的空的值,并且也没有!<=>运算。那我们怎么来查询非空值

        这样我们要了解比较运算符返回的机制

where  commission_pct <=>null
#在commission_pct <=>null 做运算之后真值返回1  假返回0 ,where只显示1值的运算结果

所以我们可以这样查询非空值

mysql 8.0.26学习笔记超详细入门到精通_第15张图片

除此之外我们还可以用函数

ISNULL()

mysql 8.0.26学习笔记超详细入门到精通_第16张图片

is not null

mysql 8.0.26学习笔记超详细入门到精通_第17张图片

 3.2 最大最小运算

least() 最小运算

mysql 8.0.26学习笔记超详细入门到精通_第18张图片

 greatest()最大值运算

mysql 8.0.26学习笔记超详细入门到精通_第19张图片

 3.3 between...and...

SELECT employee_id,salary ,commission_pct
FROM employees
where salary between 3000 and 6000
#前后大小不能调换

mysql 8.0.26学习笔记超详细入门到精通_第20张图片

 等价

SELECT employee_id,salary ,commission_pct
FROM employees
where salary >=3000 && salary <= 6000

 3.4  noot between...and...


SELECT employee_id,salary ,commission_pct
FROM employees
where salary NOT BETWEEN 3000 AND 5500

等价

SELECT employee_id,salary ,commission_pct
FROM employees
where salary <=3000 or salary >= 5500

3.5 in 、not in

        假设我们要查询 工资等于 3000 6000 5000的数据按照上述的方式

mysql 8.0.26学习笔记超详细入门到精通_第21张图片

会比较长,我们可以这样替代

SELECT employee_id,salary ,commission_pct
FROM employees
where salary in(3000,5000,6000)

mysql 8.0.26学习笔记超详细入门到精通_第22张图片

not in 用法相同意思不同 

 3.6 模糊查询 like 

        语法规则 {字段}like '%a%'  

表示查询字段带有a的数据 %表示模糊方向,举个例子,%在a前面表示不管a前面有什么都可以,也就表示查询最后一个字母是a的数据

案例演示

SELECT employee_id,salary ,last_name
FROM employees
where last_name LIKE '%a%'

mysql 8.0.26学习笔记超详细入门到精通_第23张图片

 mysql 8.0.26学习笔记超详细入门到精通_第24张图片mysql 8.0.26学习笔记超详细入门到精通_第25张图片

 假如我我们需要查询第二个字母为a的我们要怎么查询这里我们就要引入下划线_占位的概念

几个下划线表示占几位

mysql 8.0.26学习笔记超详细入门到精通_第26张图片

这样就查到第三个字符为a的数据 

3.7 转义字符\

沿用上面的例子我们需要查询一个数据包含 _a的字符怎么办呢。这个时候我们要在 _前面加上\让系统知道你的\后的字符是普通字符串不是系统的表示方式

错误案例

mysql 8.0.26学习笔记超详细入门到精通_第27张图片

SELECT employee_id,salary ,last_name
FROM employees
where last_name LIKE '%\_a%'

mysql 8.0.26学习笔记超详细入门到精通_第28张图片

 自定义转义字符

​​​​​​​SELECT employee_id,salary ,last_name
FROM employees
where last_name LIKE '%*_a%' ESCAPE '*'

mysql 8.0.26学习笔记超详细入门到精通_第29张图片

 我们自己规定*号是转义字符,需要ESCAPE设定

4.逻辑运算符 

mysql 8.0.26学习笔记超详细入门到精通_第30张图片

上面的案例以及涉及到了这里就不详细记录了。

and同时满足

 mysql 8.0.26学习笔记超详细入门到精通_第31张图片

or满足一个

 mysql 8.0.26学习笔记超详细入门到精通_第32张图片

 xor表示不满足两边的的条件其中一个,这个用的比较少

mysql 8.0.26学习笔记超详细入门到精通_第33张图片

 4.2 优先级

mysql 8.0.26学习笔记超详细入门到精通_第34张图片

 数字编号越大,优先级越高,优先级高的运算符先进行计算。可以看到,赋值运算符的优先级最低,使 用“()”括起来的表达式的优先级最高

5.排序与分页

5.1 排序规则

使用 ORDER BY 子句排序

ASC(ascend): 升序

DESC(descend):降序

ORDER BY 子句在SELECT语句的结尾。

在这我们就强调一下书写的格式,有下列语句

SELECT xxxx,x1x1x1

FROM yyyy

WHERE z=78

ORDER BY qqqq

这这样的格式下执行的顺序是,先执行where->from->select->order by 所以我们要注意,在select中取得字段别名是可以运用的到where语句中 的但是可以在order by使用

  • 升序
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary ASC

mysql 8.0.26学习笔记超详细入门到精通_第35张图片

  •  降序
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC

mysql 8.0.26学习笔记超详细入门到精通_第36张图片​​​​​​​

 mysql 8.0.26学习笔记超详细入门到精通_第37张图片

 二级排序

先按部门升序排列,在排列好的部门顺序下安装工资降序排列

SELECT employee_id,last_name,department_id as "部门",salary "工资"
FROM employees
ORDER BY 部门 ASC , 工资 DESC

 mysql 8.0.26学习笔记超详细入门到精通_第38张图片

5.2分页

用limit page,size关键字实现

需求:每页显示5条记录,当前第1页

mysql 8.0.26学习笔记超详细入门到精通_第39张图片

需求:每页显示5条记录,当前第2页 

mysql 8.0.26学习笔记超详细入门到精通_第40张图片

如果不设置分页查询的结果是

mysql 8.0.26学习笔记超详细入门到精通_第41张图片

 我们观察分页查询的规律,发现它的原理是将所有的数据根基每页size做分组

但是你的page是你的开始地址,相当于程序在你的起始地址做分组,起始地址开始往后的每个size作为一个页数,这样就得出了一个分页公式

LIMIT (page-1)*size,size

SELECT employee_id,last_name,salary
FROM employees
WHERE salary>6000
ORDER BY salary ASC
LIMIT 0,5

查询工资大于6000降序排序让后5行作为一页

mysql 8.0.26学习笔记超详细入门到精通_第42张图片

 mysql 8.0之后 limit x,y等价于 limit y offset x

mysql 8.0.26学习笔记超详细入门到精通_第43张图片

 6. 多表查询

  • 错误示范

假设我们要查员工表的员工所在部门的名称

mysql 8.0.26学习笔记超详细入门到精通_第44张图片

 我们的一共的数据只有107个员工 但是查询的结果有2000+条明显是错误的

因为这种查询方式是自然连接(理论知识详细了解的小伙伴可以去搜一下)笛卡尔积运算

所以这样认定一个employee_id的记录和dep表做连接,一个employee_id的记录就会延伸出多个

employee_id*N。N是dep表的记录数量。

  • 正确 
SELECT employee_id,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id

mysql 8.0.26学习笔记超详细入门到精通_第45张图片

这下就正确了,因为有个员工不属于任何部门所以只有106条数据 ,我们只需要获取employee_id和dep做链接的 dep_id相同的数据。

值得注意的一点

当我们的2个表都有一个相同的字段的时候,就是一个表1的属性作为表2的外码,对于这个同时拥有的属性表表计来自那个I表

SELECT employee_id,department_name,departments.department_id
FROM employees,departments
WHERE employees.department_id=departments.department_id

mysql 8.0.26学习笔记超详细入门到精通_第46张图片

6.1表去取别名 

        属性可以取别名顾名思义表也是可以取别名的,方式也是相同的(尽量还是英文名称)。

这样sql语句看起来就比较简洁了。如果给表取了别名那么 在select和wehere就必须使用这个别名

案例:查询员工的编号部门名称和城市地址

SELECT employee_id,dep.department_name,lo.city
FROM employees emp,departments AS dep,locations As lo 
WHERE emp.`employee_id`=dep.`department_id` AND  dep.`location_id`=lo.`location_id`

6.2 多表查询的分类

6.2.1 等值连接和非等值连接

  • 等值连接就是我们前面的例子讲到的
  • 非等值连接

案例,我们要查一个员工的工资处于什么的样子的水平

SELECT e.last_name,e.salary,j.grade_level
FROM employees e ,job_grades j
-- WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal
WHERE e.salary >= j.lowest_sal AND e.salary <=j.highest_sal

mysql 8.0.26学习笔记超详细入门到精通_第47张图片

6.2.2 自连接,非自连接

非自连接我们上述的案例有2 张不同表的查询就是非自连接

自连接的意思就是在同一张表做查询互相连接

案例,查询员工表中,一个员工的id和姓名,并且查询对应上司的id和姓名。上司也是员工故他们是一张表的信息

SELECT emp.employee_id AS "员工号",emp.last_name "员工姓名",manager.employee_id "上司号", manager.last_name "上司姓名"
FROM employees emp,employees manager
WHERE emp.`manager_id`=manager.`employee_id`

我们在查询表的时候都是来源一个employees 一个取名emp,和manger这样就相当于2个表

让后根据连接条件吧这个查询到的表做连接,一定要取别名

mysql 8.0.26学习笔记超详细入门到精通_第48张图片

 6.2.3 内连接和外连接

mysql 8.0.26学习笔记超详细入门到精通_第49张图片

内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行(图中黄色部分)

外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的 行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。(黄色+黑色部分)

如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。(黄+红色部分)

  • 左外连接
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

mysql 8.0.26学习笔记超详细入门到精通_第50张图片

 这样就会查询到d表为空的记录。

  • 右外连接
  • SELECT e.last_name, e.department_id, d.department_name
    FROM employees e
    RIGHT OUTER JOIN departments d
    ON (e.department_id = d.department_id) ;
    

mysql 8.0.26学习笔记超详细入门到精通_第51张图片

案例dome

显示所有员工的姓名,部门号,部门名称。

因为出现了所有的提示所以员工表需要查询所有的员工因此要引入外连接


SELECT e.last_name "员工姓名",e.department_id "员工所在部门",d.department_name "部门名称"
FROM employees e LEFT JOIN departments d
ON e.department_id=d.department_id

mysql 8.0.26学习笔记超详细入门到精通_第52张图片

案例:选择所有有奖金的员工,查询名称,部门名称,城市id,和城市

SELECT e.last_name,d.department_name,d.location_id,l.city
FROM employees e LEFT JOIN departments d 
ON e.department_id=d.department_id
LEFT JOIN locations l
ON d.location_id=l.location_id
WHERE e.commission_pct IS NOT NULL

mysql 8.0.26学习笔记超详细入门到精通_第53张图片

7.单行函数

mysql 8.0.26学习笔记超详细入门到精通_第54张图片

 mysql 8.0.26学习笔记超详细入门到精通_第55张图片

mysql 8.0.26学习笔记超详细入门到精通_第56张图片

mysql 8.0.26学习笔记超详细入门到精通_第57张图片

 7.1日期函数的的运用

mysql 8.0.26学习笔记超详细入门到精通_第58张图片

SELECT CURDATE(),CURRENT_DATE(),CURTIME(),NOW(),SYSDATE()
,UTC_DATE(),UTC_TIME()

mysql 8.0.26学习笔记超详细入门到精通_第59张图片

 7.2日期与时间戳的转换

mysql 8.0.26学习笔记超详细入门到精通_第60张图片

SELECT UNIX_TIMESTAMP() AS "当时间的",UNIX_TIMESTAMP("1999-11-19 10:06:36") AS "指定时间",
FROM_UNIXTIME(1651562229),FROM_UNIXTIME(942977196)

mysql 8.0.26学习笔记超详细入门到精通_第61张图片

7.3获取月份、星期、星期数、天数等函数

 mysql 8.0.26学习笔记超详细入门到精通_第62张图片

SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()),HOUR(CURTIME()),MINUTE(NOW()),SECOND(SYSDATE())

mysql 8.0.26学习笔记超详细入门到精通_第63张图片


SELECT MONTHNAME(CURDATE()),DAYNAME(CURDATE()),WEEKDAY(CURDATE()),QUARTER(CURDATE()),WEEK(CURDATE(),DAYOFYEAR(NOW())),
DAYOFMONTH(NOW())

 7.4 日期格式化和解析

mysql 8.0.26学习笔记超详细入门到精通_第64张图片

 mysql 8.0.26学习笔记超详细入门到精通_第65张图片

  •  格式化
SELECT DATE_FORMAT(CURDATE(),'%Y-%m-%d %c %d')

mysql 8.0.26学习笔记超详细入门到精通_第66张图片

 7.4流程控制函数

mysql 8.0.26学习笔记超详细入门到精通_第67张图片

SELECT last_name,salary,if(salary>=6000,'高工资','低功资') AS "水平"
FROM employees

mysql 8.0.26学习笔记超详细入门到精通_第68张图片


SELECT last_name,salary,CASE WHEN salary >=15000 THEN "高富帅"
															WHEN salary >=12000 THEN "小康"
															WHEN salary >=10000 THEN "够花"
															WHEN salary >=6000 THEN "生活"
															WHEN salary >=6000 THEN "拮据"
															ELSE "难过"
												END "水平"
FROM employees;

mysql 8.0.26学习笔记超详细入门到精通_第69张图片

 练习2
查询部门号为 10,20, 30 的员工信息, 
若部门号为 10, 则打印其工资的 1.1 倍, 
20 号部门, 则打印其工资的 1.2 倍, 
30 号部门打印其工资的 1.3 倍数、

SELECT e.last_name,d.department_id,d.department_name ,
CASE d.department_id 
WHEN 10 THEN e.salary* 1.1
WHEN 20 THEN e.salary* 1.2
WHEN 30 THEN e.salary* 1.3	
END "工资打印"
FROM employees e,departments d 
WHERE e.department_id=d.department_id
AND e.department_id IN(10,20,30)

mysql 8.0.26学习笔记超详细入门到精通_第70张图片

 练习:查询员工工作的天数,按照年数排序

SELECT employee_id,last_name ,DATEDIFF(NOW(),hire_date) AS "工做天数" ,
DATEDIFF(NOW(),hire_date)/365 AS "工作年数" 
FROM employees
ORDER BY 工作年数 DESC

mysql 8.0.26学习笔记超详细入门到精通_第71张图片

 8.聚合函数

8.1 AVG和SUM函数

SELECT AVG(salary),SUM(salary)
FROM employees

 mysql 8.0.26学习笔记超详细入门到精通_第72张图片

8.2 MIN和MAX函数

SELECT max(salary),min(salary)
FROM employees

 

8.3 COUNT函数

SELECT COUNT(employee_id),COUNT(1)
FROM employees

mysql 8.0.26学习笔记超详细入门到精通_第73张图片

8.3 GROUP BY

 得出每个部门的平均工作


SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;

mysql 8.0.26学习笔记超详细入门到精通_第74张图片

  得出每个部门的每个工种的平均工作

SELECT department_id, job_id ,AVG(salary)
FROM employees
GROUP BY department_id ,job_id ;

mysql 8.0.26学习笔记超详细入门到精通_第75张图片

 注意!如果有多个查询字段做分组 group by要详细指明做分组的所有字段。

案例:查询给个工种的人数

SELECT job_id,COUNT(*)
FROM employees
GROUP BY job_id

8.4HAVING

1. 行已经被分组。

2. 使用了聚合函数。

3. 满足HAVING 子句中条件的分组将被显示。

4. HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。

案例:查询各个部门中最高工资比10000高的部门信息

SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000

要求:如果过滤条件中使用到聚合函数,则必须使用having替代where

               having声明在group by后面 

mysql 8.0.26学习笔记超详细入门到精通_第76张图片

 案例, 查询部门id为 10 20 30 40的这几个部门工资比10000高的部门信息


SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary)>10000

mysql 8.0.26学习笔记超详细入门到精通_第77张图片

SELECT department_id,MAX(salary)
FROM employees

GROUP BY department_id
HAVING MAX(salary)>10000 AND  department_id IN(10,20,30,40)

 我们发现2种方式都是可以的

WHERE和HAVING的对比

区别1:WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件; HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。 这决定了,在需要对数据进行分组统计的时候,HAVING 可以完成 WHERE 不能完成的任务。这是因为, 在查询语法结构中,WHERE 在 GROUP BY 之前,所以无法对分组结果进行筛选。HAVING 在 GROUP BY 之 后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是 WHERE 无法完成 的。另外,WHERE排除的记录不再包括在分组中。

区别2:如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接 后筛选。 这一点,就决定了在关联查询中,WHERE 比 HAVING 更高效。因为 WHERE 可以先筛选,用一 个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。HAVING 则需要 先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用 的资源就比较多,执行效率也较低。

9.子查询

9.1单行子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询

案例:查询工资大于149号的员工工资的信息

SELECT employee_id,last_name,salary
FROM employees 
WHERE salary > (
							SELECT salary 
							FROM employees 
							WHERE employee_id=149
);

我们在里面的查询中先查询149号员工的工资

mysql 8.0.26学习笔记超详细入门到精通_第78张图片

案例:返回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
	)

mysql 8.0.26学习笔记超详细入门到精通_第79张图片

 案例:查询最低工资大于110号部门最低工资的部门id和其最低工资

SELECT department_id,MIN(salary) 
FROM employees
GROUP BY department_id
HAVING  MIN(salary) >(
	SELECT MIN(salary)
	FROM employees
	WHERE department_id=110
	
)

mysql 8.0.26学习笔记超详细入门到精通_第80张图片

 案例:

显式员工的employee_id,last_name和location。
其中,若员工department_id与location_id为1800的department_id相同,
则location为’Canada’,其余则为’USA’。

SELECT employee_id, last_name,
(CASE department_id WHEN(SELECT department_id 
													FROM departments
													WHERE location_id = 1800) THEN 'Canada' ELSE 'USA' END) location
FROM employees

mysql 8.0.26学习笔记超详细入门到精通_第81张图片

9.2多行子查询

mysql 8.0.26学习笔记超详细入门到精通_第82张图片

案例  查询 每个部门最低工资的员工号和员工姓名(in)

SELECT employee_id,last_name
FROM employees
WHERE salary IN (
			SELECT MIN(salary)
			FROM employees
			GROUP BY department_id 
			ORDER BY MIN(salary) DESC
	)

mysql 8.0.26学习笔记超详细入门到精通_第83张图片

案例:(any)

返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary

SELECT last_name,job_id,salary
FROM employees
WHERE job_id='IT_PROG'
AND salary < ANY (
		SELECT salary
		FROM employees
		WHERE job_id='IT_PROG'
)

mysql 8.0.26学习笔记超详细入门到精通_第84张图片

 
题目:(all)

返回其它job_id中比job_id为‘IT_PROG’部门所有工资低的员工的员工号、姓名、job_id 以及salary

SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE job_id !='IT_PROG'
AND salary < ALL(
	SELECT salary
	FROM employees 
	WHERE  job_id ='IT_PROG'
)

mysql 8.0.26学习笔记超详细入门到精通_第85张图片

 9.3子查询的其他应用场景

由于我们的聚合函数是不可以嵌套的,所以我们得要用到子查询

案例:查询平均工资最低的部门id

错误示范


SELECT department_id,MIN(avg(salary))
FROM employees
GROUP BY department_id

正确

SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL(	
			SELECT AVG(salary) avg_sal
			FROM employees
			GROUP BY department_id
			) 

9.4相关子查询

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件 关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询 。 相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。

案例:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id

SELECT department_id ,last_name,salary
FROM employees e1
WHERE salary< (
		SELECT AVG(salary)
		FROM employees e2
		WHERE e1.department_id=e2.department_id
		)

 我们把外部查询的表e1嵌入到子查询

mysql 8.0.26学习笔记超详细入门到精通_第86张图片

 方式2


SELECT e1.department_id ,e1.last_name,e1.salary
FROM employees e1 ,(
											SELECT department_id,AVG(salary) AS avg_salary
											FROM employees
											GROUP BY department_id) AS e2
WHERE e1.department_id=e2.department_id
AND e1.salary>e2.avg_salary


#题目:查询员工的id,salary,按照department_name 排序

SELECT employee_id,salary
FROM employees e
ORDER BY (
     SELECT department_name
     FROM departments d
     WHERE e.`department_id` = d.`department_id`
    ) ASC;

我们发现子查询可以嵌套在很多关键字和函数中我们总结一下

结论:在SELECT中,除了GROUP BY 和 LIMIT之外,其他位置都可以声明子查询!
/*
SELECT ....,....,....(存在聚合函数)
FROM ... (LEFT / RIGHT)JOIN ....ON 多表的连接条件 
(LEFT / RIGHT)JOIN ... ON ....
WHERE 不包含聚合函数的过滤条件
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDER BY ....,...(ASC / DESC )
LIMIT ...,....
*/

案例:查询平均工资最低的部门信息

方式1
SELECT *
FROM departments
WHERE department_id=(
	SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)=(
SELECT MIN(avg_salary) 
FROM (
			SELECT AVG(salary) AS avg_salary
			FROM employees
			GROUP BY department_id) AS e1
)

)
方式2

SELECT *
FROM departments, (SELECT department_id, AVG(salary)
FROM employees 
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 0,1) AS d 
WHERE d.department_id=departments.department_id

10.EXISTS 与 NOT EXISTS关键字

关联子查询通常也会和 EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行。 如果在子查询中不存在满足条件的行: 条件返回 FALSE 继续在子查询中查找 如果在子查询中存在满足条件的行: 不在子查询中继续查找 条件返回 TRUE NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE。

案例:

查询公司管理者的employee_id,last_name,job_id,department_id信息

SELECT employee_id,last_name,job_id,department_id
FROM employees e1
WHERE EXISTS(
	SELECT *
	FROM employees e2
	WHERE e1.manager_id=e2.employee_id
)

mysql 8.0.26学习笔记超详细入门到精通_第87张图片

 案例

查询departments表中,不存在于employees表中的部门的department_id和department_name

SELECT department_id,department_name
FROM departments d
WHERE NOT EXISTS (
		SELECT *
		FROM employees e
		WHERE d.`department_id` = e.`department_id`
		);

mysql 8.0.26学习笔记超详细入门到精通_第88张图片

11.创建数据库

#方式1:
CREATE DATABASE mytest1;  # 创建的此数据库使用的是默认的字符集

#查看创建数据库的结构
SHOW CREATE DATABASE mytest1;

#方式2:显式了指名了要创建的数据库的字符集
CREATE DATABASE mytest2 CHARACTER SET 'gbk';

#
SHOW CREATE DATABASE mytest2;

#方式3(推荐):如果要创建的数据库已经存在,则创建不成功,但不会报错。
CREATE DATABASE IF NOT EXISTS mytest2 CHARACTER SET 'utf8';

#如果要创建的数据库不存在,则创建成功
CREATE DATABASE IF NOT EXISTS mytest3 CHARACTER SET 'utf8';

11.1数据库管理

#查看当前连接中的数据库都有哪些
SHOW DATABASES;

#切换数据库
USE atguigudb;

#查看当前数据库中保存的数据表
SHOW TABLES;

#查看当前使用的数据库
SELECT DATABASE() FROM DUAL;

#查看指定数据库下保存的数据表
SHOW TABLES FROM mysql;

11.2删除数据库

#更改数据库字符集
SHOW CREATE DATABASE mytest2;

ALTER DATABASE mytest2 CHARACTER SET 'utf8';

#1.4 删除数据库
#方式1:如果要删除的数据库存在,则删除成功。如果不存在,则报错
DROP DATABASE mytest1;

SHOW DATABASES;

#方式2:推荐。 如果要删除的数据库存在,则删除成功。如果不存在,则默默结束,不会报错。
DROP DATABASE IF EXISTS mytest1;

DROP DATABASE IF EXISTS mytest2;

12 创建数据表

mysql 8.0.26学习笔记超详细入门到精通_第89张图片

 mysql 8.0.26学习笔记超详细入门到精通_第90张图片

12.1创建表

CREATE TABLE IF NOT EXISTS myemp1(   #需要用户具备创建表的权限。
id INT,
emp_name VARCHAR(15), #使用VARCHAR来定义字符串,必须在使用VARCHAR时指明其长度。
hire_date DATE
);

12.2基于现有的表,同时导入数据

CREATE TABLE myemp2
AS
SELECT employee_id,last_name,salary
FROM employees;#如果这个表来自别的数据库要在前面加上前缀 xxx.

12.3 新创建的表的字段的名称基于别名。

CREATE TABLE dome3
AS 
SELECT e.employee_id "员工Id",e.last_name "员工姓名",d.department_name "部门名称",e.salary "工资"
FROM atguigudb.employees e,atguigudb.departments d
WHERE e.department_id=d.department_id

mysql 8.0.26学习笔记超详细入门到精通_第91张图片

 12.4表的复制

  •         基于上面的12.2只要我们对于原表查询他的所有字段等同于复制结构+数据
  • 仅仅复制结构

我们只需要在查询的条件中设置原表不存在where条件但是查询所以的字段

CREATE TABLE dome4
AS 
SELECT *
FROM atguigudb.departments d
WHERE 1=2

mysql 8.0.26学习笔记超详细入门到精通_第92张图片

12.5修改表

#添加一个字段
ALTER TABLE dome4
ADD phone VARCHAR(255) FIRST
--  删除一个字段
ALTER TABLE dome4
DROP COLUMN phone

-- 修改一个字段:数据类型,长度,默认值
ALTER TABLE dome4
MODIFY manager_id VARCHAR(66)

ALTER TABLE dome4
MODIFY manager_id VARCHAR(66) DEFAULT("78787")

-- 重命名一个字段
ALTER TABLE dome4
CHANGE salary man_id DOUBLE(10,2)

#4. 重命名表
#方式1:
RENAME TABLE domo1
TO domo1_1;
 
--  删除表清空表结构
DROP TABLE IF EXISTS domo1_1

#清空表,表示清空表中的所有数据,但是表结构保留。
TRUNCATE TABLE dome2

#7. DCL 中 COMMIT 和 ROLLBACK
# COMMIT:提交数据。一旦执行COMMIT,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。
# ROLLBACK:回滚数据。一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次COMMIT之后。

#8. 对比 TRUNCATE TABLE 和 DELETE FROM 
# 相同点:都可以实现对表中所有数据的删除,同时保留表结构。
# 不同点:
#    TRUNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
#    DELETE FROM:一旦执行此操作,表数据可以全部清除(不带WHERE)。同时,数据是可以实现回滚的。

/*
9. DDL 和 DML 的说明
  ① DDL的操作一旦执行,就不可回滚。指令SET autocommit = FALSE对DDL操作失效。(因为在执行完DDL
    操作之后,一定会执行一次COMMIT。而此COMMIT操作不受SET autocommit = FALSE影响的。)
  
  ② DML的操作默认情况,一旦执行,也是不可回滚的。但是,如果在执行DML之前,执行了 
    SET autocommit = FALSE,则执行的DML操作就可以实现回滚。

*/

演示

-- 最近提交一次数据
COMMIT
SELECT *
FROM dome3
SET autocommit=FALSE

-- 删除数据
DELETE FROM dome3 
-- 查询不存在数据
SELECT *
FROM dome3

ROLLBACK
-- 查询回滚数据有效
SELECT *
FROM dome3

-- TRUNCATE TABLE 操作
-- 最近提交一次数据
COMMIT
SELECT *
FROM dome3
SET autocommit=FALSE

-- 删除数据
TRUNCATE TABLE dome3
-- 查询不存在数据
SELECT *
FROM dome3

ROLLBACK
-- 查询回滚数据无效
SELECT *
FROM dome3

13.数据处理之增删改

新建一个数据表

mysql 8.0.26学习笔记超详细入门到精通_第93张图片

 13.1 单行插入数据

方式1

注意我们的插入的值的对应属性顺序要和表的顺序一致

INSERT INTO domo1
VALUES(1,"dfp","2022-10-10",1000.1)

mysql 8.0.26学习笔记超详细入门到精通_第94张图片

方式2

不用安装表的顺序,只需要按照我们()里面规定的顺序即可并且可以缺省非主键属性


INSERT INTO domo1(id,emp_name,salary)
VALUES(2,"ccc",155.1)

mysql 8.0.26学习笔记超详细入门到精通_第95张图片

 13. 2 多行插入数据

INSERT INTO domo1(id,emp_name,salary)
VALUES(3,"c3",1551.1),
			(3,"c5",456.1),
			(4,"c4",845.1)

mysql 8.0.26学习笔记超详细入门到精通_第96张图片

 基于现有的表复制到新表

INSERT INTO domo1(id,emp_name,salary,in_date)
SELECT employee_id,last_name,salary,hire_date
FROM employees
WHERE employee_id in(105,108,102,103)

mysql 8.0.26学习笔记超详细入门到精通_第97张图片

 说明:domo1表中要添加数据的字段的长度不能低于employees表中查询的字段的长度。
如果domo1表中要添加数据的字段的长度低于employees表中查询的字段的长度的话,就有添加不成功的风险。

简而言之,就是接收数据的表的属性长度要大于等下数据源的表的字段shu

 13. 3 修改数据

指定修改id=8的时间

UPDATE domo1
SET in_date=NOW()
WHERE id=108

批量修改

UPDATE domo1
SET in_date=NOW(),salary=salary*1.5
WHERE emp_name LIKE '%a%'

 13. 4删除数据


DELETE FROM domo1
WHERE id=2

13.5mysql8新特性计算

声明一个新的表


CREATE TABLE test1(
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL  #字段c即为计算列
);

插入数据

INSERT INTO test1 (a,b)
VALUES(10 ,3)

查看结果

 虽然我们只添加了a,b字段但是会自动帮我合成c字段

数据库材料sql语句

/*
SQLyog Ultimate v12.08 (64 bit)
MySQL - 5.7.28-log : Database - atguigudb
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`atguigudb` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `atguigudb`;

/*Table structure for table `countries` */

DROP TABLE IF EXISTS `countries`;

CREATE TABLE `countries` (
  `country_id` char(2) NOT NULL,
  `country_name` varchar(40) DEFAULT NULL,
  `region_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`country_id`),
  KEY `countr_reg_fk` (`region_id`),
  CONSTRAINT `countr_reg_fk` FOREIGN KEY (`region_id`) REFERENCES `regions` (`region_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `countries` */

insert  into `countries`(`country_id`,`country_name`,`region_id`) values ('AR','Argentina',2),('AU','Australia',3),('BE','Belgium',1),('BR','Brazil',2),('CA','Canada',2),('CH','Switzerland',1),('CN','China',3),('DE','Germany',1),('DK','Denmark',1),('EG','Egypt',4),('FR','France',1),('HK','HongKong',3),('IL','Israel',4),('IN','India',3),('IT','Italy',1),('JP','Japan',3),('KW','Kuwait',4),('MX','Mexico',2),('NG','Nigeria',4),('NL','Netherlands',1),('SG','Singapore',3),('UK','United Kingdom',1),('US','United States of America',2),('ZM','Zambia',4),('ZW','Zimbabwe',4);

/*Table structure for table `departments` */

DROP TABLE IF EXISTS `departments`;

CREATE TABLE `departments` (
  `department_id` int(4) NOT NULL DEFAULT '0',
  `department_name` varchar(30) NOT NULL,
  `manager_id` int(6) DEFAULT NULL,
  `location_id` int(4) DEFAULT NULL,
  PRIMARY KEY (`department_id`),
  UNIQUE KEY `dept_id_pk` (`department_id`),
  KEY `dept_loc_fk` (`location_id`),
  KEY `dept_mgr_fk` (`manager_id`),
  CONSTRAINT `dept_loc_fk` FOREIGN KEY (`location_id`) REFERENCES `locations` (`location_id`),
  CONSTRAINT `dept_mgr_fk` FOREIGN KEY (`manager_id`) REFERENCES `employees` (`employee_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `departments` */

insert  into `departments`(`department_id`,`department_name`,`manager_id`,`location_id`) values (10,'Administration',200,1700),(20,'Marketing',201,1800),(30,'Purchasing',114,1700),(40,'Human Resources',203,2400),(50,'Shipping',121,1500),(60,'IT',103,1400),(70,'Public Relations',204,2700),(80,'Sales',145,2500),(90,'Executive',100,1700),(100,'Finance',108,1700),(110,'Accounting',205,1700),(120,'Treasury',NULL,1700),(130,'Corporate Tax',NULL,1700),(140,'Control And Credit',NULL,1700),(150,'Shareholder Services',NULL,1700),(160,'Benefits',NULL,1700),(170,'Manufacturing',NULL,1700),(180,'Construction',NULL,1700),(190,'Contracting',NULL,1700),(200,'Operations',NULL,1700),(210,'IT Support',NULL,1700),(220,'NOC',NULL,1700),(230,'IT Helpdesk',NULL,1700),(240,'Government Sales',NULL,1700),(250,'Retail Sales',NULL,1700),(260,'Recruiting',NULL,1700),(270,'Payroll',NULL,1700);

/*Table structure for table `employees` */

DROP TABLE IF EXISTS `employees`;

CREATE TABLE `employees` (
  `employee_id` int(6) NOT NULL DEFAULT '0',
  `first_name` varchar(20) DEFAULT NULL,
  `last_name` varchar(25) NOT NULL,
  `email` varchar(25) NOT NULL,
  `phone_number` varchar(20) DEFAULT NULL,
  `hire_date` date NOT NULL,
  `job_id` varchar(10) NOT NULL,
  `salary` double(8,2) DEFAULT NULL,
  `commission_pct` double(2,2) DEFAULT NULL,
  `manager_id` int(6) DEFAULT NULL,
  `department_id` int(4) DEFAULT NULL,
  PRIMARY KEY (`employee_id`),
  UNIQUE KEY `emp_email_uk` (`email`),
  UNIQUE KEY `emp_emp_id_pk` (`employee_id`),
  KEY `emp_dept_fk` (`department_id`),
  KEY `emp_job_fk` (`job_id`),
  KEY `emp_manager_fk` (`manager_id`),
  CONSTRAINT `emp_dept_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`),
  CONSTRAINT `emp_job_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`),
  CONSTRAINT `emp_manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `employees` (`employee_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `employees` */

insert  into `employees`(`employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`hire_date`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`) values (100,'Steven','King','SKING','515.123.4567','1987-06-17','AD_PRES',24000.00,NULL,NULL,90),(101,'Neena','Kochhar','NKOCHHAR','515.123.4568','1989-09-21','AD_VP',17000.00,NULL,100,90),(102,'Lex','De Haan','LDEHAAN','515.123.4569','1993-01-13','AD_VP',17000.00,NULL,100,90),(103,'Alexander','Hunold','AHUNOLD','590.423.4567','1990-01-03','IT_PROG',9000.00,NULL,102,60),(104,'Bruce','Ernst','BERNST','590.423.4568','1991-05-21','IT_PROG',6000.00,NULL,103,60),(105,'David','Austin','DAUSTIN','590.423.4569','1997-06-25','IT_PROG',4800.00,NULL,103,60),(106,'Valli','Pataballa','VPATABAL','590.423.4560','1998-02-05','IT_PROG',4800.00,NULL,103,60),(107,'Diana','Lorentz','DLORENTZ','590.423.5567','1999-02-07','IT_PROG',4200.00,NULL,103,60),(108,'Nancy','Greenberg','NGREENBE','515.124.4569','1994-08-17','FI_MGR',12000.00,NULL,101,100),(109,'Daniel','Faviet','DFAVIET','515.124.4169','1994-08-16','FI_ACCOUNT',9000.00,NULL,108,100),(110,'John','Chen','JCHEN','515.124.4269','1997-09-28','FI_ACCOUNT',8200.00,NULL,108,100),(111,'Ismael','Sciarra','ISCIARRA','515.124.4369','1997-09-30','FI_ACCOUNT',7700.00,NULL,108,100),(112,'Jose Manuel','Urman','JMURMAN','515.124.4469','1998-03-07','FI_ACCOUNT',7800.00,NULL,108,100),(113,'Luis','Popp','LPOPP','515.124.4567','1999-12-07','FI_ACCOUNT',6900.00,NULL,108,100),(114,'Den','Raphaely','DRAPHEAL','515.127.4561','1994-12-07','PU_MAN',11000.00,NULL,100,30),(115,'Alexander','Khoo','AKHOO','515.127.4562','1995-05-18','PU_CLERK',3100.00,NULL,114,30),(116,'Shelli','Baida','SBAIDA','515.127.4563','1997-12-24','PU_CLERK',2900.00,NULL,114,30),(117,'Sigal','Tobias','STOBIAS','515.127.4564','1997-07-24','PU_CLERK',2800.00,NULL,114,30),(118,'Guy','Himuro','GHIMURO','515.127.4565','1998-11-15','PU_CLERK',2600.00,NULL,114,30),(119,'Karen','Colmenares','KCOLMENA','515.127.4566','1999-08-10','PU_CLERK',2500.00,NULL,114,30),(120,'Matthew','Weiss','MWEISS','650.123.1234','1996-07-18','ST_MAN',8000.00,NULL,100,50),(121,'Adam','Fripp','AFRIPP','650.123.2234','1997-04-10','ST_MAN',8200.00,NULL,100,50),(122,'Payam','Kaufling','PKAUFLIN','650.123.3234','1995-05-01','ST_MAN',7900.00,NULL,100,50),(123,'Shanta','Vollman','SVOLLMAN','650.123.4234','1997-10-10','ST_MAN',6500.00,NULL,100,50),(124,'Kevin','Mourgos','KMOURGOS','650.123.5234','1999-11-16','ST_MAN',5800.00,NULL,100,50),(125,'Julia','Nayer','JNAYER','650.124.1214','1997-07-16','ST_CLERK',3200.00,NULL,120,50),(126,'Irene','Mikkilineni','IMIKKILI','650.124.1224','1998-09-28','ST_CLERK',2700.00,NULL,120,50),(127,'James','Landry','JLANDRY','650.124.1334','1999-01-14','ST_CLERK',2400.00,NULL,120,50),(128,'Steven','Markle','SMARKLE','650.124.1434','2000-03-08','ST_CLERK',2200.00,NULL,120,50),(129,'Laura','Bissot','LBISSOT','650.124.5234','1997-08-20','ST_CLERK',3300.00,NULL,121,50),(130,'Mozhe','Atkinson','MATKINSO','650.124.6234','1997-10-30','ST_CLERK',2800.00,NULL,121,50),(131,'James','Marlow','JAMRLOW','650.124.7234','1997-02-16','ST_CLERK',2500.00,NULL,121,50),(132,'TJ','Olson','TJOLSON','650.124.8234','1999-04-10','ST_CLERK',2100.00,NULL,121,50),(133,'Jason','Mallin','JMALLIN','650.127.1934','1996-06-14','ST_CLERK',3300.00,NULL,122,50),(134,'Michael','Rogers','MROGERS','650.127.1834','1998-08-26','ST_CLERK',2900.00,NULL,122,50),(135,'Ki','Gee','KGEE','650.127.1734','1999-12-12','ST_CLERK',2400.00,NULL,122,50),(136,'Hazel','Philtanker','HPHILTAN','650.127.1634','2000-02-06','ST_CLERK',2200.00,NULL,122,50),(137,'Renske','Ladwig','RLADWIG','650.121.1234','1995-07-14','ST_CLERK',3600.00,NULL,123,50),(138,'Stephen','Stiles','SSTILES','650.121.2034','1997-10-26','ST_CLERK',3200.00,NULL,123,50),(139,'John','Seo','JSEO','650.121.2019','1998-02-12','ST_CLERK',2700.00,NULL,123,50),(140,'Joshua','Patel','JPATEL','650.121.1834','1998-04-06','ST_CLERK',2500.00,NULL,123,50),(141,'Trenna','Rajs','TRAJS','650.121.8009','1995-10-17','ST_CLERK',3500.00,NULL,124,50),(142,'Curtis','Davies','CDAVIES','650.121.2994','1997-01-29','ST_CLERK',3100.00,NULL,124,50),(143,'Randall','Matos','RMATOS','650.121.2874','1998-03-15','ST_CLERK',2600.00,NULL,124,50),(144,'Peter','Vargas','PVARGAS','650.121.2004','1998-07-09','ST_CLERK',2500.00,NULL,124,50),(145,'John','Russell','JRUSSEL','011.44.1344.429268','1996-10-01','SA_MAN',14000.00,0.40,100,80),(146,'Karen','Partners','KPARTNER','011.44.1344.467268','1997-01-05','SA_MAN',13500.00,0.30,100,80),(147,'Alberto','Errazuriz','AERRAZUR','011.44.1344.429278','1997-03-10','SA_MAN',12000.00,0.30,100,80),(148,'Gerald','Cambrault','GCAMBRAU','011.44.1344.619268','1999-10-15','SA_MAN',11000.00,0.30,100,80),(149,'Eleni','Zlotkey','EZLOTKEY','011.44.1344.429018','2000-01-29','SA_MAN',10500.00,0.20,100,80),(150,'Peter','Tucker','PTUCKER','011.44.1344.129268','1997-01-30','SA_REP',10000.00,0.30,145,80),(151,'David','Bernstein','DBERNSTE','011.44.1344.345268','1997-03-24','SA_REP',9500.00,0.25,145,80),(152,'Peter','Hall','PHALL','011.44.1344.478968','1997-08-20','SA_REP',9000.00,0.25,145,80),(153,'Christopher','Olsen','COLSEN','011.44.1344.498718','1998-03-30','SA_REP',8000.00,0.20,145,80),(154,'Nanette','Cambrault','NCAMBRAU','011.44.1344.987668','1998-12-09','SA_REP',7500.00,0.20,145,80),(155,'Oliver','Tuvault','OTUVAULT','011.44.1344.486508','1999-11-23','SA_REP',7000.00,0.15,145,80),(156,'Janette','King','JKING','011.44.1345.429268','1996-01-30','SA_REP',10000.00,0.35,146,80),(157,'Patrick','Sully','PSULLY','011.44.1345.929268','1996-03-04','SA_REP',9500.00,0.35,146,80),(158,'Allan','McEwen','AMCEWEN','011.44.1345.829268','1996-08-01','SA_REP',9000.00,0.35,146,80),(159,'Lindsey','Smith','LSMITH','011.44.1345.729268','1997-03-10','SA_REP',8000.00,0.30,146,80),(160,'Louise','Doran','LDORAN','011.44.1345.629268','1997-12-15','SA_REP',7500.00,0.30,146,80),(161,'Sarath','Sewall','SSEWALL','011.44.1345.529268','1998-11-03','SA_REP',7000.00,0.25,146,80),(162,'Clara','Vishney','CVISHNEY','011.44.1346.129268','1997-11-11','SA_REP',10500.00,0.25,147,80),(163,'Danielle','Greene','DGREENE','011.44.1346.229268','1999-03-19','SA_REP',9500.00,0.15,147,80),(164,'Mattea','Marvins','MMARVINS','011.44.1346.329268','2000-01-24','SA_REP',7200.00,0.10,147,80),(165,'David','Lee','DLEE','011.44.1346.529268','2000-02-23','SA_REP',6800.00,0.10,147,80),(166,'Sundar','Ande','SANDE','011.44.1346.629268','2000-03-24','SA_REP',6400.00,0.10,147,80),(167,'Amit','Banda','ABANDA','011.44.1346.729268','2000-04-21','SA_REP',6200.00,0.10,147,80),(168,'Lisa','Ozer','LOZER','011.44.1343.929268','1997-03-11','SA_REP',11500.00,0.25,148,80),(169,'Harrison','Bloom','HBLOOM','011.44.1343.829268','1998-03-23','SA_REP',10000.00,0.20,148,80),(170,'Tayler','Fox','TFOX','011.44.1343.729268','1998-01-24','SA_REP',9600.00,0.20,148,80),(171,'William','Smith','WSMITH','011.44.1343.629268','1999-02-23','SA_REP',7400.00,0.15,148,80),(172,'Elizabeth','Bates','EBATES','011.44.1343.529268','1999-03-24','SA_REP',7300.00,0.15,148,80),(173,'Sundita','Kumar','SKUMAR','011.44.1343.329268','2000-04-21','SA_REP',6100.00,0.10,148,80),(174,'Ellen','Abel','EABEL','011.44.1644.429267','1996-05-11','SA_REP',11000.00,0.30,149,80),(175,'Alyssa','Hutton','AHUTTON','011.44.1644.429266','1997-03-19','SA_REP',8800.00,0.25,149,80),(176,'Jonathon','Taylor','JTAYLOR','011.44.1644.429265','1998-03-24','SA_REP',8600.00,0.20,149,80),(177,'Jack','Livingston','JLIVINGS','011.44.1644.429264','1998-04-23','SA_REP',8400.00,0.20,149,80),(178,'Kimberely','Grant','KGRANT','011.44.1644.429263','1999-05-24','SA_REP',7000.00,0.15,149,NULL),(179,'Charles','Johnson','CJOHNSON','011.44.1644.429262','2000-01-04','SA_REP',6200.00,0.10,149,80),(180,'Winston','Taylor','WTAYLOR','650.507.9876','1998-01-24','SH_CLERK',3200.00,NULL,120,50),(181,'Jean','Fleaur','JFLEAUR','650.507.9877','1998-02-23','SH_CLERK',3100.00,NULL,120,50),(182,'Martha','Sullivan','MSULLIVA','650.507.9878','1999-06-21','SH_CLERK',2500.00,NULL,120,50),(183,'Girard','Geoni','GGEONI','650.507.9879','2000-02-03','SH_CLERK',2800.00,NULL,120,50),(184,'Nandita','Sarchand','NSARCHAN','650.509.1876','1996-01-27','SH_CLERK',4200.00,NULL,121,50),(185,'Alexis','Bull','ABULL','650.509.2876','1997-02-20','SH_CLERK',4100.00,NULL,121,50),(186,'Julia','Dellinger','JDELLING','650.509.3876','1998-06-24','SH_CLERK',3400.00,NULL,121,50),(187,'Anthony','Cabrio','ACABRIO','650.509.4876','1999-02-07','SH_CLERK',3000.00,NULL,121,50),(188,'Kelly','Chung','KCHUNG','650.505.1876','1997-06-14','SH_CLERK',3800.00,NULL,122,50),(189,'Jennifer','Dilly','JDILLY','650.505.2876','1997-08-13','SH_CLERK',3600.00,NULL,122,50),(190,'Timothy','Gates','TGATES','650.505.3876','1998-07-11','SH_CLERK',2900.00,NULL,122,50),(191,'Randall','Perkins','RPERKINS','650.505.4876','1999-12-19','SH_CLERK',2500.00,NULL,122,50),(192,'Sarah','Bell','SBELL','650.501.1876','1996-02-04','SH_CLERK',4000.00,NULL,123,50),(193,'Britney','Everett','BEVERETT','650.501.2876','1997-03-03','SH_CLERK',3900.00,NULL,123,50),(194,'Samuel','McCain','SMCCAIN','650.501.3876','1998-07-01','SH_CLERK',3200.00,NULL,123,50),(195,'Vance','Jones','VJONES','650.501.4876','1999-03-17','SH_CLERK',2800.00,NULL,123,50),(196,'Alana','Walsh','AWALSH','650.507.9811','1998-04-24','SH_CLERK',3100.00,NULL,124,50),(197,'Kevin','Feeney','KFEENEY','650.507.9822','1998-05-23','SH_CLERK',3000.00,NULL,124,50),(198,'Donald','OConnell','DOCONNEL','650.507.9833','1999-06-21','SH_CLERK',2600.00,NULL,124,50),(199,'Douglas','Grant','DGRANT','650.507.9844','2000-01-13','SH_CLERK',2600.00,NULL,124,50),(200,'Jennifer','Whalen','JWHALEN','515.123.4444','1987-09-17','AD_ASST',4400.00,NULL,101,10),(201,'Michael','Hartstein','MHARTSTE','515.123.5555','1996-02-17','MK_MAN',13000.00,NULL,100,20),(202,'Pat','Fay','PFAY','603.123.6666','1997-08-17','MK_REP',6000.00,NULL,201,20),(203,'Susan','Mavris','SMAVRIS','515.123.7777','1994-06-07','HR_REP',6500.00,NULL,101,40),(204,'Hermann','Baer','HBAER','515.123.8888','1994-06-07','PR_REP',10000.00,NULL,101,70),(205,'Shelley','Higgins','SHIGGINS','515.123.8080','1994-06-07','AC_MGR',12000.00,NULL,101,110),(206,'William','Gietz','WGIETZ','515.123.8181','1994-06-07','AC_ACCOUNT',8300.00,NULL,205,110);

/*Table structure for table `job_grades` */

DROP TABLE IF EXISTS `job_grades`;

CREATE TABLE `job_grades` (
  `grade_level` varchar(3) DEFAULT NULL,
  `lowest_sal` int(11) DEFAULT NULL,
  `highest_sal` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `job_grades` */

insert  into `job_grades`(`grade_level`,`lowest_sal`,`highest_sal`) values ('A',1000,2999),('B',3000,5999),('C',6000,9999),('D',10000,14999),('E',15000,24999),('F',25000,40000);

/*Table structure for table `job_history` */

DROP TABLE IF EXISTS `job_history`;

CREATE TABLE `job_history` (
  `employee_id` int(6) NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date NOT NULL,
  `job_id` varchar(10) NOT NULL,
  `department_id` int(4) DEFAULT NULL,
  PRIMARY KEY (`employee_id`,`start_date`),
  UNIQUE KEY `jhist_emp_id_st_date_pk` (`employee_id`,`start_date`),
  KEY `jhist_job_fk` (`job_id`),
  KEY `jhist_dept_fk` (`department_id`),
  CONSTRAINT `jhist_dept_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`),
  CONSTRAINT `jhist_emp_fk` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`employee_id`),
  CONSTRAINT `jhist_job_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `job_history` */

insert  into `job_history`(`employee_id`,`start_date`,`end_date`,`job_id`,`department_id`) values (101,'1989-09-21','1993-10-27','AC_ACCOUNT',110),(101,'1993-10-28','1997-03-15','AC_MGR',110),(102,'1993-01-13','1998-07-24','IT_PROG',60),(114,'1998-03-24','1999-12-31','ST_CLERK',50),(122,'1999-01-01','1999-12-31','ST_CLERK',50),(176,'1998-03-24','1998-12-31','SA_REP',80),(176,'1999-01-01','1999-12-31','SA_MAN',80),(200,'1987-09-17','1993-06-17','AD_ASST',90),(200,'1994-07-01','1998-12-31','AC_ACCOUNT',90),(201,'1996-02-17','1999-12-19','MK_REP',20);

/*Table structure for table `jobs` */

DROP TABLE IF EXISTS `jobs`;

CREATE TABLE `jobs` (
  `job_id` varchar(10) NOT NULL DEFAULT '',
  `job_title` varchar(35) NOT NULL,
  `min_salary` int(6) DEFAULT NULL,
  `max_salary` int(6) DEFAULT NULL,
  PRIMARY KEY (`job_id`),
  UNIQUE KEY `job_id_pk` (`job_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `jobs` */

insert  into `jobs`(`job_id`,`job_title`,`min_salary`,`max_salary`) values ('AC_ACCOUNT','Public Accountant',4200,9000),('AC_MGR','Accounting Manager',8200,16000),('AD_ASST','Administration Assistant',3000,6000),('AD_PRES','President',20000,40000),('AD_VP','Administration Vice President',15000,30000),('FI_ACCOUNT','Accountant',4200,9000),('FI_MGR','Finance Manager',8200,16000),('HR_REP','Human Resources Representative',4000,9000),('IT_PROG','Programmer',4000,10000),('MK_MAN','Marketing Manager',9000,15000),('MK_REP','Marketing Representative',4000,9000),('PR_REP','Public Relations Representative',4500,10500),('PU_CLERK','Purchasing Clerk',2500,5500),('PU_MAN','Purchasing Manager',8000,15000),('SA_MAN','Sales Manager',10000,20000),('SA_REP','Sales Representative',6000,12000),('SH_CLERK','Shipping Clerk',2500,5500),('ST_CLERK','Stock Clerk',2000,5000),('ST_MAN','Stock Manager',5500,8500);

/*Table structure for table `locations` */

DROP TABLE IF EXISTS `locations`;

CREATE TABLE `locations` (
  `location_id` int(4) NOT NULL DEFAULT '0',
  `street_address` varchar(40) DEFAULT NULL,
  `postal_code` varchar(12) DEFAULT NULL,
  `city` varchar(30) NOT NULL,
  `state_province` varchar(25) DEFAULT NULL,
  `country_id` char(2) DEFAULT NULL,
  PRIMARY KEY (`location_id`),
  UNIQUE KEY `loc_id_pk` (`location_id`),
  KEY `loc_c_id_fk` (`country_id`),
  CONSTRAINT `loc_c_id_fk` FOREIGN KEY (`country_id`) REFERENCES `countries` (`country_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `locations` */

insert  into `locations`(`location_id`,`street_address`,`postal_code`,`city`,`state_province`,`country_id`) values (1000,'1297 Via Cola di Rie','00989','Roma',NULL,'IT'),(1100,'93091 Calle della Testa','10934','Venice',NULL,'IT'),(1200,'2017 Shinjuku-ku','1689','Tokyo','Tokyo Prefecture','JP'),(1300,'9450 Kamiya-cho','6823','Hiroshima',NULL,'JP'),(1400,'2014 Jabberwocky Rd','26192','Southlake','Texas','US'),(1500,'2011 Interiors Blvd','99236','South San Francisco','California','US'),(1600,'2007 Zagora St','50090','South Brunswick','New Jersey','US'),(1700,'2004 Charade Rd','98199','Seattle','Washington','US'),(1800,'147 Spadina Ave','M5V 2L7','Toronto','Ontario','CA'),(1900,'6092 Boxwood St','YSW 9T2','Whitehorse','Yukon','CA'),(2000,'40-5-12 Laogianggen','190518','Beijing',NULL,'CN'),(2100,'1298 Vileparle (E)','490231','Bombay','Maharashtra','IN'),(2200,'12-98 Victoria Street','2901','Sydney','New South Wales','AU'),(2300,'198 Clementi North','540198','Singapore',NULL,'SG'),(2400,'8204 Arthur St',NULL,'London',NULL,'UK'),(2500,'Magdalen Centre, The Oxford Science Park','OX9 9ZB','Oxford','Oxford','UK'),(2600,'9702 Chester Road','09629850293','Stretford','Manchester','UK'),(2700,'Schwanthalerstr. 7031','80925','Munich','Bavaria','DE'),(2800,'Rua Frei Caneca 1360 ','01307-002','Sao Paulo','Sao Paulo','BR'),(2900,'20 Rue des Corps-Saints','1730','Geneva','Geneve','CH'),(3000,'Murtenstrasse 921','3095','Bern','BE','CH'),(3100,'Pieter Breughelstraat 837','3029SK','Utrecht','Utrecht','NL'),(3200,'Mariano Escobedo 9991','11932','Mexico City','Distrito Federal,','MX');

/*Table structure for table `order` */

DROP TABLE IF EXISTS `order`;

CREATE TABLE `order` (
  `order_id` int(11) DEFAULT NULL,
  `order_name` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `order` */

insert  into `order`(`order_id`,`order_name`) values (1,'shkstart'),(2,'tomcat'),(3,'dubbo');

/*Table structure for table `regions` */

DROP TABLE IF EXISTS `regions`;

CREATE TABLE `regions` (
  `region_id` int(11) NOT NULL,
  `region_name` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`region_id`),
  UNIQUE KEY `reg_id_pk` (`region_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `regions` */

insert  into `regions`(`region_id`,`region_name`) values (1,'Europe'),(2,'Americas'),(3,'Asia'),(4,'Middle East and Africa');

/*Table structure for table `emp_details_view` */

DROP TABLE IF EXISTS `emp_details_view`;

/*!50001 DROP VIEW IF EXISTS `emp_details_view` */;
/*!50001 DROP TABLE IF EXISTS `emp_details_view` */;

/*!50001 CREATE TABLE  `emp_details_view`(
 `employee_id` int(6) ,
 `job_id` varchar(10) ,
 `manager_id` int(6) ,
 `department_id` int(4) ,
 `location_id` int(4) ,
 `country_id` char(2) ,
 `first_name` varchar(20) ,
 `last_name` varchar(25) ,
 `salary` double(8,2) ,
 `commission_pct` double(2,2) ,
 `department_name` varchar(30) ,
 `job_title` varchar(35) ,
 `city` varchar(30) ,
 `state_province` varchar(25) ,
 `country_name` varchar(40) ,
 `region_name` varchar(25) 
)*/;

/*View structure for view emp_details_view */

/*!50001 DROP TABLE IF EXISTS `emp_details_view` */;
/*!50001 DROP VIEW IF EXISTS `emp_details_view` */;

/*!50001 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `emp_details_view` AS select `e`.`employee_id` AS `employee_id`,`e`.`job_id` AS `job_id`,`e`.`manager_id` AS `manager_id`,`e`.`department_id` AS `department_id`,`d`.`location_id` AS `location_id`,`l`.`country_id` AS `country_id`,`e`.`first_name` AS `first_name`,`e`.`last_name` AS `last_name`,`e`.`salary` AS `salary`,`e`.`commission_pct` AS `commission_pct`,`d`.`department_name` AS `department_name`,`j`.`job_title` AS `job_title`,`l`.`city` AS `city`,`l`.`state_province` AS `state_province`,`c`.`country_name` AS `country_name`,`r`.`region_name` AS `region_name` from (((((`employees` `e` join `departments` `d`) join `jobs` `j`) join `locations` `l`) join `countries` `c`) join `regions` `r`) where ((`e`.`department_id` = `d`.`department_id`) and (`d`.`location_id` = `l`.`location_id`) and (`l`.`country_id` = `c`.`country_id`) and (`c`.`region_id` = `r`.`region_id`) and (`j`.`job_id` = `e`.`job_id`)) */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

14.数据库的约束

      数据库的约束分为2大类:表级约束 和 列级约束。

主要有以下的6种:

NOT NULL 非空约束,规定某个字段不能为空
UNIQUE 唯一约束 规定某个字段在整个表中是唯一的
PRIMARY KEY 主键 ( 非空且唯一 ) 约束
FOREIGN KEY 外键约束
CHECK 检查约束
DEFAULT 默认值约束

14.1 非空约束

        限定某个字段不能为空。

  • 特点:
  1. 空字符串不等于null,0也不等null.
  2. 一个表可以很多列都分限定了非空。
  3. 非空约束只能出现在表的对象的列上,只能某个单列单独限定非空。
关键字:NOT NULL
  • 添加方式:

建表的时候添加

CREATE TABLE 表名称(
 字段名 数据类型, 
字段名 数据类型 NOT NULL, 
字段名 数据类型 NOT NULL 
);

CREATE TABLE demo1(
a VARCHAR(20),
b INT NOT NULL,
c DOUBLE NOT NULL
);

建表后添加

ALTER TABLE demo1 MODIFY a VARCHAR(20) NOT NULL

删除非空约束

ALTER TABLE demo1 MODIFY c DOUBLE null

14.2 唯一性约束

        允许出现多个空置,但是不允许重复。

关键字:UNIQUE

  • 特点:
  1. 同一个表可以有多个唯一约束。
  2. 唯一约束可以是某一列的值唯一,也可以多个列祝贺的唯一值。
  3. 唯一性约束允许列值为空。
  4. 创建唯一约束的时候,不命名唯一约束默认和列名相同。
  5. Mysql会给唯一约束的列上默认创建一个唯一索引。

创建表的时候添加唯一性约束

CREATE TABLE demo2(
	id int,
	phone VARCHAR(20) UNIQUE,#UNIQUE KEY
    name VARCHAR(20)
);

建表后

ALTER table demo2 MODIFY name VARCHAR(20) UNIQUE
ALTER table demo2 ADD UNIQUE key(id)

删除唯一约束

ALTER TABLE demo2 drop INDEX id

14.3 主键约束

        用来唯一标识表中一条记录。

关键字:primary key

  • 特点:
主键约束相当于 唯一约束 + 非空约束的组合 ,主键约束列不允许重复,也不允许出现空值。
一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
主键约束对应着表中的一列或者多列(复合主键)
如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
MySQL 的主键名总是 PRIMARY ,就算自己命名了主键约束名也没用。
建表的时候:
CREATE TABLE demo3 (
	id int PRIMARY KEY,
	name VARCHAR(20),
	phone VARCHAR (20)
	
);

14.4 复合主键


-- 建表的时候添加
CREATE  TABLE demo4(
	 id int ,
	 phone VARCHAR(20),
	 name VARCHAR(20),
	 PRIMARY key( id,phone)
	)
	
	DESC demo4
	
-- 	删除这个表的主键约束
ALTER TABLE demo4 DROP PRIMARY key

14.5 FOREIGN KEY 约束

限定某个表的某个字段的引用完整性。
比如:员工表的员工所在部门的选择,必须在部门表能找到对应的部分。
关键字:FOREIGN key
  • 主表和从表/父表和子表
主表(父表):被引用的表,被参考的表
从表(子表):引用别人的表,参考别人的表
例如:员工表的员工所在部门这个字段的值要参考部门表:部门表是主表,员工表是从表。
例如:学生表、课程表、选课表:选课表的学生和课程要分别参考学生表和课程表,学生表和课程表是 主表,选课表是从表。
  • 特点
从表的外键列,必须引用 / 参考主表的主键或唯一约束的列
创建 (CREATE) 表时就指定外键约束的话,先创建主表,再创建从表
删表时,先删从表(或先删除外键约束),再删除主表
  • 添加外键约束
create table 主表名称( 字段1 数据类型 primary key, 字段2 数据类型 );

你可能感兴趣的:(mysql,学习,数据库)