大纲:
1. MySQL数据库安装与配置
2. MySQL表操作
3. MySQL基本查询
4. MySQL高级查询
5. MySQL写入操作
6. MySQL基本函数
7. MySQL的综合应用
数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库中的数据进行增加,修改,删除及查询操作。
数据库中的记录是有行有列的数据库就是关系型数据库,与之相反的就是NoSQL数据库了。
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用 于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据 库管理系统访问数据库中表内的数据。
MySQL :开源免费的数据库,小型的数据库 已经被Oracle收购了。
MySQL5.5版本之后都是由 Oracle发布的版本。
Oracle :收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MySQL。
DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中。在中国的互联网公司,要求去 IOE(IBM小型机、Oracle数据库、EMC存储设备)
SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
SyBase :已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
SQLite : 嵌入式的小型数据库,应用在手机端。
MySQL 是最流行的关系型数据库管理系统,在WEB应用方面 MySQL是最好的RDBMS应用软件之一。
MySQL的历史可以追溯到1979年,一个名为Monty Widenius的程序员在为TcX的小公司打工,并且用 BASIC设计了一个报表工具,使其可以在4MHz主频和16KB内存的计算机上运行。当时,这只是一个很底层的 且仅面向报表的存储引擎,名叫Unireg。
1990年,TcX公司的客户中开始有人要求为他的API提供SQL支持。Monty直接借助于mSQL的代码,将 它集成到自己的存储引擎中。令人失望的是,效果并不太令人满意,决心自己重写一个SQL支持。
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是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关键字
数据库系统:
数据库系统(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:负责的人际关系
MySQL数据库:
MySQL是应用最广泛、普及度最高的开源关系型数据库
MySQL由瑞典 MySQL AB公司开发,目前属于 Oracle旗下产品
MySQL 大事记
1996 MySQL1.0 诞生
1999 MySQL AB公司成立
2000 MySQLL4.0发布
2003 MySQL5.0发布 MySQL衍生版 - Oracle - MariaDB - Percona
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
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
什么是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 #删除表文件
数字类型:
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;
数据库的范式:
构造数据库必须遵循一定的规则,这种规则就是范式
目前关系数据库有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
外键约束的闭环问题
如果形成外键闭环,我们将无法删除任何一张表的记录
数据排序的好处
一旦数据排序之后,查找的速度就会翻倍,现实世界跟程序世界都是如此 如何创建索引
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);
索引的使用原则
数据量很大,而且经常被查询的数据表可以设置索引
索引只添加在经常被用作检索条件的字段上面
不要在大字段上创建索引
记录查询
最基本的查询语句是由 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 选择输出内容
数据分页
如我们查看朋友圈,只会加载少量部分信息,不用一次性加载全部朋友圈,那样只会浪费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
结果集排序
如果没有设置,查询语句不会对结果集迸行排序。也就是说,如果想让结果集按照某种顺序排列,就必须使用 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
去除重复记录
如果我们需要去除重复的数据,可以使用 DISTINCT关键字来实现
SELECT DISTINCT 字段 FROM … ;
SELECT DISTINCT job FROM t emp;
注意事项:使用 DISTINCT的 SELECT子句中只能查询一列数据
如果查询多列,去除重复记录就会失效。
DISTINCT关键字只能在 SELECT 子句中使用一次
条件查询
很多时候,用户感兴趣的并不是逻辑表里的全部记录,而只是它们当中能够满足某一种或某几种条件的记录。这类条件要用 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
什么是聚合函数
聚合函数在数据的查询分析中,应用十分广泛。聚合函数可以对数据求和、求最大值和最小值、求平均值等等。 聚合函数
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)
为什么要分组?
默认情况下汇总函数是对全表范围内的数据做统计
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
HAVING子句的特殊用法 按照数字1分组, MySQL会依据 SELECT子句中的列进行分组,HAVING子句也可以正常使用
从多张表中提取数据
从多张表中提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生笛卡尔积。
从多张表中提取数据规定了连接条件的表连接语句,就不会出现笛卡尔积 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子句里,不合符条件的记录是会被过滤掉的,而不是保留下来。
子查询简介 - 子查询是一种査询中嵌套查询的语句 - 查询底薪超过公司平均底薪的员工的信息 子查询的分类 - 子查询可以写在三个地方: WHERE子句、FROM子句、 SELECT子句,但是只有FROM子句子查询是最可取的 WHERE子查询 - 这种子查询最简单,最容易理解,但是却是效率很低的子查询 - 查询底薪超过公司平均底薪的员工的信息 FROM子查询 - 这种子查询只会执行一次,所以查询效率很高 SELECT-子查询 - 这种子查询每输出一条记录的时候都要执行一次,查询效率很低
单行子查询和多行子查询
单行子查询的结果集只有一条记录,多行子查询结果集有多行记录
多行子查询只能出现在 WHERE子句和FROM子句中
WHERE子句中的多行子查询
WHERE子句中,可以使用N、ALL、ANY、 EXISTS关键字来处理多行表达式结果集的条件判断
EXISTS关键字
EXISTS关键字是把原来在子查询之外的条件判断,写到了子查询的里面。
SELECT……FROM表名 WHERE[NOT] EXISTS(子查询)
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表名
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,…,
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表名
函数的定义:像编程语言利用函数封装业务功能一样,数据库也把一些复杂的功能封装到函数里,供使用者调用
函数的分类
数字函数
字符函数
日期函数
条件函数
ABS 绝对值
ROUND 四舍五入
POWER 幂函数
LOG 对数函数
LN 对数函数
获取系统时间函数
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(日期,日期)
字符函数
LOWER 转换小写字符
UPPER 转换大写字符
LENGTH 字符数量
CONCAT 连接字符串
INSTR 字符出现的位置
INSERT 插入/替换字符
SUBSTR截取字符串
SUBSTRING截取字符串
TRIM 去除首尾
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地点,查询每名员工的旅行地点。
避免写入直接操作数据文件
如果数据的写入直接操作数据文件是非常危险的事情
利用日志来实现间接写入
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;
数据导出与备份的区别
数据导出,导出的纯粹是业务数据数据导出的分类
SQL文档导入SQL文件
mysqldump用来把业务数据导出成SQL文件,其中也包括了表结构mysqldump -uroot-p[ no-data] 逻辑库> 路径