课程目标:
- MySQL数据库安装与配置
- MySQL表操作
- MySQL基本查询
- MySQL高级查询
- MySQL写入操作
- MySQL基本函数
- MySQL的综合应用
什么是数据库系统:
什么是关系型数据库系统:
第一个关系型数据库
主流的关系型数据库
MySQL数据库:
MySQL 大事记
- 1996 MySQL1.0 诞生
- 1999 MySQL AB公司成立
- 2000 MysQL4.0发布
- 2003 MySQL5.0发布
MySQL衍生版
- Oracle
- MariaDB
- Percona
MySQL客户端:Navicat
ALTER USER root'@'localhost' IDENTIFIED BY ′123456′
注意本地localhost 加上%,代表可远程登录MySQL配置文件
- 在my.ini文件中,我们可以设置各种 MySQL的配置,例如字符集、端口号、目录地址等等
- `port=3306`#端口号
`datadir=C:/ ProgramData/ MySQL/ MySQL Server8.0/Data`#数据目录
`default authentication_ plugin= caching sha2_ password`#密码认证插件
`default- storage- engine= INNODB`#默认存储引擎
`sq1-mode=" STRICT TRANS TABLES, NO ENGINE SUBSTITUTION`"#开启严格模式
`log- output=FILE`#用文件记录日志
`genera1-10g=0`#关闭日志输出
`genera1_1 og file=" DESKTOP-HB42AU2.1og`"#日志文件名称
`slow- query-1og=1`#开启慢查询日志
`query_1 og file=" DESKTOP-HB42AU2-s1ow.1og"`#慢查询日志文件名称
`long query time=10`#大于多少秒的执行SQL被记录在慢查询日志
`log- error=" DESKTOP-HB42AU2.err”`#错误日志名称
`server-id=1`#数据库ID
`lower case table names=1`#把表名转换成小写
`secure-f1le-priv="C:/ ProgramData/MyQL/ lySQL Server8.0/ Uploads"`#导入导出数据的目录地址
`max connections=151`#最大连接数
`table open cache=2000`
`tmp table size=16M`
`thread cache size=10`#线程数量
`myisam max sort file size=100G`
`myisam sort buffer size=8M`
`key buffer size=8M`
`read buffer size=0`
什么是SQL语言:SQL是用于访问和处理数据的标准的计算机语言
SQL语言分类
- DML:添加 修改 删除 查询
- DCL:用户 权限 事务
- DDL:逻辑库 数据表 视图 索引
SQL语句注意事项
- SQL语句不区分大小写,但是字符串区分大小写 SELECT “HelloWorld”
- SQL语句必须以分号结尾
- SQL语句中的空白和换行没有限制,但是不能破坏语法
SQL语句的注释
创建逻辑库
- `mysql> CREATE DATABASE 逻辑库名称` #创建逻辑库
- `mysql> SHOW DATABASES;` #展示逻辑库
- `mysql> DROP DATABSE 逻辑库名称`;#展示逻辑库
创建数据表
- `CREATE TABLE数据表 (`
`列名1 数据类型 [约束][ COMMENT注释],`
`列名2 数据类型 [约束][ COMMENT注释],`
`...`
`)[ COMMENT=注释];`
- `CREATE TABLE student(`
`id INT UNSIGNED PRIMARY KEY,`
`name VARCHAR(20) NOT NULL,`
`sex CHAR(1)NOT NULL,`
`birthday DATE NOT NULL,`
`tel CHAR(11) NOT NULL,`
`remark VARCHAR(200),`
`);`
写入数据表
insert into student VALUES(1,"张三",“男”,“1995-05-13”,“13383838438”,NULL)
`SHOW tables;`#查看逻辑表
`DESC Student;`#查看数据表
`SHOW CREATE TABLE student`,#查询建表语句
`DROP TABLE Student`#删除表文件
数据库的范式: 构造数据库必须遵循一定的规则,这种规则就是范式
第一范式:原子性
- 第一范式是数据库的基本要求,不满足这一点就不是关系数据库
- 数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。
第二范式:唯一性
- 数据表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列用来存储唯一标识,这个唯一属性列被称作主键列
第三范式:关联性
- 每列都与主键有直接关系,不存在传递依赖
- 依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联
字段约束
MySQL中的字段约束共有四种
CREATE TABLE t_teacher(
id INT PRIMARY KEY AUTO INCREMENT
...
);
`CREATE TABLE t_teacher(`
`id INT PRIMARY KEY AUTO INCREMENT,`
`name VARCHAR(200) NOT NULL`
`married BOOLEAN NOT NULL deFAUlT False`
`);`
- `CREATE TABLE t_dept(#父表`
`deptno INT UNSIGNED PRIMARY KEY`
`dname VARCHAR(20) NOT NULL UNIQUE`
`tel CHAR(4) UNIQUE`
`);`
`CREATE TABLE t_temp(`
`empno INT UNSIGNED PRIMARY KEY,`
`ename VARCHAR(20) NOT NULL`
`sex enum("男","女") NOT NULL`,#enum:只能选男或者女
`deptno INT UNSIGNED`
`hiredate DATE NOT NUlL`
`FOREIGN KEY(deptno)REFERENCES t_dept(deptno)`
`);关联单词 references`
数据排序的好处
CREATE TABLE表名称(
...,
INDEX[索引名称](字段),
...,
);
CREATE INDEX 索引名称 ON 表名(字段);
ALTER TABLE 表名称 ADD INDEX [索引名](字段)
SHOW INDEX FROM 表名
DROP INDEX 索引名称 ON 表名
记录查询
SELECT * FROM t_emp;
SELECT empno, ename, sal FROM t_emp;
SELECT empno,sal * 12 as "income" FROM t_emp;
数据分页
如我们查看朋友圈,只会加载少量部分信息,不用一次性加载全部朋友圈,那样只会浪费CPU时间、内存和网络带宽
如果结果集的记录很多,则可以使用limit关键字限定结果集数量
- SELECT .... FROM … LIMIT 起始位置,偏移量;
- SELECT empno, ename FROM t_emp LIMIT 0,20;
数据分页的简写用法
SELECT empno, ename FROM t emp LIMIT 10;
SELECT empno, ename FROM t emp LIMIT 0, 10;
查询语句的子句执行顺序
FROM -> SELECT -> LIMIT
结果集排序
SELECT FROM ORDER BY 列名 [ASC|DESC]
SELECT ename,sal from t_emp ORDER BY sal;
SELECT ename, sal FROM t_emp order BY hiredate desc;
SELECT empno, ename, sal hiredate FROM t emp ORDER BY sal desc,hiredate Asc;
FROM - SELECT - ORDER BY - LIMIT
去除重复记录
- 如果我们需要去除重复的数据,可以使用 DISTINCT关键字来实现
- SELECT D| STINCT 字段 FROM…;
- SELECT DISTINCT job FROM t emp;
条件查询
SELECT FROM WHERE条件[AND|OR]条件 .....;
SELECT empno, ename, sal FRom t emp WHERE deptno=10 AND sal >=2000;
SELECT empno, ename FROM t emp WHERE ename = FORD AND sal >=2000
SELECT empno, ename FROM t emp Where deptno =10 AND sal >=2000
FROM -> WHERE- >LECT -> ORDER BY ->LIMIT
什么是聚合函数
SELECT SUM(ename) FROM t emp;
SELECT SUM(sal) FROM t emp;
WHERE deptno In (10, 20);
SELECT MAX (comm) FROM t empi
SELECT MAX (sal+IFNULL(comm, 0)) FROM t emp WhERE deptno IN(10,20)
SELECT MAX (LENGTH (ename)) FROM t emp
SELECT MIN (empno) FROM t emp;
SELECT MIN (hiredate) FRoM t empi
SELECT AVG(sal+IFNULL(comm)) FROM t empi
SELECT COUNT(*) FROM t emp;
SELECT COUNT(*)FROM t emp WhERE deptno IN (10, 20) AND sal>=2000 AND DATEDIFF(NOW(hiredate)/365>=15
SELECT COUNT (* FROM t emp WHERE hiredate>=1985-01-01 AND Sal>AVG(sal)
为什么要分组?
SELECT deptno, AVG(sal) FROM t_emp GROUP BY deptno
SELECT deptno, job, COUNT(*), AVG(sal) FROM t emp GroUP BY deptno, job ORDER BY deptno
SELECT deptno, CoUNT(*), AVG(sal) FROM t emp GroUP BY deptno;
selECt deptno, CoUNT(), AVG(sal), sal FROM t emp GroUP BY deptno;
SELECT deptno, CoUNT(*),AVG(sal), MAX (sal), MIN (sal) ROM t emp groUP BY deptno WITH ROLLUP;
SELECT deptno, GroUP CONCAT (ename), COUNT(*) FROM t emp WHERE sal>=2000 GROUP BY deptno
FROM - WHERE-> GROUP BY -> SELECT - ORDER BY -> LIMIT
从多张表中提取数据
SELECT e empno, e. ename, d dname
FROM t emp e join t dept d
oN e deptno=d. deptnoi
SELECT FROM表1
[|NER] JON表2 ON 条件
[NER] JON表3 ON 条件
SELECT ...FROM 表1 J0IN 表2 0N 连接条件
SELECT ...FROM 表1 J0IN 表2 WHERE 连接条件;
SELECT…FROM表1,表2 WHERE连接条件
子查询简介
- 子查询是一种査询中嵌套查询的语句
- 查询底薪超过公司平均底薪的员工的信息
子查询的分类
- 子查询可以写在三个地方: WHERE子句、FROM子句、 SELECT子句,但是只有FROM子句子查询是最可取的
WHERE子查询
- 这种子查询最简单,最容易理解,但是却是效率很低的子查询
- 查询底薪超过公司平均底薪的员工的信息
FROM子查询
- 这种子查询只会执行一次,所以查询效率很高
SELECT-子查询
- 这种子查询每输出一条记录的时候都要执行一次,查询效率很低
单行子查询和多行子查询
SELECT……FROM表名 WHERE[NOT] EXISTS(子查询)
INSERT INTO 表名(字段1,字段2,…) VALUES(值1,值2,)
INSERT INTO 表名(字段1,字段2,… VALUES(值1,值2,……),(值1,值2,…)
INSERT INTO表名SET字段1=值1,字段2=值2,……
INSERT [IGNORE] INTO表名
UPDATE[ GNORE]表名
SET字段1=值1,字段2=值2,
[WHERE条件1…]
[ ORDER BY…]
[LIMIT …….]
UPDATE表10表2 ON条件 SET字段1=值1,字段2=值2,.....,
UPDATE 表1[ LEFT I RIGHT]JOIN 表2 0N条件 SET字段1=值1,字段2=值2,…,
DELETE [ GNORE] FROM 表名
[ WHERE 条件1,条件2,…]
[ORDER BY ,.....]
[LMIT….];
DELETE表1, FROM 表1 J0IN 表2 ON条件
[ WHERE条件1,条件2.,,,,,,]
[ORDER BY......]
[LIMIT…]
TRUNCATE TABLE表名
函数的定义:像编程语言利用函数封装业务功能一样,数据库也把一些复杂的功能封装到函数里,供使用者调用
DATE FORMAT(日期,表达式)
SELECT ename, DATE FORMAT(hiredater,“%Y”)FROM t emp
DATE ADD(日期, NTERVAL偏移量时间单位)
DATEDIFF(日期,日期)
字符函数
CASE
WHEN 表达式 THEN 值1
WHEN 表达式 THEN 值2
ELSE 值 N
END
避免写入直接操作数据文件
SQL语句I COMMIT I ROLLBACK I
SET SESSION TRANSACTON工 SOLATION LEVEL READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
mysqldump -uroot-p[ no-data]逻辑库>路径