JavaLearn#(17)MySQL基础知识DML及DDL语句外键及非外键约束外键策略DQL语句(单表多表)连接查询子查询索引事务视图存储过程用户权限及角色管理
Posted LRcoding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaLearn#(17)MySQL基础知识DML及DDL语句外键及非外键约束外键策略DQL语句(单表多表)连接查询子查询索引事务视图存储过程用户权限及角色管理相关的知识,希望对你有一定的参考价值。
1. 基础知识
1.1 数据库基础知识
-
数据:计算机可以处理的数据,字母、文字、文本、图形、音频、视频等
-
数据库:Database,以一定格式存放数据,能够实现多个用户共享,与应用程序彼此独立的数据集合
-
数据库管理系统:DBMS,用来定义和管理数据的软件,mysql、Oracle、SQL server等
-
数据库应用系统:在数据库管理系统的基础上,使用数据库管理系统的语法,开发的直接面对最终用户的应用程序,学生管理系统等
-
数据库管理员:DBA,是指对数据库管理系统进行操作的人员
-
最终用户:数据库应用程序的使用者,并不会直接与数据库打交道
-
数据库系统:DBS,一般是由数据库、数据库管理系统、数据库应用程序、数据库管理员和最终用户构成
-
数据库类型:
-
网状数据库、层次数据库
-
关系型数据库
-
Oracle、DB2、SQL server、MySQL等
-
用二元关系(二维表)来表示数据
-
-
-
非关系型数据库 NOSQL(Not Only SQL)
- 适用于超大规模和高并发,大数据问题
-
常见的关系型数据库
- Oracle,甲骨文公司,一般用在银行、金融等大型数据库
- DB2, IDM公司
- SQL server,微软公司,只能在windows上运行
- MySQL,开源、轻量型
1.2 MySQL基础知识
- 优点:开源、跨平台、轻量级、成本低(企业级收费)
- 默认端口:3306,Oracle是1521,SQL server是1433
- Oracle: 数据库orcl ---- 很多用户(system、scott) ----- 数据库表 。 很少创建数据库
- MySQL:用户(root、zhangsan) ---- 很多数据库 ----- 数据库表。 经常创建数据库
- MySQL自带数据库
- information_schema : 提供了访问数据库元数据的方式。 保存着数据库名、表名、列的数据类型、访问权限等
- mysql : 核心数据库。 存储数据库的用户、权限设置、关键字等
- performance_schema : 收集数据库服务器性能参数,锁、互斥变量等;保存历史的事件汇总信息
- sys : MySQL5.7新增的数据库系统,该库通过视图将information_schema 和 performance_schema 结合起来
- sakila : 模拟 DVD 租赁信息管理的数据库,测试库
- SQL语言分类
- 数据查询语言 (Data Query Language,DQL) ==》 SELECT子句,FROM子句,WHERE子句
- 数据操作语言 (Data manipulation Language,DML) ==》 INSERT, UPDATE, DELETE
- 数据定义语言 (Data Definition Language,DDL) ==》 数据库对象(数据库、表、索引、视图、触发器、存储过程、函数)操作,CREATE、DROP、ALTER
- 数据控制语言 (Data Control Language,DCL) ==》 授权或回收操作, GRANT、REVOKE
- 事务控制语言 (Transaction Control Language,TCL) ==》 事务的控制, START TRANSACTION、COMMIT、ROLLBACK、SET TRANSACTION
1.3 SQL语句入门
1.3.1 连接MySQL相关命令
- 开启服务:
net start mysql80
(安装的MySQL版本为 8.0,如果是5.7,则服务名为mysql57) - 停止服务:
net stop mysql80
- 连接MySQL:
mysql -h 127.0.0.1 -u root -p
,输入密码 - 退出MySQL:
exit
、quit
、\\q
1.3.2 操作数据库命令
- 显示所有数据库:
SHOW DATABASES;
- 删除数据库:
DROP DATABASE 数据库名;
- 创建数据库:
CREATE DATABASE 数据库名;
- 切换到数据库:
USE 数据库名;
- 显示数据库里的所有表:
SHOW TABLES;
- 查看表的结构:
DESC 表名;
2. DDL 和 DML
2.1 创建数据库表
表(table)是数据存储最常见和最简单的一种形式,数据库可以将复杂的数据结构用较为简单的二维表表示
MySQL提供了一个伪表(dual)
表中的行称为记录,表中的列称为这些记录的字段
【示例一】创建数据库表(无限制版)
-- • 建立一张用来存储学生信息的表
-- • 字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
CREATE TABLE student (
sno INT ( 6 ), -- 宽度是显示宽度,如果超过,可以自动增大宽度 int底层都是4个字节
sname VARCHAR ( 10 ),
sex CHAR ( 1 ),
age INT ( 3 ),
enterdate DATE, -- 写入当前的时间 now() sysdate() CURRENT_DATE() 方式多样'1256-12-23' "1256/12/23" "1256.12.23"
classname VARCHAR ( 10 ),
email VARCHAR ( 15 ) -- 最后一个字段没有,
);
-- 查看表的结构
DESC student;
-- 查看完整的建表语句
SHOW CREATE TABLE student;
2.2 DML语句
【示例二】添加、更新、删除数据(基础版)
-- 添加数据
INSERT INTO student VALUES ( 1, '张三丰', '男', 34, '1256-12-23', '武当一班', 'zhsf@wd.cn' );
INSERT INTO student VALUES ( 1, '张三丰', '男', 34, '1256-12-23', '武当一班', 'zhsf@wd.cn' ); -- 可以插入,因为还没做主键约束
INSERT INTO student ( sno, NAME, enterdate ) VALUES ( 1, '张三丰', sysdate( ) ); -- 插入几个字段, 时间还可用 now()
-- 修改数据
UPDATE student SET sex = '男', age = 64 WHERE sno = 12345678 -- 需要用where子句限制修改哪一条记录
UPDATE student SET sno = 2 WHERE sno = 12345678
-- 删除数据
DELETE FROM student WHERE email IS NULL -- delete必须后跟from is null 不是 = null
DELETE FROM student; -- 删除所有数据
-- 清空数据
TRUNCATE student -- 不可回滚,属于DDL,执行效率高,自增值回到1
2.3 DDL语句
【示例三】修改、删除表结构(不是数据)
-- 查询表的结构
DESC student
-- 修改表的结构
-- 增加一列
ALTER TABLE student ADD score DOUBLE(5, 2); -- 5 总的位数, 2 小数位数
ALTER TABLE student ADD score DOUBLE(5, 2) FIRST;
ALTER TABLE student ADD score DOUBLE(5, 2) AFTER enterdate;
-- 修改一列
ALTER TABLE student MODIFY score FLOAT(3, 1) -- 修改score列的数据类型
ALTER TABLE student CHANGE score scoreNew DOUBLE(4, 1) -- 修改score列的列名,及数据类型
-- 删除一列
ALTER TABLE student DROP score;
-- 修改表名
ALTER TABLE student RENAME TO stu
-- 删除表
DROP TABLE student
3. 完整性约束
3.1 非外键约束
约束条件 | 约束描述 |
---|---|
PRIMARY KEY | 主键约束,约束字段的值可唯一地标识对应的记录 |
NOT NULL | 非空约束,约束字段的值不能为空 |
UNIQUE | 唯一约束,约束字段的值是唯一的 |
CHECK | 检查约束,限制某个字段的取值范围 |
DEFAULT | 默认值约束,约束字段的默认值 |
AUTO_INCREMENT | 自动增加约束,约束字段的值自动递增 |
(一)在建表的时候加入约束条件
-- • 学号是主键 = 不能为空 + 唯一
-- • 姓名不能为空
-- • 性别默认值是男
-- • 年龄限制 18 —— 30 之间
-- • Email唯一
CREATE TABLE student (
sno INT ( 4 ) PRIMARY KEY AUTO_INCREMENT, -- 主键(PRIMARY KEY) = 不能为空 + 唯一 int类型的主键,可以让其自增(AUTO_INCREMENT)
sname VARCHAR ( 10 ) NOT NULL, -- 不能为空(NOT NUL)
sex CHAR ( 1 ) DEFAULT '男', -- 默认值(DEFAULT)
age INT ( 2 ) CHECK ( age >= 18 AND age <= 30 ), -- 限制取值(CHECK)
enterdate DATE,
classname VARCHAR ( 15 ),
email VARCHAR ( 20 ) UNIQUE -- 唯一(UNIQUE),可以为空
)
(二)建表时加入约束,可以自定义约束的名字
CREATE TABLE student(
sno INT(4) AUTO_INCREMENT,
sname VARCHAR(10) NOT NULL,
sex CHAR(1) DEFAULT '男',
age INT(3),
enterdate DATE,
classname VARCHAR(10),
email VARCHAR(15),
CONSTRAINT pk_stu PRIMARY KEY(sno), -- 主键约束
CONSTRAINT ck_stu_age CHECK(age >= 18 AND age <= 30), -- 检查约束
CONSTRAINT un_stu_email UNIQUE(email) -- 唯一约束
);
(三)建表之后,增加约束
ALTER TABLE student ADD CONSTRAINT pk_stu PRIMARY KEY(sno);
ALTER TABLE student MODIFY sno INT(4) AUTO_INCREMENT;
3.2 外键约束
3.2.1 创建外键
外键约束(FOREIGN KEY,FK)用来实现数据库表的参数完整性。可以使两张表紧密的结合起来,针对修改或者删除的级联操作时,会保证数据的完整性
外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束。
定义外键:
-- 班级表
CREATE TABLE t_class (
cno INT(4) PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(12) NOT NULL
);
CREATE TABLE t_student (
sno INT(4) PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10) NOT NULL,
age INT(3) CHECK(age >= 18 AND age <= 30),
sex CHAR(1) DEFAULT '男',
classno INT(4),
-- 定义 classno 字段为外键,参照 t_class 表的 cno
CONSTRAINT fk_stu_classno FOREIGN KEY(classno) REFERENCES t_class(cno)
);
或者在定义完表之后:
ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY(classno) REFERENCES t_class(cno);
3.2.2 外键策略
建立外键之后,修改或删除数据时(例如 zhangsan 同学所在的班级编号为 5, 此时如果直接删除 编号为5 的班级时,会因为外键的存在而报错),相关联的记录有几种外键策略
:
-
NO ACTION:不采取操作,想要删除班级, 要么将 zhangsan 的班级编号置为 null, 要么先删除 zhangsan 这条记录
-
CASCADE:级联更新,需要在定义外键的时候指定
ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY(classno) REFERENCES t_class(cno) ON UPDATE CASCADE ON DELETE CASCADE -- 此时直接删除或修改班级编号时,zhangsan 的班级编号会随之更新,或直接记录被删除
-
SET NULL:值置为 null
ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY(classno) REFERENCES t_class(cno) ON UPDATE SET NULL ON DELETE SET NULL -- 此时直接删除或修改班级编号时, zhangsan 的班级编号会被置为 null
4. 快速创建表
用已有的表来快速创建表
CREATE TABLE newStu
AS
SELECT * FROM student -- 既要结构也要数据
SELECT * FROM student WHERE 1=2 -- 只要结构
SELECT sno, sname FROM student -- 只要部分字段
5. DQL 语句—单表
5.1 准备数据
-- 部门表
create table DEPT (
DEPTNO int(2) not null,
DNAME VARCHAR(14),
LOC VARCHAR(13) -- 地址
);
alter table DEPT add constraint PK_DEPT primary key (DEPTNO);
-- 员工表
create table EMP (
EMPNO int(4) primary key,
ENAME VARCHAR(10),
JOB VARCHAR(9), -- 岗位
MGR int(4), -- 上级编号,类似于外键,参考当前表的 EMPNO
HIREDATE DATE, -- 入职时间
SAL double(7,2), -- 工资
COMM double(7,2), -- 补助
DEPTNO int(2) -- 外键,参考 DEPT 表的 DEPTNO
);
alter table EMP add constraint FK_DEPTNO foreign key (DEPTNO) references DEPT (DEPTNO);
-- 工资等级
create table SALGRADE (
GRADE int primary key,
LOSAL double(7,2),
HISAL double(7,2)
);
commit;
insert into DEPT (DEPTNO, DNAME, LOC) values (10, 'ACCOUNTING', 'NEW YORK');
insert into DEPT (DEPTNO, DNAME, LOC) values (20, 'RESEARCH', 'DALLAS');
insert into DEPT (DEPTNO, DNAME, LOC) values (30, 'SALES', 'CHICAGO');
insert into DEPT (DEPTNO, DNAME, LOC) values (40, 'OPERATIONS', 'BOSTON');
commit;
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
commit;
insert into SALGRADE (GRADE, LOSAL, HISAL) values (1, 700, 1200);
insert into SALGRADE (GRADE, LOSAL, HISAL) values (2, 1201, 1400);
insert into SALGRADE (GRADE, LOSAL, HISAL) values (3, 1401, 2000);
insert into SALGRADE (GRADE, LOSAL, HISAL) values (4, 2001, 3000);
insert into SALGRADE (GRADE, LOSAL, HISAL) values (5, 3001, 9999);
commit;
5.2 最简单的SQL语句
-- 最简单的查询语句
SELECT * FROM dept
SELECT * FROM emp
-- 显示部分列
SELECT empno, ename, comm, deptno FROM emp
-- 显示部分行
SELECT empno, ename, comm, deptno FROM emp WHERE sal < 2500
-- 别名
SELECT empno '编号', ename '姓名', comm '补助', deptno '部门编号' FROM emp WHERE sal < 2500
-- 算术运算
SELECT empno, ename, sal, sal*1.1 '新工资' FROM emp WHERE sal < 2500
SELECT empno, ename, sal, comm, sal + IFNULL(comm, 0) FROM emp WHERE sal < 2500 -- 使用IFNULL,避免为 null时,计算结果不正确的问题
-- 去重,对后面所有列去重
SELECT DISTINCT job FROM emp
-- 排序
SELECT * FROM emp ORDER BY empno -- 默认升序 ASC
SELECT * FROM emp ORDER 以上是关于JavaLearn#(17)MySQL基础知识DML及DDL语句外键及非外键约束外键策略DQL语句(单表多表)连接查询子查询索引事务视图存储过程用户权限及角色管理的主要内容,如果未能解决你的问题,请参考以下文章
JavaLearn#(25)Ajax相关知识三级联动案例Bootstrap入门栅格系统排版表格字体图标等简单概述
JavaLearn#(25)Ajax相关知识三级联动案例Bootstrap入门栅格系统排版表格字体图标等简单概述
JavaLearn#(26)MyBatis基础:认识框架MyBatis环境搭建基本CRUD配置文件日志管理别名属性文件ThreadLocal保存sqlSession本地DTD模板
JavaLearn#(26)MyBatis基础:认识框架MyBatis环境搭建基本CRUD配置文件日志管理别名属性文件ThreadLocal保存sqlSession本地DTD模板
JavaLearn#(27)MyBatis进阶:Mapper代理(接口绑定)多参数传递模糊查询分页自增主键回填动态SQL一级缓存二级缓存