SQL复习
MySQL
SQL介绍
SQL
SQL的全拼是什么?
SQL全拼:Structured Query Language,也叫结构化查询语言。
SQL92和SQL99有什么区别呢?
SQL92和SQL99分别代表了92年和99年颁布的SQL标准。
在 SQL92 中采用(+)代表从表所在的位置,而且在SQL92 中,只有左外连接和右外连接,没有全外连接。
LEFT JOIN 和 RIGHT JOIN 只存在于 SQL99 及以后的标准中,在 SQL92 中不存在,只能用(+)表示。
SQL99 的外连接有哪些形式?
SQL99 的外连接包括了三种形式:
- 左外连接:LEFT JOIN 或 LEFT OUTER JOIN
- 右外连接:RIGHT JOIN 或 RIGHT OUTER JOIN
- 全外连接:FULL JOIN 或 FULL OUTER JOIN
SQL语言按照功能划分为哪四部分?它们分别是什么作用?
SQL语言按照功能划分为DDL、DML、DCL、DQL四部分。
DDL:Data Definition Language,数据定义语言。用于定义数据库对象,包括数据库、数据表和列。
DML:Data Manipulation Language,数据操作语言。用于增加、删除、修改数据表中的记录。
DCL:Data Control Language,数据控制语言。用于定义访问权限和安全级别。
DQL:Data Query Language,数据查询语言。用于查询想要的记录。
什么是ER图?
ER图即Entity Relationship Diagram,也叫实体-关系图。是用于描述现实世界的概念模型,主要包含三个要素:实体、属性、关系。
实体:我们要管理的对象;
属性:每个实体的属性;
关系:对象之间的关系。
SQL的单行注释怎么写?多行注释怎么写?
sql
-- 单行注释
#单行注释
/*
多行注释
*/
SELECT、FROM、WHERE、HAVING、ORDER BY、LIMIT、GROUP BY七个关键字之间的执行顺序是什么?
执行顺序是:FROM→ WHERE →GROUP BY → HAVING→SELECT→ORDER BY→LIMIT。
为表添加了别名之后,还能使用原来的表名吗?
一旦设置别名,就不能再直接使用表名了。
int(11)
中的11
是什么意义?
int
代表整数类型,11
代表显示长度为11位,即最大有效显示长度,与类型包含的数值范围大小无关。
varchar(255)
中的255
是什么含义?
255
表示可变字符串类型的最大长度为255。
DCL
DCL是?作用是什么?主要关键字有哪些?
DCL(Data Control Language),是数据库控制语言。
主要用于管理数据库用户、控制用户数据库访问权限。
主要关键字包括:GRANT、REVOKE等。
如何查询MySQL中的所有用户?重点
sql
SELECT * FROM mysql.user;
如何创建用户?重点
sql
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
如何修改用户密码?重点
sql
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
如何删除用户?重点
sql
DROP USER '用户名'@'主机名' ;
如何查询用户的权限?重点
sql
SHOW GRANTS FOR '用户名'@'主机名' ;
如何授予用户权限?重点
sql
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
如何撤销用户权限?重点
sql
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
sql
CREATE USER 'itsy'@'localhost' IDENTIFIED BY '123456';
#以上语句的作用是什么?
创建用户itsy, 只能够在当前主机localhost访问, 密码123456。
sql
CREATE USER 'sycoder'@'%' IDENTIFIED BY '123456';
#以上语句的作用是什么?
创建用户sycoder, 可以在任意主机访问该数据库, 密码123456。
sql
ALTER USER 'sycoder'@'%' IDENTIFIED WITH mysql_native_password BY '111111' ;
#以上语句的作用是什么?
修改用户sycoder的访问密码为111111。
sql
DROP USER 'itsy'@'localhost';
#以上语句的作用是什么?
删除 itsy@localhost 用户。
DDL
什么是DDL?DDL的作用是什么?主要关键字包括哪些?
DDL全拼为Data Definition Language,也就是数据定义语言。
用于定义数据库对象,包括数据库、数据表和列。
主要关键字包括:CREATE、DROP、USE、SHOW、ALTER、TRUNCATE等。
如何查看当前有哪些数据库?
sql
SHOW databases;#查看哪些数据库
如何查询当前数据库?
sql
SELECT database();
如何创建数据库?
sql
create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序 规则 ] ;
如果创建的数据库已经存在,如何避免出现报错ERROR 1007
?
加上可选参数
if not exists
,可以解决这个问题
如何删除数据库?
sql
drop database [ if exists ] 数据库名;
如果删除的数据库本身就不存在,如何避免报错?
加上参数
IF EXISTS
。
sql
DROP DATABASE IF EXISTS itsy;
如何切换数据库?
sql
use 数据库名;
如何查看当前数据库中的所有表?
sql
show tables;
如何查看指定表的结构?
sql
desc 表名;
如何查询指定表的建表语句?
sql
show create table 表名;
如何创建表?
sql
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释 ],
字段2 字段2类型 [COMMENT 字段2注释 ],
字段3 字段3类型 [COMMENT 字段3注释 ],
...... 字段n 字段n类型 [COMMENT 字段n注释 ] )
[ COMMENT 表注释 ];
如何向表中添加字段?
sql
ALTER TABLE 表名 ADD 字段名 类型 (长度)
[ COMMENT 注释 ] [ 约束 ];
如何修改字段的数据类型?
sql
ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);
如何修改字段名和字段类型?
sql
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
如何删除字段?
sql
ALTER TABLE 表名 DROP 字段名;
如何修改表名?
sql
ALTER TABLE 表名 RENAME TO 新表名;
如何删除表?
sql
DROP TABLE [ IF EXISTS ] 表名;
如何删除指定表,并创建新表?
sql
TRUNCATE TABLE 表名;
DML
什么是DML?DML的作用是什么?主要关键字是哪些?
DML是Data Manipulatioin Language,也叫数据操作语言。
主要用于对数据的增加、删除和修改。
主要关键字包括:INSERT、UPDATE、DELETE。
如何向指定的表中添加数据?
向指定的表中添加数据时,分为两种情况:
第一种:只给指定的字段添加数据(其它字段采用默认值)。
第二种:给全部字段添加数据。
当我们为全部字段赋值时,可以省去字段名的内容。
sql
#给指定的字段添加数据:
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
#给全部字段添加数据:
INSERT INTO 表名 VALUES (值1, 值2, ...);
如何修改指定数据的字段内容?
sql
UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;
如何删除指定表中的指定数据?如果删除表中的数据时,没有添加WHERE关键字,会有什么后果?
如果米有WHERE关键字,会将表中的数据全部删除。
sql
DELETE FROM 表名 [ WHERE 条件 ]
DQL
什么是DQL?DQL有什么作用?DQL的关键字有哪些?
DQL(Data Query Language),即数据库查询语言。
DQL主要用于数据的查询。
DQL的关键字包括:SELECT、WHERE、GROUP、ORDER BY、FROM、DISTINCT、HAVING、LIMIT。
为列添加别名使用什么关键字?
为列添加别名需要使用AS关键字,但其实AS关键字可以省略。
WHERE和HAVING的区别是什么?重点
两者的区别主要体现在两个方面:
- 两者执行时间不同:WHER在分组之前执行,不参与分组;HAVING在分组之后执行。
- 判断条件不同:WHERE不能对聚合函数进行判断,但是HAVING可以。
使用ORDER BY
对查询结果进行排序时,如果不指定排序方式,则默认排序方式是什么?
ORDER BY的排序方式有两种,DESC和ASC。
默认的排序方式是ASC,也就是升序排序。
LIMIT
的作用是什么?起始索引是从几开始的?
LIMIT用于分页查询。起始索引是从0开始的。
sql
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
LIMIT的起始索引什么情况下可以省略?
如果只查询第一页的数据,可以省略LIMIT的起始索引。
SELECT查询
在SELECT查询中,关键字的顺序是什么?
关键字的顺序是绝对不能颠倒的:
sql
SELECT...FROM...WHERE...GROUP BY...HAVING...ORDER BY...
查询常数
为什么要对常数进行查询呢?
常数查询用于整合不同的数据源时,作为标记数据源来源的标记。如:
sql
SELECT '王者荣耀' as platform,name FROM heros;
在这段SQL语句中,我们虚构了一个
platform
字段,并将其设置为固定值"王者荣耀"。所以查询结果中,将会增加一个字段
platform
,其内容均为"王者荣耀"。
使用常数查询时,有哪些需要注意的地方?
需要注意,如果常数是一个字符串,则必须使用单引号
''
,没有单引号的常数,会被SQL当作列名进行检查,从而造成"找不到列"的错误。但如果常数是一个数字,则可以直接写数字,不会造成报错。
去除重复行
去除重复行使用的关键字是什么?
去除重复行需要使用
DISTINCT
关键字。
DISTINCT
关键字的作用是什么?如何使用?
DISTINCT
用于去除查询结果中的重复数据,其去重的对象是所有的列。在SELECT关键字后,所有列名前使用。如:
sql
SQL:SELECT DISTINCT attack_range FROM heros
如果DISTINCT的位置错误,则会造成报错。
排序
对查询结果进行排序时需要使用的关键字是什么?
使用ORDER BY对查询的结果进行排序。
ORDER BY语句有什么地方需要掌握?
ORDER BY有以下几处需要掌握:
- ORDER BY后可以有一个或多个列名。对多个列的排序会按照先后顺序进行。
- OREDR BY可以设置排序规则,ASC表示递增,DESC表示递减。默认按照ASC进行排序。
- ORDER BY可以对非选择列进行排序,即:即使SELECT后没有此列,也可以放在ORDER BY后参与排序。
- ORDER BY语句通常位于SELECT语句的最后一条子句,否则会报错。
如果我们需要对不同的列采用不同的排序规则(A列升序,B列降序),应该怎么写?
对不同的列进行排序时,可以直接在ORDER BY语句后的列名后增加排序规则。
如:
sql
SQL:SELECT name, hp_max FROM heros ORDER BY mp_max, hp_max DESC
此时,查询结果将会按照mp_max升序,hp_max降序的方式排序。
约束返回结果数
如何约束返回结果的数量?
在MySQL中,使用LIMIT关键字来约束返回结果的数量。
注意,在不同的DBMS中,使用的关键字是不同的。
约束返回结果有什么好处?
约束返回结果可以减少数据表的网络传输量,提升查询效率。避免全表扫描。
执行顺序
SQL中,SELECT语句的执行顺序是什么样的?重点
注意,在MySQL和Oracle中,SELECT的执行顺序基本相同。
sql
FROM → WHERE → GROUP BY → HAVING → SELECT的字段 → DISTINCT → ORDER BY → LIMIT
具体如下:
sql
SELECT DISTINCT player_id, player_name, count(*) as num #顺序5
FROM player JOIN team ON player.team_id = team.team_id #顺序1
WHERE height > 1.80 #顺序2
GROUP BY player.team_id #顺序3
HAVING num > 2 #顺序4
ORDER BY num DESC #顺序6
LIMIT 2 #顺序7
完整的 SELECT 语句内部的执行顺序是什么样的?重点
一条完整的 SELECT 语句内部的执行顺序是这样的:
- FROM 子句组装数据(包括通过 ON 进行连接);
- WHERE 子句进行条件筛选;
- GROUP BY 分组 ;
- 使用聚集函数进行计算;
- HAVING 筛选分组;
- 计算所有的表达式;
- SELECT 的字段;
- ORDER BY 排序;
- LIMIT 筛选。
SELECT *
SELECT *
有什么缺点?
使用
SELECT *
会增加数据库负担。在实际工作中,应尽量写出所需要的列名,生产环境下,尽量不要使用SELECT *
进行查询。
通配符
如何查询英雄中,包含"太"字的英雄都有哪些?
使用通配符查询。
sql
SQL:SELECT name FROM heros WHERE name LIKE '%太%'
为什么要尽量少的使用通配符进行查询?
- 通配符需要消耗较长的时间来进行匹配。
- 如果LIKE检索的字段有索引,那么模糊查询时,索引可能失效。
太%
和%太
有什么区别?
- 首先两者最大的区别在于查询的对象不同,前者指以"太"开头的元素,后者指以"太"结尾的元素。
- 其次,当对应字段存在索引时,前者不会进行全表扫描,后者会进行全表扫描。
比较运算符
SQL中的比较运算符有哪些?
SQL中的运算符有10种:
>
、>=
、<
、<=
、=
、<>或!=
、BETWEEN AND
、IN()
、LIKE 占位符
、IS NULL
和IS NOT NULL
。
BETWEEN AND
包含最大值和最小值吗?
BETWEEN AND
包含最大值和最小值。
逻辑运算符
SQL中的逻辑运算符有哪些?
SQL中的逻辑运算符有四种:IN、AND或
&&
、OR或||
、NOT或!
。
当 WHERE 子句中同时存在 OR 和 AND 的时候,哪个优先级会更高?
当 WHERE 子句中同时存在 OR 和 AND 的时候,AND 执行的优先级会更高,即: SQL 会优先处理 AND 操作符,然后再处理 OR 操作符。
所以当WHERE子句中同时出现AND和OR的时候,一定要注意执行的先后顺序。
分组
GROUP BY是什么?有什么地方需要注意?
GROUP BY用于对查询到的数据进行分组。使用GROUP BY进行分组时,字段的值为NULL的数据也会被分为一组。
WHERE和HAVING的区别是什么?
- WHERE 是用于过滤数据行,而 HAVING 则用于分组。
- HAVING一般和GROUP BY组合使用。
DBMS
DBMS
常见的DBMS有哪些?哪些是关系型数据库?哪些是非关系型数据库?重点
常见的DBMS有MySQL、SQL Server、Redis、Elasticsearch、DB2和MongoDB。
关系型数据库:Oracle、MySQL、SQL Server、DB2。
非关系型数据库:MongoDB、Redis、Elasticsearch。
其中,MongoDB是文档型数据库,Redis是键值型数据库,Elasticsearch是搜索引擎。
DBMS是什么?
DBMS即DataBase Management System,也叫数据库管理系统。
DBS和DBMS哪一个概念更大?重点
DBS即DataBase System,也叫数据库系统,包括了数据库、数据库管理系统以及数据库管理人员DBA。
所以DBS是比DBMS更大的概念。
NoSQL数据库有哪些类型?重点
NoSQL类型众多,包括:键值型数据库、搜索引擎、文档型数据库、列存储和图型数据库等。
键值型数据库的优缺点是什么?重点
键值型数据库常用于内容缓存。
优点:查询速度快。
缺点:无法自由使用条件过滤。
如果不知道数据的键,就需要遍历所有的键来查询。
Redis是最流行的键值型数据库。
什么是文档型数据库?
文档型数据库将文档作为处理信息的基本单位,一个文档就相当于一条记录。MongoDB是最流行的文档型数据库。
什么是搜索引擎?
搜索引擎的优势在于采用了全文搜索的技术,相对关系型数据库,有更高的全文检索效率。
什么是列存储?
"列式存储"式相对于"行式存储"而言的,常见的Oracle、MySQL、SQL Server等都是"行式存储数据库",而列式存储强调"将数据按照列存储到数据库中"。
列存储的优势在于大大降低系统的I/O,适用于分布式文件系统。
为什么列存储能降低系统的I/O?
因为采用列存储时,相邻数据的数据类型是相同的,这就为压缩提供了方便。压缩之后,自然也就可以降低系统的I/O。
什么是图型数据库?
利用图的数据结构实现了实体之间的关系,数据模型主要以节点和边(也叫关系)来实现,优势在于能高效地解决复杂的关系问题。
Oracle
Oracle
Oracle通过什么来判断是否存在缓存和执行计划,从而决定使用硬解析还是软解析的?
Oracle通过共享池来判断。
Oracle中的SQL是如何执行的?
Oracle中的SQL的执行分为六个步骤:
语法检查→语义检查→权限检查→共享池检查→优化器→执行器
什么是语法检查?什么是语义检查?
语法检查指:检查SQL的拼写是否正确,当SQL的拼写有问题时,Oracle会报语法错误。
语义检查指:检查SQL中的访问对象是否存在。
语法检查和语义检查共同保证SQL语句没有错误。
什么是权限检查?
权限检查指:检查用户是否具备访问该数据的权限。
什么是共享池检查?
共享池(Shared Pool)是一块内存池,主要用于缓存SQL语句和该SQL语句的执行计划。
Oracle通过检查共享池中是否存在SQL语句的执行计划,来判断进行软解析还是硬解析。
具体的流程是:Oracle首先对SQL语句进行Hash运算,根据得出的Hash值在库缓存(Library Cache)中查找,如果存在该SQL语句的执行计划,就按既有的执行计划执行,跳过优化器环节,直接进入执行器环节,这就是软解析;如果不存在该SQL语句的执行计划,就进入优化器环节,创建该SQL语句的解析树,生成执行计划。
什么是优化器?什么是执行器?
优化器:会进行硬解析,创建解析树,生成执行计划。
执行器:SQL语句的具体执行位置。
什么是硬解析?什么是软解析?
硬解析和软解析离不开共享池。
对于一个SQL语句,Oracle会先计算该SQL语句的Hash值,根据此Hash值,判断共享池中是否有对应的执行计划。如果有,就会执行软解析;相反,如果没有,就会进行硬解析。
软解析即利用共享池中的现有的执行计划执行SQL语句;
硬解析指共享池的缓存中,没有SQL语句的执行计划,需要利用优化器创建解析树对SQL语句进行解析,然后生成执行计划。
库缓存区的作用是什么?
库缓存区主要用于缓存SQL语句和执行计划。
数据字典缓冲区的作用是什么?
数据字典缓冲区用于Oracle中的对象定义,如:表、视图、索引等对象。
对SQL语句进行解析时,需要从数据字典缓冲区中获取。
绑定变量
Oracle中的绑定变量有什么作用?有什么弊端?
绑定变量可以让我们减少硬解析,减少优化器的解析工作量。
但绑定变量本质是动态SQL的方式,参数的变化会对SQL执行的效率造成影响,同时,绑定变量也会对SQL优化造成一定的影响。
MySQL
MySQL
MySQL有什么特点?
MySQL 不支持全外连接。
SQL和MySQL有什么区别?
SQL是结构化查询语言,Structured Query Language。
MySQL是数据库管理系统DBMS。
如何检查你本机有没有安装MySQL?
待定
my.ini文件有什么作用?
my.ini文件用于对MySQL进行配置,如:修改默认存储引擎、修改默认事务隔离级别等。
MySQL中的SQL是如何执行的?SQL语句在MySQL中的执行流程是什么?
在MySQL中,SQL语句是在mysqld中的SQL层执行的,具体流程为:
SQL语句→查询缓存→解析器→优化器→执行器。
MySQL的体系架构是什么?
MySQL采用的是C/S架构,即:Client/Server。
服务器端使用的是mysqld。
MySQL的体系结构整体分为四层:
- 连接层
- 服务层
- 引擎层
- 存储层
连接层的作用是什么?
服务层的作用是什么?
SQL的分析和优化。
引擎层的作用是什么?
数据的存储和读取。
存储层的作用是什么?
MySQL和Oracle的区别是什么?
MySQL中的存储引擎采用了插件的形式,每种存储引擎都对应一种数据库应用环境。且允许开发人员设置自己的存储引擎。
MySQL中,常用的存储引擎有哪些?默认的存储引擎是哪一个?为什么?
MySQL中常用的存储引擎有:InnoDB、MyISAM、Memory、NDB、Archive等。
MySQL默认的存储引擎是InnoDB。
因为相比于MyISAM,InnoDB有三个优点:
- 支持行级锁,因此并发性能更高
- 支持事务。
- 支持外键约束,更能保证数据的完整性和正确性。
数据类型
MySQL中的数据类型分为哪些?
MySQL中的数据类型主要分为三大类:数值类型、字符串类型、日期时间类型。
其中,
数值类型又分为七种:TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL。
字符串类型分为五种:CHAR、VARCHAR、BLOB、TEXT、LONGTEXT。
日期时间类型分为五种:DATE、TIME、YEAR、DATETIME、TIMESTAMP。
数值类型中,TINYINT的大小是多少?SMALLINT的大小是多少?INT/INTEGER的大小是多少?BIGINT的大小是多少?
在MySQL的数值类型中,TINYINT、SMALLINT、INT、BIGINT四者之间的大小排序是:TINYINT<SMALLINT<INT<BIGINT。
且按照2的整数幂递增,分别对应1bytes、2bytes、4bytes、8bytes。
数值类型 | 大小 |
---|---|
TINYINT | 1bytes |
SMALLINT | 2bytes |
INT/INTEGER | 4bytes |
BIGINT/Long | 8bytes |
数值类型中,FLOAT、DOUBLE的大小分别是多少?
两者都是浮点数值,前者是单精度浮点数,后者是双精度浮点数。
数值类型 | 大小 |
---|---|
FLOAT | 4bytes |
DOUBLE | 8bytes |
字符串类型都有哪些?
字符串类型包括:CHAR、VARCHAR、BLOB、TEXT、LONGTEXT。
CHAR和VARCHAR有什么区别?CHAR的大小是多少?VARCHAR的大小是多少?
CHAR是定长字符串,VARCHAR是变长字符串。
但两者在使用时都需要指定长度。
字符串类型 | 大小 |
---|---|
CHAR | 0-255bytes |
VARCHAR | 0-65535bytes |
BLOB常用于什么场景?什么情况下会使用BLOB?
BLOB是二进制形式的长文本数据,所以经常用于图片数据等需要用二进制保存的数据。
日期时间类型分为哪几种?
日期时间类型分为:DATE、TIME、YEAR、DATETIME、TIMESTAMP。
DATE类型、TIME类型、DATETIME类型、TIMESTAMP类型的数据分别是什么格式?
日期时间类型 | 格式 |
---|---|
DATE | YYYY-MM-DD |
DATETIME | YYYY-MM-DD HH:MM:SS |
TIME | HH:MM:SS |
TIMESTAMP | YYYY-MM-DD |
mysqld
mysqld的结构是什么样的?
mysqld分为三层结构:连接层、SQL层、存储引擎层。
连接层的作用是什么?
连接层负责建立客户端和服务器端的连接。
连接建立后,客户端会发送SQL到服务器端。
SQL层的作用是什么?
SQL层负责对SQL语句进行查询处理。
存储引擎层的作用是什么?
存储引擎层负责与数据库打交道,负责数据的存储和读取。
SQL层的结构是什么样的?
SQL层分为四部分:查询缓存、解析器、优化器、执行器。
为什么MySQL8.0之后,抛弃了查询缓存的功能?
抛弃的原因主要在于查询缓存的效率不高。
查询缓存的作用是什么?
查询缓存会保存已经之前查询过的SQL语句,当这条SQL语句再次出现时,服务器端就会直接将结果返回给客户端;如果查询缓存中没有这条SQL语句,就会进入解析器阶段。
文件结构
MySQL文件夹下的tableName.ibd
文件有什么作用?
MySQL5.5之后的默认是InnoDB,而InnoDB引擎会为每张表都生成一个对应的表空间文件。
在
tableName.ibd
中,文件名为表名,后缀即为InnoDB为每个表创建的表空间文件的文件类型。IBD文件会保存每张表的结构、数据、索引等相关信息。
ibd文件有什么特点?
ibd文件是二进制文件,直接打开将会显示乱码,所以不能直接打开。
需要通过
idb2sdi tableName.ibd
命令查看ibd文件。
存储结构
MySQL中的数据存储结构是什么样的?
MySQL中,数据分为五部分:
表空间、段、区、页、行。
- 表空间:tablespace,ibd文件就是表空间文件,表空间文件中包含多个段(Segment)。
- 段:Segment,包含数据段、索引段、回滚段等,一个段中包含多个区。
- 区:Extent,表空间的单元结构,大小默认是1M,一个区中包含64页数据。
- 页:Page,InnoDB磁盘管理的最小单元,大小默认是16K。
- 行:Row,每行即为一条数据。
Navicat
SQL函数
SQL函数
为什么不建议使用SQL函数?
因为不同的DBMS之间的差异很大,大部分DBMS都会有属于自己的SQL函数,这导致采用SQL函数的代码的可移植性很差。
聚合函数
什么是聚合函数?常用的聚合函数有哪些?
聚合函数也叫聚集函数,指用于对一组数据进行汇总的函数。参数为一组数据的集合,返回值为单个值。
常用的聚合函数有五个:COUNT、MAX、MIN、AVG、SUM。
WHERE、聚合函数、HAVING三者之间的执行顺序是什么?
WHERE→聚合函数→HAVING。
COUNT(*)和COUNT(字段)有什么区别?
- 前者只是统计数据行,不论该字段的值是否为NULL;
- 后者会忽略字段的值为NULL的数据。
当MAX或MIN函数的参数为字符串时,如何计算最大值或最小值?
MAX 和 MIN 函数用于字符串类型数据的统计时,如果是英文字母,则按照 A---Z 的顺序排列,越往后,数值越大。如果是汉字则按照全拼拼音进行排列,越靠后,值越大。
需要说明,我们需要先把 name 字段(汉字类型)统一转化为 gbk 类型,使用CONVERT(name USING gbk),然后再使用 MIN 和 MAX 取最小值和最大值。
数值函数
常用的数值函数有哪些?
常用的数值函数有:ABS、SIGN、SQRT、LEAST、MOD、ROUND。
ROUND函数有什么作用?
ROUND函数可以对数据进行四舍五入,它有两个参数,分别表示需要处理的数据和四舍五入的位数。
SELECT ABS(-2)
的运行结果是什么?
运行结果为 2。
SELECT MOD(101,3)
的运行结果是什么?
运行结果 2。
SELECT ROUND(37.25,1)
的运行结果是什么?
运行结果 37.3。
字符串函数
常用的字符串函数有哪些?
常用的字符串函数有:CONCAT、LENGTH、CHAR_LENGTH、LOWER、UPPER、SUBSTRING、REPLACE。
LEENGTH()
和CHAR_LENGTH()
的区别是什么?
- 两个函数的共同点都是计算字段的长度。
- 在
LENGTH()
中,一个汉字算作三个字符,数字和字母都算作一个字符。- 在
CHAR_LENGTH()
中,汉字、数字、字母,都算作一个字符。
SELECT CONCAT('abc', 123)
的运行结果是什么?
运行结果为 abc123。
SELECT LENGTH('你好')
的运行结果是什么?
运行结果为 6。
SELECT CHAR_LENGTH('你好')
的运行结果是什么?
运行结果为 2。
SELECT LOWER('ABC')
的运行结果是什么?
运行结果为 abc。
SELECT REPLACE('fabcd', 'abc', 123)
的运行结果是什么?
运行结果为 f123d。
SELECT SUBSTRING('fabcd', 1,3)
的运行结果是什么?
运行结果为 fab。
日期函数
常用的日期函数有哪些?
常用的日期函数有:YEAR、HOUR、QUARTER。
QUARTER函数的作用是什么?
QUARTER函数可以返回日期对应的季度,范围为1~4。
为什么对日期进行比较时,不能直接使用日期字符串?
我们一般使用DATE函数来对日期进行比较。
一般情况下,我们无法确认birthdate的数据类型是字符串,还是datetime类型,所以,使用DATE函数是比较安全的。
SELECT CURRENT_DATE()
的运行结果是什么?
运行结果为 2019-04-03。
SELECT CURRENT_TIME()
的运行结果是什么?
运行结果为 21:26:34。
SELECT CURRENT_TIMESTAMP()
的运行结果是什么?
运行结果为 2019-04-03 21:26:34。
SELECT EXTRACT(YEAR FROM '2019-04-03')
的运行结果是什么?
运行结果为 2019。
SELECT DATE('2019-04-01 12:00:05')
的运行结果是什么?
运行结果为 2019-04-01。
流程函数
常见的流程函数有哪些?
常见的流程函数有:IF、IFNULL。
加密解密函数
常见的加密解密函数有哪些?
常见的加密解密函数有:PASSWORD、MD5、SHA、ENCODE、DECODE。
转换函数
什么是转换函数?常见的转换函数有哪些?
转换函数用于转换数据之间的类型。
常见的转换函数有:CAST、COALESCE。
CAST函数的作用是什么?它的参数是什么?
CAST用于数据类型转换,其参数是一个表达式。
这个表达式通过AS关键字分割了两个参数,分别表示原始数据类型和目标数据类型。
COALESCE函数的作用是什么?
返回第一个非空数值。
SELECT CAST(123.123 AS INT)
的运行结果是什么?为什么?
运行结果会报错。
CAST 函数在转换数据类型的时候,不会四舍五入,如果原数值有小数,那么转换为整数类型的时候就会报错。
SELECT CAST(123.123 AS DECIMAL(8,2))
的运行结果是什么?DECIMAL(8,2)
是什么含义?
运行结果为 123.12。
DECIMAL(8,2)
中,8代表整数部分和小数部分加起来最大的位数,2代表小数的位数。即:精度为8位,小数位数为2位的数据类型。
SELECT COALESCE(null,1,2)
的运行结果是什么?
运行结果为 1。
约束
常见的约束有哪些?
常见的约束有七种:非空约束、唯一约束、主键约束、默认约束、外键约束、检查约束、索引约束。
六种常见约束对应的关键字分别是什么?
约束 | 关键字 |
---|---|
非空约束 | NOT NULL |
唯一约束 | UNIQUE |
主键约束 | PRIMARY KEY |
外键约束 | FOREIGN KEY |
默认约束 | DEFAULT |
检查约束 | CHECK |
索引约束 | INDEX |
主键约束的作用是什么?
主键约束的作用是唯一标识一条记录,不能重复,不能为空。即:UNIQUE+NOT NULL。
一个数据表的主键只能有一个,但是,主键可以是一个字段,也可以是多个字段组合。
外键约束的作用是什么?
外键约束确保了两个表之间引用的完整性。一个表中的外键,对应另一张表中的主键。
普通索引和唯一性约束有什么区别?
唯一性约束相当于创建了一个约束和普通索引(NORMAL INDEX),普通索引只是提升数据的检索速度,不是对字段的唯一性约束。
多表查询
多表查询
多表查询分为哪几类?
多表查询分为四类:内连接查询、外连接查询、自连接查询、联合查询。
内连接查询
内连接查询分为哪几类?
内连接查询分为两类:隐式内连接查询和显式内连接查询。
什么是隐式内连接查询?
sql
SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;
什么是显式内连接查询?
sql
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;
#INNER可以省略
外连接查询
外连接查询分为哪几类?
外连接查询分为两类:左外连接和右外连接。
什么是左外连接?
sql
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;
什么是右外连接?
sql
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;
现有表1、表2,两张表,C是它们的交集,A、B分别是两表不相交的部分数据,则表1左外连接表2时,查询结果是什么?表1右外连接表2的结果是什么?
左外连接会将左表的全部数据以及两表相交的部分数据查询出来作为结果。
所以表1左外连接表2的结果是A+C。
同理可知,表1右外连接表2的结果是C+B。
自连接查询
什么是自连接?
sql
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;
联合查询
什么是联合查询?
sql
SELECT 字段列表 FROM 表名 ...
UNION [ALL]
SELECT 字段列表 FROM 表名 ...
子查询
标量子查询、列子查询、行子查询、表子查询的区别是什么?
子查询分为:标量子查询、列子查询、行子查询、表子查询。
它们的分类依据是查询结果的格式。
即:
标量子查询的结果是单个值;
列子查询的结果是一列数据;
列行子查询的结果是一行数据;
表子查询的结果是多行多列的表。
子查询相关的常用的关键字有哪些?
子查询常用的关键字有:IN、NOT IN、ANY、SOME、ALL。
关联子查询和非关联子查询的区别是什么?
关联子查询和非关联子查询的区别在于是否执行多次子查询。
非关联子查询:子查询从数据表中查询了数据结果,这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行。
关联子查询:子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部。
什么是存在性检测子查询?
使用EXISTS关键字的子查询即为存在性检测子查询。
什么是集合比较子查询?
存储引擎
MySQL中,常用的存储引擎有哪些?
MySQL中常用的存储引擎有:InnoDB、MyISAM、Memory、NDB、Archive等。
如何查看当前 MySQL 支持的存储引擎都有哪些?
通过 SHOW ENGINES 命令来查看当前 MySQL 支持的存储引擎都有哪些,以及这些存储引擎是否支持事务。
如何选用存储引擎?
- 如果我们对数据表的完整性和正确性要求比较高,且需要较高的并发性能,则应选择InnoDB。
- 如果我们需要较多的插入和删除操作,且不要求较高的并发性以及表的完整性,则可以选择MyISAM。
- 如果我们只需要缓存数据,且对查询的响应速度要求较高,则可以使用Memory。
InnoDB
InnoDB的特点是什么?
InnoDB是MySQL5.5版本之后的默认引擎。
最大的特点有三个:
- 支持事务、
- 支持行级锁定(提高并发性能)、
- 支持外键约束。
MyISAM
MyISAM的特点是什么?
MyISAM是MySQL5.5之前的默认存储引擎,特点是:
- 不支持事务,
- 不支持外键,
- 但是访问速度快且占用的内存少。
MyISAM的锁机制只能到达表锁级别,相对于InnoDB的行级锁,并发性能会低一些。
sdi文件有什么用?
存储表的结构信息
MYD文件有什么用?
存储数据
MYI文件有什么用?
存储索引
Memory
Memory的特点是什么?
Memory的特点是:
- 使用系统内存作为存储介质,支持Hash索引,所以可以得到更快的响应速度。
- 但是,如果mysqld进程崩溃,则会导致所有数据丢失,
所以要慎重使用Memory作为存储引擎。
其它存储引擎
NDB的特点是什么?
NDB主要用于MySQL Cluster分布式集群环境。
Archive的特点是什么?
Archive有很好的压缩机制,用于文件归档,在请求写入时,会进行压缩,常用来作为仓库。
连接
内连接:将多个表之间满足连接条件的数据行查询出来。它包括了等值连接、非等值连接和自连接。外连接:会返回一个表中的所有记录,以及另一个表中匹配的行。它包括了左外连接、右外连接和全连接。交叉连接:也称为笛卡尔积,返回左表中每一行与右表中每一行的组合。在 SQL99 中使用的 CROSS JOIN。
NATURAL JOIN
CROSS JOIN
ON 连接
USING 连接
SQL92和SQL99中的连接有什么区别?
在 SQL92 中采用(+)代表从表所在的位置,而且在SQL92 中,只有左外连接和右外连接,没有全外连接。
LEFT JOIN 和 RIGHT JOIN 只存在于 SQL99 及以后的标准中,在 SQL92 中不存在,只能用(+)表示。
SQL99 的外连接有哪些形式?
SQL99 的外连接包括了三种形式:
- 左外连接:LEFT JOIN 或 LEFT OUTER JOIN
- 右外连接:RIGHT JOIN 或 RIGHT OUTER JOIN
- 全外连接:FULL JOIN 或 FULL OUTER JOIN
不同 DBMS 中使用连接需要注意的地方有哪些?
- 不是所有的 DBMS 都支持全外连接
- Oracle 没有表别名 AS
- SQLite 的外连接只有左连接
关于连接的性能问题有哪些需要注意?
- 控制连接表的数量
- 在连接时不要忘记 WHERE 语句
- 使用自连接而不是子查询
为什么要使用自连接而不是子查询?
因为子查询的判断对象是未知的数据表;自连接的判断对象是已知的数据表,
所以大部分 DBMS 中都对自连接处理进行了优化,在许多 DBMS 的处理过程中,对于自连接的处理速度要比子查询快得多。
事务
事务
MySQL 5.5 版本之前,默认的存储引擎是什么?为什么要改变默认的存储引擎?
MySQL 5.5 版本之前,默认的存储引擎是MyISAM。在 5.5 版本之后默认存储引擎是 InnoDB。
InnoDB 取代 MyISAM 的重要原因,是因为InnoDB 支持事务,而MyISAM不支持事务。
事务的英文是什么?
事务的英文是transaction。
事务的特性是什么?
事务的特性:ACID
- A:原子性(Atomicity),事务是不可分割的,它是进行数据处理操作的基本单位。
- C:一致性(Consistency),数据库在进行事务操作后,会由原来的一致状态,变成另一种一致的状态。当事务提交后,或者当事务发生回滚后,数据库的完整性约束不能被破坏。
- I:隔离性(Isolation),每个事务都是彼此独立的,不会受到其他事务的执行影响。一个事务在提交之前,对其他事务都是不可见的。
- D:持久性(Durability),事务提交之后对数据的修改是持久性的,即使在系统出故障比如系统崩溃或者存储介质发生故障,数据的修改依然是有效的。
事务的常用控制语句都有哪些?
- START TRANSACTION 或者 BEGIN,作用是显式开启一个事务。
- COMMIT:提交事务。当提交事务后,对数据库的修改是永久性的。
- ROLLBACK 或者 ROLLBACK TO [SAVEPOINT],意为回滚事务。意思是撤销正在进行的所有没有提交的修改,或者将事务回滚到某个保存点。
- SAVEPOINT:在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可以存在多个保存点。
- RELEASE SAVEPOINT:删除某个保存点。
- SET TRANSACTION,设置事务的隔离级别。
使用事务的方式有哪些?有什么区别?
使用事务有两种方式:隐式事务和显式事务。
- 隐式事务:实际上就是自动提交。
- 显式事务:需要手写 COMMIT 命令提交事务。
Oracle默认的事务使用方式是哪一种?MySQL默认的事务使用方式是哪一种?如何设置MySQL的事务提交方式?
Oracle默认的事务使用方式是显式事务,即不自动提交,需要手动写COMMIT命令来提交事务
MySQL默认的事务使用方式是隐式事务,即:自动提交。
如果要改变MySQL的事务提交方式,需要配置MySQL的参数:
mysql
mysql> set autocommit =0; //关闭自动提交
mysql> set autocommit =1; //开启自动提交
事务相关参数
autocommit参数的作用有哪些?set autocommit =1;
有什么作用?
MySQL 中,autocommit的默认值是0,。
autocommit参数有 2 种取值:
- autocommit=0 时,不论是否采用 START TRANSACTION 或者 BEGIN 的方式来开启事务,都需要用 COMMIT 进行提交,使用 ROLLBACK 对事务进行回滚。
- autocommit=1 时,每条 SQL 语句都会自动进行提交。
所以,
set autocommit =1;
的作用是设置事务的默认提交方式为自动提交。
completion_type 参数的作用有哪些?SET @@completion_type = 1;
有什么作用?
MySQL 中,completion_type 的默认值是0。
completion_type 参数有 3 种取值:
- completion=0:默认情况。当我们执行 COMMIT 的时候会提交事务,在执行下一个事务时,还需要我们使用 START TRANSACTION 或者 BEGIN 来开启。
- completion=1:当我们提交事务后,相当于执行了 COMMIT AND CHAIN,开启一个链式事务,即当我们提交事务之后,会自动开启一个相同隔离级别的事务。
- completion=2:也就是 COMMIT=COMMIT AND RELEASE,当我们提交后,会自动与服务器断开连接。
所以
SET @@completion_type = 1;
的作用是开启链式事务,即:提交了事务之后,自动开启一个隔离级别相同的新事务。
事务隔离级别
如何查看隔离级别?
sql
SELECT @@TRANSACTION_ISOLATION;
如何设置事务的隔离级别?
sql
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
SESSION
和GLOBAL
有什么区别?
- SEEION:会话期间有效。
- GLOBAL:全局(所有会话)有效。
事务并发处理可能存在的三种异常是什么?
事务并发处理可能存在的三种异常:
- 脏读(Dirty Read)
- 不可重复读(Nonrepeatable Read)
- 幻读(Phantom Read)
四种事务隔离的级别分别是什么?
四种事务隔离的级别分别是:
- 读未提交(READ UNCOMMITTED)
- 读已提交(READ COMMITTED)
- 可重复读(REPEATABLE READ)
- 串行化(SERIALIZABLE)
脏读(Dirty Read)是什么?
读到了其他事务还没有提交的数据。
不可重复读(Nonrepeatable Read)是什么?
对某数据进行读取时,由于有其他事务对这个数据同时进行了修改或删除,导致两次读取的结果不同。
幻读(Phantom Read)是什么?
当事务A根据指定查询条件对某数据多次进行读取时,由于有其他事务更改了符合查询条件的数据,导致事务A多次得到的数据的数量不同。
四种隔离级别之间的高低关系是什么?
串行化 > 可重复读 > 读已提交 > 读未提交。
读已提交能解决哪些并发处理异常?
读已提交只能解决脏读的问题,无法解决不可重复度和幻读。
读未提交能解决哪些并发处理异常?
读未提交不能解决任何并发处理异常。
可重复读能解决哪些并发处理异常?
可重复读可以解决脏读和不可重复读问题,不能解决幻读问题。
回滚日志和重做日志(这似乎属于MySQL)
持久性是通过事务日志来保证的。当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。
索引
什么是聚集索引?什么是非聚集索引?聚集索引和非聚集索引有什么区别?
聚集索引的数据和索引保存在一起,非聚集索引的数据和索引是分离的。
在SQL中,一个表只能有一个聚集索引,但是可以有多个非聚集索引。
SQL优化
对数据库进行调优时,都有哪些维度可以选择?
对数据库调优时,可以从以下几个角度入手:
- 选择合适的DBMS
- 优化表设计
- 优化逻辑查询
- 优化物理查询
- 使用Redis或Memcached作为缓存
- 库级优化
拓展
视图
存储过程
游标
SQL语句练习
查询比平均薪资高的员工信息
sql
select * from emp where salary > (select avg(salary) from emp)
查询低于本部门平均工资的员工信息
sql
SELECT * FROM emp e1 where e1.salary < (select avg(e2.salary) from emp e2 where e1.dept_id = e2.dept_id )
查询 "研发部" 员工的平均工资
sql
SELECT avg(salary)
FROM emp
where dept_id = (SELECT id from dept where name = '研发部')
查询拥有员工的部门ID、部门名称
sql
SELECT distinct d.id ,d.name
FROM emp e join dept d on e.dept_id = d.id
查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来
sql
SELECT e.*,d.name '部门名称'
FROM emp e left join dept d on e.dept_id = d.id
where e.age > 40
查询所有员工的工资等级
sql
SELECT e.* ,s.id '薪资等级'
FROM emp e left join salgrade s on e.salary > s.losal and e.salary <= s.hisal
查询主要定位或者次要定位是法师或是射手的英雄,同时英雄的上线时间不在 2016-01-01 到 2017-01-01 之间。
sql
SQL:
SELECT name, role_main, role_assist, hp_max, mp_max, birthdate
FROM heros
WHERE (role_main IN ('法师', '射手') OR role_assist IN ('法师', '射手'))
AND DATE(birthdate) NOT BETWEEN '2016-01-01' AND '2017-01-01'
ORDER BY (hp_max + mp_max) DESC
查询英雄最大生命值的最大值:
sql
SQL:SELECT MAX(hp_max) FROM heros;
查询英雄的名字,以及他们的名字字数:
sql
SQL:SELECT CHAR_LENGTH(name), name FROM heros
查询英雄上线日期(对应字段 birthdate)的年份,只显示有上线日期的英雄即可(有些英雄没有上线日期的数据,不需要显示):
sql
SQL: SELECT name, EXTRACT(YEAR FROM birthdate) AS birthdate FROM heros WHERE birthdate is NOT NULL
#或
SQL: SELECT name, YEAR(birthdate) AS birthdate FROM heros WHERE birthdate is NOT NULL
查询在 2016 年 10 月 1 日之后上线的所有英雄:
sql
SQL: SELECT * FROM heros WHERE DATE(birthdate)>'2016-10-01'
查询不同的生命最大值的英雄数量是多少:
sql
SQL: SELECT COUNT(DISTINCT hp_max) FROM heros
统计不同生命最大值英雄的平均生命最大值,保留小数点后两位:
sql
SQL: SELECT ROUND(AVG(DISTINCT hp_max), 2) FROM heros
查找薪水最高的前 3 名员工。
sql
SELECT *
FROM employees
ORDER BY salary DESC
LIMIT 3;
统计每个部门(dept_id)的平均薪资,并仅显示平均薪资高于 15000 的部门。
sql
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
HAVING AVG(salary) > 15000;
查询员工姓名(name)及其所属部门名称(dept_name),表结构为 employees(id, name, dept_id)和 departments(id, dept_name)。
sql
SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;
查询没有订单的客户(customers 表的 id 不在 orders 表的 customer_id 中)。
sql
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.id
);