目录
一、数据库的概念
1.1 什么是数据库
1.2 什么是关系型数据库
1.3 什么数据库和表
1.4 常见的数据库管理系统
一、数据库的概念
1996年,MySQL 1.0发布,它只面向一小拨人,相当于内部发布。到了1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本),最开始只提供Solaris下的二进制版本。一个月后,Linux版本出现了。在接下来的两年里,MySQL被依次移植到各个平台。
1999~2000,MySQL AB公司在瑞典成立。Monty雇了几个人与Sleepycat合作,开发【Berkeley DB引擎】, 由于BDB支持事务处理,因此MySQL从此开始支持事务处理了。
2000,MySQL不仅公布自己的源代码,并采用GPL(GNU General Public License)许可协议,正 式进入开源世界。同年4月,MySQL对旧的存储引擎ISAM进行了整理,将其命名为MyISAM。
2001年,集成Heikki Tuuri的存储引擎【InnoDB】,这个引擎不仅能【支持事务处理,并且支持行级锁】。后来该引擎被证明是最为成功MySQL事务存储引擎。MySQL与InnoDB的正式结合版本是4.0
2003年12月,【MySQL 5.0】版本发布,提供了视图、存储过程等功能。
2008年1月,MySQL AB公司被Sun公司以10亿美金收购,MySQL数据库进入Sun时代。在Sun时代,Sun公司对其进行了大量的推广、优化、Bug修复等工作。
2008年11月,MySQL 5.1发布,它提供了分区、事件管理,以及基于行的复制和基于磁盘的NDB集群系 统,同时修复了大量的Bug。
2009年4月,Oracle公司以74亿美元收购Sun公司,自此MySQL数据库进入Oracle时代,而其第三方的存储引擎InnoDB早在2005年就被Oracle公司收购。
2010年12月,MySQL 5.5发布,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。MySQL 5.5不是时 隔两年后的一次简单的版本更新,而是加强MySQL各个方面在企业级的特性。Oracle公司同时也承诺 MySQL 5.5和未来版本仍是采用GPL授权的开源产品。
什么是SQL
SQL是Structured Query Language的缩写,它的前身是著名的关系数据库原型系统System R所采 用的SEQUEL语言。
作为一种访问关系型数据库的标准语言,SQL自问世以来得到了广泛的应用,不仅是著 名的大型商用数据库产品Oracle、DB2、Sybase、SQL Server支持它,很多开源的数据库产品如PostgreSQL、MySQL也支持它,甚至一些小型的产品如Access也支持SQL。
近些年蓬勃发展的NoSQL系最初是宣称不再需要SQL的,后来也不得不修正为Not Only SQL,来拥抱SQL。 蓝色巨人IBM对关系数据库以及SQL语言的形成和规范化产生了重大的影响,第一个版本的SQL标准SQL86 就是基于System R的手册而来的。Oracle在1979年率先推出了支持SQL的商用产品。随着数据库技术和应 用的发展,为不同RDBMS提供一致的语言成了一种现实需要。
对SQL标准影响最大的机构自然是那些著名的数据库产商,而具体的制订者则是一些非营利机构,例如 【国际标准化组织ISO、美国国家标准委员会ANSI】等。各国通常会按照 ISO标准和ANSI标准(这两个机构 的很多标准是差不多等同的)制定自己的国家标准。中国是ISO标准委员会的成员国,也经常翻译一些国际标准对应的中文版。标准为了避免采用具体产品的术语,往往会抽象出很多名词,从而增加了阅读和理解的难度,翻译成中文之后更容易词不达意。对于数据库系统实现者和用户而言,很多时候还不如直接读英文版本为好。虽然正式的标准不像RFC那样可以从网络上免费获得,标准草案还是比较容易找到的。待批准的标准草案和最终的标准也没有什么实质上的区别,能够满足日常工作的需要。
下面是SQL发展的简要历史:
1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86
1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89
1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)
1999年,ISO/IEC 9075:1999,SQL:1999(SQL3)
2003年,ISO/IEC 9075:2003,SQL:2003
2008年,ISO/IEC 9075:2008,SQL:2008
2011年,ISO/IEC 9075:2011,SQL:2011
如果要了解标准的内容,比较推荐的方法是【泛读SQL92】(因为它涉及了SQL最基础和最核心的一些内容),然后增量式的阅读其他标准。
不只是mysql还有其他数据库,在SQL92或者SQL99这些国际SQL标准基础之上,它们还扩展了自己的一些SQL语句,比如MySQL中的limit关键字
1. MySQL数据库安装与配置
数据库系统:
-
数据库系统(DBMS) Database Management System 是指一个能为用户提供信息服务的系统。它实现了有组织地、动态地储存大量相关数据的功能,提供了数据处理和信息资源共享的便利手段。
关系型数据库系统:
-
关系型数据库系统( RDBMS) Relational database management system 是指使用了关系模型的数据库系统。
-
关系模型中,数据是分类存放的,数据之间可以有联系
第一个关系型数据库
-
1976年BM的 System R团队在出版的论文中阐述了关系模型,1979年 Oracle公司推出了首个关系型数据库成品。
关系型数据的应用
-
关系型数据库被应用在非常多的领域,教育系统,商业系统,医疗系统,而且关系型数据库可以有效组织和管理大量复杂的数据,所以关系型数据库才是最重要的数据库产品。
主流的关系型数据库
-
DB2 :商业版,成本高,比如电信,金融领域
-
Oracle:按照CPU数据库收费
-
MySQL:开源免费
-
SQL Server:微软数据库
NOSQL数据库系统
-
NOSQL数据库指的是数据分类存放,但是数据之间没有关联关系的数据库系统
主流的NoSQL数据库
-
Redis 内存保存数据秒杀 ,微博
-
MemCache:相似于Redis,市场份额不是很大
-
MongoDB: 硬盘保存数据,知乎,简书
-
Ne04j:负责的人际关系
1.2 MySQL数据库安装与初始化
MySQL数据库:
-
MySQL是应用最广泛、普及度最高的开源关系型数据库
-
MySQL由瑞典 MySQL AB公司开发,目前属于 Oracle旗下产品
MySQL 大事记
-
1996 MySQL1.0 诞生
-
1999 MySQL AB公司成立
-
2000 MySQLL4.0发布
-
2003 MySQL5.0发布 MySQL衍生版 - Oracle - MariaDB - Percona
1.3 用户管理
MySQL客户端:Navicat,DBeaver
-
官网地址 Navicat:https://www.navicat.com.cn
密码忘记重设置root密码
-
重设root密码(二)
-
创建一个TXT文件,定义修改密码的SQL语句
ALTER USER 'root'@'localhost' IDENTIFIED BY ′123456′ 注意:本地'@'表示root登录方式,可以本地登录与远程登录。localhost是本地登录,如果加上%,代表可远程登录
-
重设root密码(二)
-
右键,Window PowerShell管理员运行
-
停止:输入net stop mysql80
-
启动:mysqld --defaults-file =" "路径"\my.ini" --init -file=“ “TXT文件路径” --console 注意:路径存在空格j记得加引号
-
关闭:关闭当前服务Ctrl +C
-
启动:输入 net start mysql80
-
-
1.4 MySQL配置文件
MySQL配置文件
在my.ini文件中,我们可以设置各种 MySQL的配置,例如字符集、端口号、目录地址等等[client] #客户端信息配置信息
[mysql] #客户端信息配置信息
[mysqld] #数据库配置信息
[client]
port=3306
[mysql]
no-beep
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
2. 数据库表的相关操作
2.1 定义逻辑库,数据表
什么是SQL语言:
-
SQL是用于访问和处理数据的标准的计算机语言
SQL语言分类
-
DML:添加 修改 删除 查询
-
DCL:用户 权限 事务
-
DDL:逻辑库 数据表 视图 索引
SQL语句注意事项
-
SQL语句不区分大小写,但是字符串区分大小写
SELECT “HelloWorld”;
-
SQL语句必须以分号结尾,SQL语句中的空白和换行没有限制,但是不能破坏语法
SQL语句的注释
-
SQL语句的注释有两种,分别如下:
-
#这是一段注释文字
-
/这是另一段注释文字/
创建逻辑库
mysql> CREATE DATABASE 逻辑库名称 #创建逻辑库
mysql> SHOW DATABASES; #展示逻辑库
mysql> DROP DATABSE 逻辑库名称 ;#展示逻辑库
mysql> CREATE DATABASE student #创建逻辑库
mysql> CREATE DATABASE drop #删除逻辑库
创建数据表
CREATE TABLE数据表 (
列名1 数据类型 [约束][ COMMENT注释],
列名2 数据类型 [约束][ COMMENT注释],
...
)[ COMMENT=注释];
CREATE TABLE student(
id INT UNSIGNED PRIMARY KEY, #unsigned:无符号
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 #删除表文件
2.2 定义数据库语言:数据类型
数字类型:
-
tinyint: 小整数
-
smallint 普通整数
-
mediumint:普通整数
-
int 较大整数
-
bigint: 大整数
-
float:单精度浮点数
-
double:双精度浮点数
-
decimal : deciimal(10,2 ) #2.代表精确到后两位。10;整数位加小数位为10个字符
不精确的浮点数
-
十进制的浮点数无法在计算机中用二进制精确表达
字符串类型:
-
char:固定长度字符串
-
varchar 不固定长度字符串
-
text 不固定长度字符串
日期类型:
-
Date:日期
-
Time:时间
-
Year:年份
-
datetime :日期时间
-
timestamp:时间戳
修改表结构
ALTER TABLE 表名称
ADD 列1 数据类型 [约束] [COMMENT注释],
ADD 列2 数据类型 [约束] [COMMENT注释];
ALTER TABLE student
ADD address VARCHAR(200) NOT NULL,
ADD home tel CHAR(11) NOT NULL;
修改字段类型和约束
ALTER TABLE 表名称
MODIFY 列1 数据类型 [约束] [COMMENT注释],
MODIFY 列2 数据类型 [约束] [COMMENT注释];
ALTER TABLE student
MODIFY home tel VARCHAR(20)NOT NULL;
修改字段名称
ALTER TABLE 表名称
CHANGE 列1 新列名1 数据类型 [约束] [COMMENT注释],
CHANGE 列2 新列名2 数据类型 [约束] [COMMENT注释];
ALTER TABLE student
CHANGE address home address VARCHAR(200)NOT NULL;
删除字段
ALTER TABLE 表名称
DROP 列1,
DROP 列2,
ALTER TABLE student
DROP home address,
DROP home tel;
2.3 数据库的范式与字段约束
数据库的范式:
-
构造数据库必须遵循一定的规则,这种规则就是范式
-
目前关系数据库有6种范式,一般情况下,只满足第三范式即可
-
第一范式:原子性
-
第一范式是数据库的基本要求,不满足这一点就不是关系数据库。数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。
-
-
第二范式:唯一性
-
数据表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列用来存储唯一标识,这个唯一属性列被称作主键列
-
-
第三范式:关联性
-
每列都与主键有直接关系,不存在传递依赖。依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联
-
字段约束
-
MySQL中的字段约束共有四种
-
主键约束: primary key 字段值唯一,且可以为NULL
-
非空约束:not null 字段不能为null
-
唯一约束 UNIQUE 字段唯一,且可以为null
-
外键约束 FOREIGN KEY 保持关联数据的逻辑性
主键约束:
-
主键约束要求字段的值在全表必须唯一,而目不能为NU儿L值
-
建议主键一定要使用数字类型,因为数字的检索速度会非常快
-
如果主键是数字类型,还可以设置自动增长
CREATE TABLE t_teacher( id INT PRIMARY KEY AUTO INCREMENT, );
非空约束
-
非空约束要求字段的值不能为NULL值
-
NULL值以为没有值,而不是 "” 空字符串
CREATE TABLE t_teacher( id INT PRIMARY KEY AUTO_INCREMENT name VARCHAR(200) NOT NULL, married BooLeaN NOT NULL DEFAULT FALSE );
唯一约束
-
唯一约束要求字段值如果不为NULL,那么在全表必须唯一
CREATE TABLE t_teacher( ..... tel CHAR(11) NOT NULL UNIQUE );
创建表
-
创建数据表 t_teacher
create table t_teacher( id int unsigned primary key auto_increment, name varchar(20) not null, tel char(11) not null unique, 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
外键约束的闭环问题
-
如果形成外键闭环,我们将无法删除任何一张表的记录
2.4 索引
数据排序的好处
-
一旦数据排序之后,查找的速度就会翻倍,现实世界跟程序世界都是如此 如何创建索引
CREATE TABLE表名称( ..., INDEX[索引名称](字段), ..., ); CREATE TABLE t message( id INT UNSIGNED PRIMARY KEY, content VARCHAR(200)NOT NULL, type ENUM("公告","通报","个人通知")NOT NULL, create_time TIMESTAMP NOT NULL, INDEX idx_type (type) );
如何添加与删除索引
-
添加与删除
CREATE INDEX 索引名称 ON 表名(字段);#增加索引 ALTER TABLE 表名称 ADD INDEX [索引名](字段);#增加索引 SHOW INDEX FROM 表名;#展示索引 DROP INDEX 索引名称 ON 表名;#删除索引 DROP INDEX idx_type ON t_message; CREATE INDEX idx_type ON t message(type)i SHOW INDEX FROM t message; ALTER TABLE t message ADD INDEX idx_type(type);
索引的使用原则
-
数据量很大,而且经常被查询的数据表可以设置索引
-
索引只添加在经常被用作检索条件的字段上面
-
不要在大字段上创建索引
3.1 数据库操作语言:普通查询
记录查询
-
最基本的查询语句是由 SELECT和FROM关键字组成的
SELECT * FROM t_emp; SELECT empno, ename, sal FROM t_emp;
-
SELECT语句屏蔽了物理层的操作,用户不必关心数据的真实存储,交由数据库高效的査找数据 使用列别名
-
通常情况下, SELECT子句中使用了表达式,那么这列的名字就默认为表达式,因此需要一种对列名重命名的机制
SELECT empno,sal * 12 as "income" FROM t_emp;
-
词法分析与优化,读取SQL语句
-
FROM 选择数据来源
-
SELECT 选择输出内容
3.2 数据库操作语言:数据分页
数据分页
-
如我们查看朋友圈,只会加载少量部分信息,不用一次性加载全部朋友圈,那样只会浪费CPU时间、内存和网络带宽
-
如果结果集的记录很多,则可以使用limit关键字限定结果集数量
数据分页的简写用法SELECT .... FROM … LIMIT 起始位置,偏移量; SELECT empno, ename FROM t_emp LIMIT 0,20;
数据分页的简写用法
- 如果LIMIT子句只有一个参数,它表示的是偏移量,起始值默认为0
SELECT empno, ename FROM t emp LIMIT 10; SELECT empno, ename FROM t emp LIMIT 0, 10;
-
查询语句的子句执行顺序
FROM -> SELECT -> LIMIT
3.3 数据操作语言:排序
结果集排序
-
如果没有设置,查询语句不会对结果集迸行排序。也就是说,如果想让结果集按照某种顺序排列,就必须使用 ORDER BY子句。
-
SELECT FROM ORDER BY 列名 [ASC|DESC] SELECT ename,sal from t_emp ORDER BY sal
排序关键字
-
如果排序列是数字类型,数据库就按照数字大小排序,
-
ASC代表升序(默认), DESC代表降序
-
如果是日期类型就按照日期大小排序
-
如果是字符串就按照字符集序号排序。
SELECT ename, sal FROM t_emp order BY hiredate desc;
多个排序字段
-
我们可以使用 ORDER BY规定首要排序条件和次要排序条件。数据库会先按照首要排序条件排序,如果遇到首要排序內容相同的记录,那么就会启用次要排序条件接着排序
SELECT empno, ename, sal hiredate FROM t emp ORDER BY sal desc,hiredate Asc;
排序+分页
-
ORDER BY子句书写的时候放在LMIT子句的前面
FROM - SELECT - ORDER BY - LIMIT
3.4 数据操作语言:去除重复记录
去除重复记录
如果我们需要去除重复的数据,可以使用 DISTINCT关键字来实现
SELECT DISTINCT 字段 FROM … ;
SELECT DISTINCT job FROM t emp;
注意事项:使用 DISTINCT的 SELECT子句中只能查询一列数据
如果查询多列,去除重复记录就会失效。
DISTINCT关键字只能在 SELECT 子句中使用一次
3.5 数据操作语言:条件查询
条件查询
-
很多时候,用户感兴趣的并不是逻辑表里的全部记录,而只是它们当中能够满足某一种或某几种条件的记录。这类条件要用 WHERE子句来实现数据的筛选
SELECT FROM WHERE条件[AND|OR]条件 .....; SELECT empno, ename, sal FRom t emp WHERE deptno=10 AND sal >=2000;
-
算数运算符
-
+ 加法
-
- 减法
-
* 乘法
-
/ 除法
-
% 求模
-
-
比较运算符
-
包含 IN
-
为空 IS NULL
-
BETWEEN AND 范围
-
LIKE 模糊查询
-
REGEXP 正则表达式
-
-
逻辑运算符
-
AND 与关系
-
OR 或关系
-
NOT 非关系
-
-
WHERE子句的注意事项
-
WHERE子句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧
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- >seLECT -> ORDER BY ->LIMIT
4. 数据库的高级查询
4.1数据操作语言:聚合函数
什么是聚合函数
-
聚合函数在数据的查询分析中,应用十分广泛。聚合函数可以对数据求和、求最大值和最小值、求平均值等等。 聚合函数
-
SUM函数
-
SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。
SELECT SUM(ename) FROM t emp; SELECT SUM(sal) FROM t emp; WHERE deptno In (10, 20);
-
-
MAX函数
-
MAX函数用于获得非空值的最大值。
-
SELECT MAX (comm) FROM t empi
-
-
问题1:查询10和20部门中,月收入最高的员工?
-
SELECT MAX (sal+IFNULL(comm, 0)) FROM t emp WhERE deptno IN(10,20)
问题2:查询员工名字最长的是几个字符?
-
SELECT MAX (LENGTH (ename)) FROM t emp
-
-
-
-
MIN函数
-
MIN函数用于获得非空值的最小值。
SELECT MIN (empno) FROM t emp; SELECT MIN (hiredate) FRoM t empi
-
-
AVG函数
-
AVG函数用于获得非空值的平均值,非数字数据统计结果为0
SELECT AVG(sal+IFNULL(comm)) FROM t empi
-
-
COUNT函数
-
COUNT()用于获得包含空值的记录数, COUNT(列名)用于获得包含非空值的记录数。
-
SELECT COUNT(*) FROM t emp;
-
-
COUNT函数
-
查询10和20部门中,底薪超过2000元并且工龄超过15年的员工人数?
-
SELECT COUNT(*)FROM t emp WhERE deptno IN (10, 20) AND sal>=2000 AND DATEDIFF(NOW(hiredate)/365>=15
-
-
查询1985年以后入职的员工,底薪超过公司平均底薪的员工数量?
-
SELECT COUNT (* FROM t emp WHERE hiredate>=1985-01-01 AND Sal>AVG(sal)
-
-
4.2数据操作语言:分组查询
为什么要分组?
-
默认情况下汇总函数是对全表范围内的数据做统计
-
GROUP BY子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理
-
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子句的要求
-
-
-
查询语句中如果含有 GROUP BY子句,那么 SELECT-子句中的内容就必须要遵守规定: SELECT子句中可以包括聚合函数,或者 GROUP BY子句的分组列,其余内容均不可以出现在 SELECT子句中
-
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;
-
GROUP CONCAT函数
-
GROUP CONCAT函数可以把分组查询中的某个字段拼接成一个字符串
-
查询每个部门内底薪超过2000元的人数和员工姓名
-
SELECT deptno, GroUP CONCAT (ename), COUNT(*) FROM t emp WHERE sal>=2000 GROUP BY deptno
-
-
-
各种子句的执行顺序
-
查询语句中, GROUP BY子句应该第几个执行?
FROM - WHERE-> GROUP BY -> SELECT - ORDER BY -> LIMIT
-
4.3数据操作语言: HAVING子句
-
HAVING子句的特殊用法 按照数字1分组, MySQL会依据 SELECT子句中的列进行分组,HAVING子句也可以正常使用
4.4 表连接查询
从多张表中提取数据
-
从多张表中提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生笛卡尔积。
-
从多张表中提取数据规定了连接条件的表连接语句,就不会出现笛卡尔积
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连接条件
-
-
-
外连接: 外连接是不管符不符合连接条件,记录都要保留在结果集中
-
外连接简介 外连接与内连接的区别在于,除了符合条件的记录之外,结果集中还会保留不符合条件的记录。
-
左连接和右连接
-
左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。如果右表没有符合条件的记录,就用NUL与左表连接。右外连接也是如此。
-
-
外连接的注意事项 内连接只保留符合条件的记录,所以查询条件写在ON子句和WHERE子句中的效果是相同的。但是外连接里,条件写在 WHERE子句里,不合符条件的记录是会被过滤掉的,而不是保留下来。
-
-
4.5 子查询
子查询简介 - 子查询是一种査询中嵌套查询的语句 - 查询底薪超过公司平均底薪的员工的信息 子查询的分类 - 子查询可以写在三个地方: WHERE子句、FROM子句、 SELECT子句,但是只有FROM子句子查询是最可取的 WHERE子查询 - 这种子查询最简单,最容易理解,但是却是效率很低的子查询 - 查询底薪超过公司平均底薪的员工的信息 FROM子查询 - 这种子查询只会执行一次,所以查询效率很高 SELECT-子查询 - 这种子查询每输出一条记录的时候都要执行一次,查询效率很低
单行子查询和多行子查询
-
单行子查询的结果集只有一条记录,多行子查询结果集有多行记录
-
多行子查询只能出现在 WHERE子句和FROM子句中
-
WHERE子句中的多行子查询
-
WHERE子句中,可以使用N、ALL、ANY、 EXISTS关键字来处理多行表达式结果集的条件判断
-
-
EXISTS关键字
-
EXISTS关键字是把原来在子查询之外的条件判断,写到了子查询的里面。
-
SELECT……FROM表名 WHERE[NOT] EXISTS(子查询)
-
5. MySQL对数据的基本操作
5.1数据操作语言: INSERT语句
-
INSERT语句可以向数据表写入记录,可以是一条记录,也可以是多条记录
-
INSERT INTO 表名(字段1,字段2,…) VALUES(值1,值2,)
INSERT INTO 表名(字段1,字段2,… VALUES(值1,值2,……),(值1,值2,…)
-
-
INSERT语句方言
-
MYSQL的 NSERT语句还有一种方言语法
-
INSERT INTO表名SET字段1=值1,字段2=值2,……
-
-
IGNORE关键字
-
IGNORE关键字会让 INSERT只插入数据库不存在的记录
INSERT [IGNORE] INTO表名
-
5.2 数据操作语言: UPDATE语句
-
UPDATE语句
-
UPDATE语句用于修改表的记录
-
UPDATE[ GNORE]表名
SET字段1=值1,字段2=值2,
[WHERE条件1…]
[ ORDER BY…]
[LIMIT …….]
练习题-
把每个员工的编号和上司的编号+1,用 ORDER BY子句完成
-
把月收入前三名的员工底薪减100元,用LMT子句完成
-
把10部门中,工龄超过20年的员工,底薪增加200元
-
把ALEN调往 RESEARCH部门,职务调整为 ANALYST
-
-
-
UPDATE语句的表连接
-
因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造 UPDATE语句
-
UPDATE表10表2 ON条件 SET字段1=值1,字段2=值2,.....,
-
-
表连接的 UPDATE语句可以修改多张表的记录
-
UPDATE语句的表连接既可以是内连接,又可以是外连接
-
UPDATE 表1[ LEFT I RIGHT]JOIN 表2 0N条件 SET字段1=值1,字段2=值2,…,
-
-
5.5数据操作语言: DELECT 语句
-
DELETE语句
-
DELETE语句用于删除记录,语法如下:
DELETE [ GNORE] FROM 表名
[ WHERE 条件1,条件2,…]
[ORDER BY ,.....]
[LMIT….];
-
练习:
-
删除10部门中,工龄超过20年的员工记录 删除20部门中工资最高的员工记录
-
-
DELETE语句的表连接(一)
-
因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造 DELETE语句
DELETE表1, FROM 表1 J0IN 表2 ON条件
[ WHERE条件1,条件2.,,,,,,]
[ORDER BY......]
[LIMIT…]
-
-
练习
-
删除 SALES部门和该部门的全部员工记录
-
删除每个低于部门平均底薪的员工记录
-
-
DELETE语句的表连接(二)
-
DELETE语句的表连接既可以是内连接,又可以是外连接 DELETE表1,……FROM表1 LEFT IRGHTJOIN 表2 ON条件
-
-
快速删除数据表全部记录
-
DELETE语句是在事务机制下删除记录,删除记录之前,先把将要删除的记录保存到日志文件里,然后再删除记录
-
TRUNCATE语句在事务机制之外删除记录,速度远超过 DELETE语句
TRUNCATE TABLE表名
-
-
6. MySQL基本函数的使用
6.1 MySQL的函数
函数的定义:像编程语言利用函数封装业务功能一样,数据库也把一些复杂的功能封装到函数里,供使用者调用
-
函数的分类
-
数字函数
-
字符函数
-
日期函数
-
条件函数
-
6.2 数字函数
-
ABS 绝对值
-
ROUND 四舍五入
-
POWER 幂函数
-
LOG 对数函数
-
LN 对数函数
6.3 日期函数
-
获取系统时间函数
-
NOW() 函数能获得系统日期和时间,格式yy-MM-dh:mm:ss
-
CURDATE() 函数能获得当前系统日期,格式yy-MM-dd
-
CURTIME() 函数能获得当前系统时间,格式hh:mm:Ss
-
DATE FORMAT() 函数用于格式化曰期,返回用户想要的日期格式
DATE FORMAT(日期,表达式)
SELECT ename, DATE FORMAT(hiredater,“%Y”)FROM t emp
练习-
利用日期函数,查询明年你的生日是星期几?
-
利用日期函数,查询1981年上半年入职的员工有多少人?
-
-
-
日期计算的注意事项
-
MySQL数据库里面,两个日期不能直接加減,日期也不能与数字加减
-
-
日期偏移计算
-
DATE ADD0函数可以实现日期的偏移计算,而且时间单位很灵活
DATE ADD(日期, NTERVAL偏移量时间单位)
-
-
计算日期之间相隔的天数
-
DATEDIFFOI函数用来计算两个日期之间相差的天数
DATEDIFF(日期,日期)
-
6.4字符函数
字符函数
-
LOWER 转换小写字符
-
UPPER 转换大写字符
-
LENGTH 字符数量
-
CONCAT 连接字符串
-
INSTR 字符出现的位置
-
INSERT 插入/替换字符
-
SUBSTR截取字符串
-
SUBSTRING截取字符串
-
TRIM 去除首尾
6.5条件函数
-
SQL语句中可以利用条件函数来实现编程语言里的条件判断
-
IFNUL(表达式,值)
-
IF(表达式,值1,值2) 练习
-
-
中秋节公司发放礼品, SALES部门发放礼品A,其余部门发放礼品B,打印每名员工获得的礼品。
-
条件语句
-
复杂的条件判断可以用条件语句来实现,比F语句功能更强大
CASE
WHEN 表达式 THEN 值1
WHEN 表达式 THEN 值2
ELSE 值 N
END
-
-
-
练习
-
公司年庆决定组织员工集体旅游,每个部门旅游目的地是不同的。 SALES部门去P1地点, ACCOUNTING部门去P2地点, RESEARCH部门去P3地点,查询每名员工的旅行地点。
-
7. MySQL的综合应用
7.1事务机制
避免写入直接操作数据文件
-
如果数据的写入直接操作数据文件是非常危险的事情
-
利用日志来实现间接写入
-
MySQL总共有5种日志,其中只有redo日志和undo日志与事务有关
-
事务机制( Transaction) RDBMS=SQL语句+事务(ACID) 事务是一个或者多个SQL语句组成的整体,要么全部执行成功,要么全都执行失败
-
事务执行流程
-
开启事物 UPDATE语句 DELETE语句 提交事物
-
-
管理事务
-
默认情况下, MySQL执行每条SQL语句都会自动开启和提交事务
-
为了让多条SQL语句纳入到一个事务之下,可以手动管理事务
-
START TRANSACTION
-
SQL语句I COMMIT I ROLLBACK I
-
-
事务的ACD属性
-
原子性:一个事务中的所有操作要么全部完成,要么全部失败。事务执行后不允许停留在中间某个状态
-
一致性:事务的一致性。不管在任何给定的时间、并发事务有多少,事务必须保证运行结果的一致性
-
隔离性:隔离性要求事务不受其他并发事务的影响,如同在给定的时间內该事务是数据库唯一运行的事物,默认情况下A事务,只能看到日志中该事务的相关数据
-
持久性:事务一旦提交,结果便是永久性的。即便发生宕机,仍然可以依靠事务日志完成数据的持久化
-
-
事务的四个隔离级别
-
read uncommitted 读取未提交数据
-
read committed 读取已提交数据
-
repeatable read 重复读取
-
serializable序列化
-
-
修改事务隔离级别
-
READ UNCOMMITTED代表可以读取其他事务未提交的数据
-
SET SESSION TRANSACTON工 SOLATION LEVEL READ UNCOMMITTED
-
-
READ COMMITTED代表只能读取其他事务提交的数据
-
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
-
-
READ COMMITTED代表只能读取其他事务提交的数据
-
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
-
-
事务的序列化
-
由于事务并发执行所带来的各种问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务逐一执行,就不会产生上述问题
-
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-
-
-
7.2 数据导入与导出
-
数据导出与备份的区别
数据导出,导出的纯粹是业务数据
数据备份,备份的是数据文件、日志文件、索引文件等等 -
数据导出的分类
SQL文档
文本文档 -
导入SQL文件
mysqldump用来把业务数据导出成SQL文件,其中也包括了表结构-
mysqldump -uroot-p[ no-data] 逻辑库> 路径
-