MySQLDay1
MySQL简介
MySQL是一个典型的关系数据库,目前是Oracle公司产品之一,也是目前主流使用的关系型数据库之一。使用MySQL可以进行最基本的数据存储、管理、查询等操作,也可以方便的组建数据库集群,配置读写分离。
MySQL数据库同样使用SQL(结构化查询语言)来进行操作,同时MySQL数据库自身也有很多可以直接使用的内置函数,在部分操作的语法上和其他数据库会存在区别。
-
SQL(Structured Query Language)结构化查询语言
分类
DDL:数据库定义语言(定义数据库的一些组件 表 索引 视图 自增序列...)
DML:数据库操作语言(添加 删除 修改) CRUD
DQL:数据库查询语言 查询
DCL:数据库控制语言(权限 用户管理...) DBA工程师
SQL语言属于第四代语言,而java c++ 才属于第三代
SQL-DQL
概念
关系模型中常用的概念:
关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名
记录:可以理解为二维表中的一行,在数据库中经常被称为记录
字段:可以理解为二维表中的一列,在数据库中经常被称为字段
域:属性的取值范围,也就是数据库中某一列的取值限制
关键字:一组可以唯一标识记录的属性,数据库中常称为主键,由一个或多个列组成
关系模式:指对关系的描述。其格式为:关系名(属性1,属性2, ... ... ,属性N),在数据库中成为表结构
scott用例表
emp 员工信息表
表名 | emp | ||||
---|---|---|---|---|---|
字段名 | 中文 | 类型 | 是否可以为空 | 默认值 | 其他说明 |
empno | 雇员编号 | int(11) | 否 | 主键 | |
ename | 雇员名称 | varchar(255) | 是 | ||
job | 岗位工种 | varchar(255) | 是 | ||
mgr | 上级 | int(11) | 是 | ||
hiredate | 雇佣日期 | date | 是 | ||
sal | 工资 | decimal | 是 | ||
comm | 奖金|津贴 | decimal | 是 | ||
deptno | 部门编号 | int(11) | 是 | ||
备注 |
dept 部门信息表
表名 | dept | ||||
---|---|---|---|---|---|
主键 | deptno | ||||
字段名 | 中文 | 类型 | 是否可以为空 | 默认值 | 其他说明 |
deptno | 部门编号 | int(11) | 否 | 主键 | |
dname | 部门名称 | varchar (255) | 是 | ||
loc | 地址 | varchar2(255) | 是 | ||
备注 |
salgrade 薪资区间表
表名 | salgrade | ||||
---|---|---|---|---|---|
主键 | |||||
字段名 | 中文 | 类型 | 是否可以为空 | 默认值 | 其他说明 |
grade | 等级 | int(11) | |||
losal | 最低 | int(11) | |||
hisal | 最高 | int(11) |
DQL语句
格式
select 列名*N from 表名 where 查询条件1 and/or 查询条件2 group by 列 Having 分组条件 Order by 排序
规则
sql在书写的时候除了查询条件之外,大小写都可以
select * from user where uname ='zs';
SELECT * FROM USER WHERE UNAME = 'zs';
保持大小写风格
去公司之后需要看其他员工SQL大小写
-- 属于SQL语句的注释
所有的查询条件为字符串时,需要用'xxx'进行修饰,否则就会当做列名去处理
-- 01,找出各月倒数第3天受雇的所有员工.
select * from emp where day(LAST_DAY(HIREDATE) - INTERVAL 2 DAY) = DAY(HIREDATE);-- 02,找出早于12年前受雇的员工.
select ename, HIREDATE from emp where datediff(CURRENT_DATE(),HIREDATE);-- 03,以首字母大写的方式显示所有员工的姓名.
SELECT CONCAT(UPPER(SUBSTRING(ENAME, 1, 1)), LOWER(SUBSTRING(ENAME, 2))) AS Formatted_Name FROM emp;-- 04,显示正好为5个字符的员工的姓名.
select ename from emp where length(ename) = 5;-- 05,显示不带有"R"的员工的姓名
select ename from emp where ename not like '%R%';select ename from emp where ename not regexp 'R';-- 06,显示所有员工姓名的前三个字符.
select substring(ename,1,3) as three from emp;-- 07,显示所有员工的姓名,用a替换所有"A"
SELECT REPLACE(ENAME, 'A', 'a') AS aname FROM emp;-- 08,显示满10年服务年限的员工的姓名和受雇日期.:
SELECT ENAME, HIREDATE from emp where DATEDIFF(CURRENT_DATE(),HIREDATE) > 10;-- 09,显示员工的详细资料,按姓名排序.
select * from emp order by ename;-- 10,显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面.
SELECT ename, HIREDATE from emp order by HIREDATE ASC;-- 11,显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同则按薪金排序.
select ENAME, JOB, (SAL+COMM) as sc from emp order by JOB DESC , sc ASC;-- 12,显示所有员工的姓名、加入公司的年份和月份,按受雇日期所在月排序,若月份相同则将最早年份的员工排在最前面.
select ename, DATE_FORMAT(HIREDATE, '%Y') AS HY, DATE_FORMAT(HIREDATE, '%m') AS HM from emp order by HM ,HY DESC;-- 13,找出在(任何年份的)2月受聘的所有员工。
SELECT * from emp where MONTH(HIREDATE)=2;-- 14,对于每个员工,显示其加入公司的天数.
SELECT ENAME , DATEDIFF(CURDATE(), HIREDATE) AS DaysEmployed FROM emp;-- 15,显示姓名字段的任何位置包含"A"的所有员工的姓名.
select ename from emp where ename regexp 'A';
DQL中的函数
# 官方函数链接
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format
单行函数
函数都是数据库提前给我们准备好的,所以我们可以直接调用,使用函数可以让指定的列计算出我们需要的数据
单行函数 : 指的是操作一行数据返回一行数据,操作10行数据返回10行数据
-- 长度- select ename,length(ename) from emp;-- 截取- select ename,SUBSTR(ename,1,3) from emp;- select * from emp where substr(ename,5,1)='S';-- 大小写- select ename, upper(ename),lower(ename) from emp;-- 拼接- select CONCAT(empno,'=',ename) from emp;-- 替换- select ename,REPLACE(ename,'T','—') from emp
日期函数
-- 获取当前系统时间- select hiredate,sysdate() from emp;- select hiredate,CURRENT_DATE(),CURRENT_TIME(),CURRENT_TIMESTAMP() from emp;-- 日期转换- select DATE_FORMAT(sysdate(),'%Y-%m-%d %H:%i:%s')- select hiredate, date_format(now(),'%Y年%m月%d日 %H时%i分%s秒') from emp;-- 分别获取 年月日 时分秒 星期- select - SECOND MINUTE HOUR DAY WEEK MONTH YEAR
-- 日期的加减操作- select hiredate,ADDDATE(hiredate,9),ADDDATE(hiredate,-9) from emp;- select DATE('2022-05-02');
数值函数
-- 向上取整 向下取整- select ceil(12.1),floor(12.9) -- mod abs pow PI rand round TRUNCATE(直接进行截取,不进行四舍五入)
-- 保留多少位有效数字- select round(1.4999999,2),round(1.4999999),round(1.4999999,-1)- select TRUNCATE(1.4999999,2)
转换函数
-- 日期--》字符串- date_format(date,expr)- select DATE_FORMAT(sysdate(),'%Y-%m-%d %H:%i:%s');-- 字符串--》日期- 要注意字符串和格式的匹配- select STR_TO_DATE('2020-4-16 17:15:24','%Y-%c-%d %H:%i:%s');- select STR_TO_DATE('5月2022年4日','%m月%Y年%d日');'5月2022年4日'-- 数字--》字符串- 直接拼接一个字符串即可,可以自动转换 lpad,concat-- 字符串--》数字- 依靠函数提供的参数
多行函数
不管函数处理多少条,只返回一条记录
如果你的数据可以分为多个组,那么返回的数据条数和组数相同
每个部门的平均薪资
10 20 30 --> 3
常用的多行函数有5个
max 最大值: 如果处理的值是字符串,将会把值按照字典序排序
min 最小值: 如果处理的值是字符串,将会把值按照字典序排序
avg 平均值: 只能用于数值型数据,求平均值
sum 求和: 如果求和过程中有null,那么不会计算在内
count 求总数: 如果统计的数据中有null,不会把null统计在内
经典的错误
--查询公司最低薪资的员工是谁?
select min(sal) ,ename from emp;
mysql语法可行 -- 5.7之前可以 ,即使问题解决了 结果也是不对的
oracle不可行
DQL单表关键字执行顺序
select: 我们要显示那些列的数据
from: 从那张表中获取数据
where: 从表中获取数据的时候进行行级的数据过滤
group by: 对数据进行分组处理,一组获取对应的结果
having: 组级过滤,组级过滤的数据必须是分组条件或者是组函数
order by: 排序 asc desc
执行的顺序(面试题)
from --> where -->group by -->select -->having-->order by-->limit**
多表查询
a. 查询的两张表如果出现同名的列,我们需要将表名标注到列名前面
b. 如果是非同名的列,表名可加可不加,推荐加上
为了书写方便,可以给表添加别名
一般情况下取首字母,特殊情况下取它所代表的含义
表的别名只在本次查询中生效
c. 如果表与表进行关联查询的时候,如果不添加关联条件,查询的总记录数就是a*b = 笛卡尔积
select * from emp,dept;
a 15 b 10 c 10 -->1500条
d. 多表查询的时候必须要加条件
等值
非等值
-- 多表查询-- 01,列出至少有一个员工的所有部门。
SELECT DEPTNO FROM emp GROUP BY DEPTNO HAVING COUNT(EMPNO) >= 1;-- 02,列出薪金比“SMITH”多的所有员工。(大于最大薪水SMITH员工)
SELECT ename,SAL+ifnull(COMM,0) as sc from emp where sal+ifnull(COMM,0) >= (select sal+ifnull(COMM,0) as sc1 from emp where ename = 'SMITH');-- 03,列出所有员工的姓名及其直接上级的姓名。
SELECT e.ENAME AS EmployeeName, m.ENAME AS ManagerName FROM emp e LEFT JOIN emp m ON e.MGR = m.EMPNO;-- 04,列出受雇日期早于其直接上级的所有员工。
SELECT e.ENAME AS eplName, e.HIREDATE AS eplHireDate, m.ENAME AS MGRName, m.HIREDATE AS MGRHireDate FROM emp e JOIN emp m ON e.MGR = m.EMPNO WHERE e.HIREDATE < m.HIREDATE;-- 05,列出部门名称和这些部门的员工信息,包括那些没有员工的部门。
SELECT d.DNAME AS DtName,e.ENAME AS EeName,e.JOB AS Job,e.SAL AS Salary
FROM dept d
LEFT JOIN emp e ON d.DEPTNO = e.DEPTNO
ORDER BY d.DNAME, e.ENAME;-- 06,列出所有job为“CLERK”(办事员)的姓名及其部门名称。
SELECT ename, DNAME from emp join dept on emp.DEPTNO = dept.DEPTNO where emp.job = 'CLERK'-- 07,列出最低薪金大于1500的各种工作。
SELECT job from emp where sal+ifnull(comm,0) >='1500';-- 08,列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
SELECT ENAME FROM emp JOIN dept ON emp.DEPTNO = dept.DEPTNO WHERE dept.DNAME = 'SALES';-- 09,列出薪金高于公司平均薪金的所有员工。
SELECT ENAME AS EmployeeName, SAL AS Salary FROM emp WHERE SAL > (SELECT AVG(SAL) FROM emp);-- 10,列出与“SCOTT”从事相同工作的所有员工。
SELECT ENAME AS EmployeeName FROM emp WHERE JOB = (SELECT JOB FROM emp WHERE ENAME = 'SCOTT') AND ENAME != 'SCOTT';-- 11,列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
SELECT ENAME, SAL+ifnull(COMM,0) as sc FROM emp WHERE SAL+ifnull(COMM,0) IN (SELECT DISTINCT SAL+ifnull(comm,0) FROM emp WHERE DEPTNO = 30) AND DEPTNO-- 12,列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
SELECT ename, sal+IFNULL(comm,0) as sc from emp where SAL+ifnull(COMM,0) > ALL(SELECT SAL+ifnull(comm,0) FROM emp WHERE DEPTNO = 30)-- 13,列出在每个部门工作的员工数量、平均工资和平均服务期限。
SELECT COUNT(ename) as ppc, AVG(SAL) as asl, AVG(DATEDIFF(CURRENT_DATE,HIREDATE)) / 365 as aht from emp GROUP BY DEPTNO;-- 14,列出所有员工的姓名、部门名称和工资。
SELECT ENAME, SAL, DNAME, emp.DEPTNO from emp join dept on emp.DEPTNO = dept.DEPTNO;-- 15,列出从事同一种工作但属于不同部门的员工的一种组合。
select * from emp e1 JOIN emp e2 on e1.job = e2.job and e1.DEPTNO != e2.DEPTNO where e1.DEPTNO<e2.DEPTNO;-- 16,列出所有部门的详细信息和部门人数。
SELECT d.*, COUNT(e.EMPNO) AS num_employees FROM dept d LEFT JOIN emp e ON d.DEPTNO = e.DEPTNO GROUP BY d.DEPTNO;-- 17,列出各种工作的最低工资。
SELECT JOB, MIN(SAL) as ms from emp group by JOB;-- 18,列出各个部门的MANAGER(经理)的最低薪金(job为MANAGER)。
SELECT e1.EMPNO, e1.MGR, MIN(e1.SAL) from emp e1 join emp e2 on e1.EMPNO=e2.MGR GROUP BY EMPNO;-- 19,列出所有员工的年工资,按年薪从低到高排序。
SELECT ENAME, (SAL+ifnull(COMM,0)) * 12 as ysal from emp ORDER BY ysal ASC;-- 20,列出所有job=‘CLERK’ 的员工平均薪资
SELECT EMPNO, ENAME, job, avg(SAL) from emp where job = 'CLERK' GROUP BY EMPNO;-- 21,列出job=‘CLERK’员工的平均薪资 按照部门分组
SELECT DEPTNO, job, AVG(SAL) from emp WHERE job='CLERK' GROUP BY DEPTNO;-- 22,列出job=‘CLERK’员工的平均薪资 按照部门分组 并且部门编号 in(10,30) 按照平均薪资 降序排列
SELECT DEPTNO, AVG(SAL), job from emp where job='CLERK' and DEPTNO IN (10,30) GROUP BY DEPTNO ORDER BY AVG(SAL) DESC;-- 23,列出job=‘CLERK’员工的平均薪资 按照部门分组 并且部门编号 in(20,30) 并且部门员工数量>=2人 按照平均薪资 降序排列
SELECT DEPTNO, job, AVG(SAL) from emp where job='CLERK' and DEPTNO in (20,30) GROUP BY DEPTNO HAVING COUNT(DEPTNO)>=2 ORDER BY AVG(SAL) DESC;-- 24,查询名字中带有A字母的员工姓名,部门名称和薪资等级
SELECT e.ENAME, e.SAL, e.DEPTNO, d.DNAME from emp e JOIN dept d on e.DEPTNO=d.DEPTNO where ENAME LIKE '%A%';
SQL-DML
DML插入
1、insert into 表名 values();
insert into dept values(50,'shujia','shanghai');
要求插入数据的数量,类型要和定义的表结构一致
insert into dept values(50,'shujia','hefei');insert into dept values(50,'shujia');insert into dept values('abcd',50.'sh');
2、insert into 表名(列名) values(值...);
insert into emp(empno,ename,deptno) values(6666,'ly',50); -- 要求插入数据的数量顺序和表名后的列要一致
3、insert into 表名(列名) select ....
create table dp as select * from dept where 1<>1; -- 全量导入insert into dept(deptno,dname) select empno ,ename from emp; -- 增量导入
SQL-DML删除
delete from 表名
delete from dept;
delete from 表名 where 条件
delete from emp where comm is null; -- 这属于一种物理删除,删完之后理论上不能再找回,短时间内紧急联系网管
truncate table emp;
截断表,一般不使用。
SQL-DDL
常见组成:
库的操作
表
视图
索引
数据库的操作
# 数据库创建
create database 数据库名 charset utf8;# 查看数据库
show databases;
show create database db;
select database();# 选择数据库
use 数据库名;# 删除数据库
drop database 数据库名;# 修改数据库
alter database db1 charset utf8;
表的创建
-- 我们首先要对你操作的数据有一个基础型的了解
-- 学号 姓名 性别 出生日期 入学时间 专业 院系 创建时间
-- 学号 int 姓名 varchar 性别 char 出生日期 date 入学时间 date 专业 varchar 院系 varchar 创建时间 timestampcreate table t_student( sno int, sname varchar(40), gender char(1), birthday date, schooltime date, major varchar(255), department varchar(255), createtime timestamp
);
表的修改
--根据查询语句创建表
CREATE TABLE STU01 AS SELECT * FROM t_student;
--添加一列
alter table t_student add updatetime timestamp default now();
--删除一列
alter table t_student drop column email;
--修改一列
alter table t_student modify major varchar(20);
--修改列名
alter table t_student rename COLUMN birthday to birth;
--修改表名
rename t_student to t_s;
--删除一张表
drop table t_s;
表的约束
约束指的是我们创建的表 别人在插入数据的时候,对数据的约束,而不是对创建人的约束
主键约束primary key
a: 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。
b: 主键分为单字段主键和多字段联合主键
c: 联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。
CREATE TABLE t_pk01(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
deptId INT(11),
salary FLOAT
);CREATE TABLE t_pk03(
tid INT(11),
cid INT(11),
salary FLOAT,
PRIMARY KEY(tid,cid)
);CREATE TABLE t_pk02(
id VARCHAR(40),
name VARCHAR(25),
salary FLOAT
);-- ALTER TABLE <数据表名> ADD PRIMARY KEY(<字段名>);
ALTER TABLE t_pk02 ADD PRIMARY KEY(id);-- ALTER TABLE <数据表名> DROP PRIMARY KEY;
ALTER TABLE t_pk04 DROP PRIMARY KEY;
唯一性约束unique
列中的值可以为空但是不能相同
CREATE TABLE tb_unique01(
id INT(11) PRIMARY KEY,
name VARCHAR(22),
phonenum VARCHAR(11) UNIQUE,
location VARCHAR(50)
);-- ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);
ALTER TABLE tb_unique01 ADD CONSTRAINT t_unique01_unique_location UNIQUE(location);-- ALTER TABLE <表名> DROP INDEX <唯一约束名>;
ALTER TABLE tb_unique01 DROP INDEX unique_t_unique01_location;
非空约束not null
CREATE TABLE tb_null01(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
location VARCHAR(50)
);-- ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> NOT NULL;
ALTER TABLE tb_null01 CHANGE COLUMN location location VARCHAR(50) NOT NULL;-- ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> NULL;
ALTER TABLE tb_null01 CHANGE COLUMN location location VARCHAR(50) NULL;
外键约束
定义外键时,需要遵守下列规则:
1. 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
2. 必须为主表定义主键。
3. 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主表中,这个外键的内容就是正确的。
4. 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或唯一性键。
5. 外键中列的数目必须和主表的主键中列的数目相同。
6. 外键中列的数据类型必须和主表主键中对应列的数据类型相同。
外键的删除
级联删除
设置为NULL
阻止删除
删除主表数据的时候,要保证这个ID没有被字表所使用
--1位老师对应N个学生 teacher表为主表,student表为外键表 tid为外键 create table teacher( tid varchar(40) primary key, name varchar(40) );create table student( sid varchar(40) primary key, name varchar(40), tid varchar(40), CONSTRAINT fk_teacher_student_tid FOREIGN KEY(tid) REFERENCES teacher(tid) on delete cascade );insert into teacher values('a','xiaohu'); insert into teacher values('b','xioaoge'); insert into teacher values('c','tongge'); insert into student values('1','fengge','a'); insert into student values('2','yangge','a'); insert into student values('3','huohuo','b'); insert into student values('4','yanglaoban','c');--错误数据,因为主表主键没有d insert into student values('5','xiaohu','d');-- 修改表 ALTER TABLE <数据表名> ADD CONSTRAINT <外键名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
约束总结:
-- 查看表中的约束
SHOW CREATE TABLE <数据表名>;create table table_name(
列名1 数据类型 (int) primary key auto_increment,
列名2 数据类型 not null,
列名3 数据类型 unique,
列名4 数据类型 default '值',
constraint 索引名 foreign key(外键列) references 主键表(主键列) on delete
cascade | on delete set null
)1.主键约束
添加:alter table table_name add primary key (字段)
删除:alter table table_name drop primary key2.非空约束
添加:alter table table_name modify 列名 数据类型 not null
删除:alter table table_name modify 列名 数据类型 null3.唯一约束
添加:alter table table_name add unique 约束名(字段)
删除:alter table table_name drop key 约束名4.自动增长
添加:alter table table_name modify 列名 int auto_increment
删除:alter table table_name modify 列名 int 5.外键约束
添加:alter table table_name add constraint 约束名 foreign key(外键列)
references 主键表(主键列)
删除:alter table table_name drop foreign key 约束名6.默认值
添加:alter table table_name alter 列名 set default '值'
删除:alter table table_name alter 列名 drop default
索引
索引的分类:
常规索引
常规索引,也叫普通索引(index或key),它可以常规地提高查询效率。一张数据表中可以有多个常规索引。常规索引是使用最普遍的索引类型,如果没有明确指明索引的类型,我们所说的索引都是指常规索引。
主键索引
主键索引(Primary Key),也简称主键。它可以提高查询效率,并提供唯一性约束。一张表中只能有一个主键。被标志为自动增长的字段一定是主键,但主键不一定是自动增长。一般把主键定义在无意义的字段上(如:编号),主键的数据类型最好是数值。
唯一索引
唯一索引(Unique Key),可以提高查询效率,并提供唯一性约束。一张表中可以有多个唯一索引。
外键索引
外键索引(Foreign Key),简称外键,它可以提高查询效率,外键会自动和对应的其他表的主键关联。外键的主要作用是保证记录的一致性和完整性。
================================================================================
索引是数据库中一块独立的空间,专门存储索引值的一棵B-树
我们可以通过B-树快速的定位到要查找的数据
尽量不要对重复数据的列添加索引
性别
优点
索引可以让MySQL快速地查找到我们所需要的数据,但这并不是索引的唯一作用。
索引大大减少了MySQL服务器需要扫描的数据量。
索引可以帮助服务器避免排序和临时表。
索引可以将随机I/O变为顺序I/O。
缺点
影响数据库的增删改速度
视图
简介
MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。
行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图是动态生成的。
优点
1) 定制用户数据,聚焦特定的数据
2) 简化数据操作
3) 提高数据的安全性
4) 共享所需数据
5) 更改数据格式
6) 重用 SQL 语句
创建 查看
-- CREATE VIEW <视图名> AS <SELECT语句> -- <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。 -- <SELECT语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。 CREATE VIEW v_swordsman AS ( SELECT tid, NAME FROM teacher ) UNION ALL ( SELECT sid, NAME FROM student );SELECT * FROM v_swordsman-- DESCRIBE 视图名; DESCRIBE v_swordsman-- SHOW CREATE VIEW 视图名; SHOW CREATE VIEW v_swordsman-- ALTER VIEW <视图名> AS <SELECT语句> -- <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。 -- <SELECT 语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。 -- DROP VIEW IF EXISTS <视图名1> [ , <视图名2> …]
三范式[3FN]
我们创建表需要遵循的规范
第一范式【不可再分割原则】
数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组
第二范式
数据库中每一行数据必须依赖于主键,每一个行数据都要有主键
主键是一行数据的唯一性标识
第三范式【非主键的列必须要全部依赖于主键】
表中非主键的列要完全依赖于主键,不能出现部分属性依赖于其他属性
当出现传递依赖的时候要将非依赖于主键的列专门创建一张表进行管理