SQL知识体系
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的单行注释怎么写?多行注释怎么写?
-- 单行注释
#单行注释
/*
多行注释
*/
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中的所有用户?重点
SELECT * FROM mysql.user;
如何创建用户?重点
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
如何修改用户密码?重点
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
如何删除用户?重点
DROP USER '用户名'@'主机名' ;
如何查询用户的权限?重点
SHOW GRANTS FOR '用户名'@'主机名' ;
如何授予用户权限?重点
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
如何撤销用户权限?重点
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
CREATE USER 'itsy'@'localhost' IDENTIFIED BY '123456';
#以上语句的作用是什么?
创建用户itsy, 只能够在当前主机localhost访问, 密码123456。
CREATE USER 'sycoder'@'%' IDENTIFIED BY '123456';
#以上语句的作用是什么?
创建用户sycoder, 可以在任意主机访问该数据库, 密码123456。
ALTER USER 'sycoder'@'%' IDENTIFIED WITH mysql_native_password BY '111111' ;
#以上语句的作用是什么?
修改用户sycoder的访问密码为111111。
DROP USER 'itsy'@'localhost';
#以上语句的作用是什么?
删除 itsy@localhost 用户。
DDL
什么是DDL?DDL的作用是什么?主要关键字包括哪些?
DDL全拼为Data Definition Language,也就是数据定义语言。
用于定义数据库对象,包括数据库、数据表和列。
主要关键字包括:CREATE、DROP、USE、SHOW、ALTER、TRUNCATE等。
如何查看当前有哪些数据库?
SHOW databases;#查看哪些数据库
如何查询当前数据库?
SELECT database();
如何创建数据库?
create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序 规则 ] ;
如果创建的数据库已经存在,如何避免出现报错ERROR 1007
?
加上可选参数
if not exists
,可以解决这个问题
如何删除数据库?
drop database [ if exists ] 数据库名;
如果删除的数据库本身就不存在,如何避免报错?
加上参数
IF EXISTS
。
DROP DATABASE IF EXISTS itsy;
如何切换数据库?
use 数据库名;
如何查看当前数据库中的所有表?
show tables;
如何查看指定表的结构?
desc 表名;
如何查询指定表的建表语句?
show create table 表名;
如何创建表?
CREATE TABLE 表名( 字段1 字段1类型 [COMMENT 字段1注释 ],字段2 字段2类型 [COMMENT 字段2注释 ], 字段3 字段3类型 [COMMENT 字段3注释 ], ...... 字段n 字段n类型 [COMMENT 字段n注释 ] )
[ COMMENT 表注释 ];
如何向表中添加字段?
ALTER TABLE 表名 ADD 字段名 类型 (长度)[ COMMENT 注释 ] [ 约束 ];
如何修改字段的数据类型?
ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);
如何修改字段名和字段类型?
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
如何删除字段?
ALTER TABLE 表名 DROP 字段名;
如何修改表名?
ALTER TABLE 表名 RENAME TO 新表名;
如何删除表?
DROP TABLE [ IF EXISTS ] 表名;
如何删除指定表,并创建新表?
TRUNCATE TABLE 表名;
DML
什么是DML?DML的作用是什么?主要关键字是哪些?
DML是Data Manipulatioin Language,也叫数据操作语言。
主要用于对数据的增加、删除和修改。
主要关键字包括:INSERT、UPDATE、DELETE。
如何向指定的表中添加数据?
向指定的表中添加数据时,分为两种情况:
第一种:只给指定的字段添加数据(其它字段采用默认值)。
第二种:给全部字段添加数据。
当我们为全部字段赋值时,可以省去字段名的内容。
#给指定的字段添加数据:
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
#给全部字段添加数据:
INSERT INTO 表名 VALUES (值1, 值2, ...);
如何修改指定数据的字段内容?
UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;
如何删除指定表中的指定数据?如果删除表中的数据时,没有添加WHERE关键字,会有什么后果?
如果米有WHERE关键字,会将表中的数据全部删除。
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开始的。
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
LIMIT的起始索引什么情况下可以省略?
如果只查询第一页的数据,可以省略LIMIT的起始索引。
SELECT查询
在SELECT查询中,关键字的顺序是什么?
关键字的顺序是绝对不能颠倒的:
SELECT...FROM...WHERE...GROUP BY...HAVING...ORDER BY...
查询常数
为什么要对常数进行查询呢?
常数查询用于整合不同的数据源时,作为标记数据源来源的标记。如:
SELECT '王者荣耀' as platform,name FROM heros;
在这段SQL语句中,我们虚构了一个
platform
字段,并将其设置为固定值“王者荣耀”。所以查询结果中,将会增加一个字段
platform
,其内容均为“王者荣耀”。
使用常数查询时,有哪些需要注意的地方?
需要注意,如果常数是一个字符串,则必须使用单引号
‘’
,没有单引号的常数,会被SQL当作列名进行检查,从而造成“找不到列”的错误。但如果常数是一个数字,则可以直接写数字,不会造成报错。
去除重复行
去除重复行使用的关键字是什么?
去除重复行需要使用
DISTINCT
关键字。
DISTINCT
关键字的作用是什么?如何使用?
DISTINCT
用于去除查询结果中的重复数据,其去重的对象是所有的列。在SELECT关键字后,所有列名前使用。如:
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: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的执行顺序基本相同。
FROM → WHERE → GROUP BY → HAVING → SELECT的字段 → DISTINCT → ORDER BY → LIMIT
具体如下:
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: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),普通索引只是提升数据的检索速度,不是对字段的唯一性约束。
多表查询
多表查询
多表查询分为哪几类?
多表查询分为四类:内连接查询、外连接查询、自连接查询、联合查询。
内连接查询
内连接查询分为哪几类?
内连接查询分为两类:隐式内连接查询和显式内连接查询。
什么是隐式内连接查询?
SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;
什么是显式内连接查询?
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;
#INNER可以省略
外连接查询
外连接查询分为哪几类?
外连接查询分为两类:左外连接和右外连接。
什么是左外连接?
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;
什么是右外连接?
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。
自连接查询
什么是自连接?
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;
联合查询
什么是联合查询?
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> 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;
的作用是开启链式事务,即:提交了事务之后,自动开启一个隔离级别相同的新事务。
事务隔离级别
如何查看隔离级别?
SELECT @@TRANSACTION_ISOLATION;
如何设置事务的隔离级别?
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)
持久性是通过事务日志来保证的。当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。
索引
索引分为哪几类?
- 主键索引:PRIMARY
- 唯一索引:UNIQUE
- 常规索引
- 全文索引:FULLTEXT
可以创建多个主键索引么?可以创建多个唯一索引吗?
主键索引只能有一个,但是唯一索引、常规索引、全文索引都可以有多个。
索引的优点是什么?缺点是什么?
优点:
- 降低系统I/O,提高查询速度
- 可以根据索引列进行排序,降低了排序的成本
缺点:
- 降低了UPDATE、INSERT和DELETE的消耗。
- 维护索引需要一定的内存空间。
常见的索引类型?????
常见的索引类型有哪些?
- Hash索引:底层使用Hash表实现。Hash索引不支持排序,且必须精确匹配,范围查询时无效。
- B+ Tree索引:最常见的索引类型,大部分引擎都支持B+Tree索引。
- 全文索引(Full-text)
- 空间索引(R-Tree)
Hash索引有什么缺点?
Hash索引无法匹配范围查询,只能匹配精确查询。
Memory存储引擎支持Hash索引。
InnoDB支持哪些索引?
InnoDB只支持B+Tree索引和Full-text索引,不支持Hash索引和R-Tree索引。
MyISAM支持哪些索引?
MyISAM支持B+Tree索引、R-Tree索引和Full-text索引,不支持Hash索引。
索引结构
常见的索引结构有哪些?
常见的索引结构有:
- Hash表
- 二叉树
- B- Tree树
- B+ Tree树
Hash表的索引结构有什么优点和缺点?
优点:
- 在不发生哈希冲突的前提下,只需要一次检索即可查询到数据,所以查询速度很快
缺点:
- 不支持排序
- 不支持范围查询
二叉树的索引结构有什么缺点和优点?
优点:
- 不知道
缺点:
- 按顺序插入时,二叉树会变成链表,降低查询性能
- 当数据量过大时,查询深度会增加,降低查询性能
什么是B树的度?
B-Tree(B树)和二叉树有什么不同?
- 二叉树中,每个节点最多有两个子节点;B-Tree中,每个节点可以有多个子节点。
B树的叶子节点可以存放数据吗?
B树的叶子节点和非叶子节点都可以存放数据。
B树和B+树的区别是什么?
- B树的叶子节点和非叶子节点都可以存放数据
- B+树的叶子节点存放数据,非叶子节点存放索引
MySQL中的B+树与普通的B+树有什么区别?
MySQL中对B+树进行了优化,在B+树的叶子节点中,增加了指向相邻叶子节点的指针,提高了访问的性能。
InnoDB为什么选择B+树作为索引结构?
应该从为什么不选择Hash表、B-树、二叉树的角度来回答这个问题:
相比于B+树,
- Hash表不支持范围查询,不支持排序,
- B-树中的数据和索引储存在一起,会造成更多的内存消耗
- 二叉树则在数据量较大时,层级过多,造成读取效率的降低,以及存在变成链表的可能。
聚集索引与非聚集索引
什么是聚集索引?什么是非聚集索引?聚集索引和非聚集索引有什么区别?
聚集索引的数据和索引保存在一起,非聚集索引的数据和索引是分离的。
在SQL中,一个表只能有一个聚集索引,但是可以有多个非聚集索引。
非聚集索引是如何查询数据的?
非聚集索引的数据查询需要回表。
如何选择聚集索引?
- 当存在主键时,选择主键作为聚集索引
- 当没有主键,但是有唯一索引时,选择第一个唯一索引作为聚集索引
- 当既没有主键,也没有唯一索引时,InnoDB会自动创建一个rowid列作为隐藏的聚集索引
SQL中的索引语法
如何查询索引?
SHOW INDEX FROM table_name;
如何创建索引?
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name(index_col_name,...)
如何删除索引?
DROP INDEX index_name ON table_name;
最左前缀法则
什么是最左前缀法则?
最左前缀法则指联合索引中,查询从最左边的列开始,如果跳过其中某些列,将会导致索引失效。
注意:只会导致后面的索引失效,之前的索引不受影响。
索引失效
索引在什么情况下会失效?
索引在这些情况下会失效:
- 字段类型为字符串,但内容为数字,如:电话号码、身份证等情况。如果WHERE子句中,没有为这些字段加上引号
''
,将会导致索引失效。- OR
- 模糊查询
- 对索引使用函数
索引的使用和设计原则
索引的设计原则有哪些?
- 数据量过大时,一定要建立索引
- 查询频率较高的多列,应该建立联合索引
- 当字段类型为字符串时,尽量使用前缀索引,而不是全索引
- 列中尽量不要有空数据
- 尽量选择区分度高的列作为索引
SQL优化
对数据库进行调优时,都有哪些维度可以选择?
对数据库调优时,可以从以下几个角度入手:
- 选择合适的DBMS
- 优化表设计
- 优化逻辑查询
- 优化物理查询
- 使用Redis或Memcached作为缓存
- 库级优化
SQL性能分析
如何查看各种SQL语句的执行频次?
SHOW GLOBAL STATUS LINKE 'COM_类型';
运行结果如下:

通过
SHOW GLOBAL STATUS LIKE 'COM______';
,我们可以了解到数据库是以增删改为主,还是以查询为主,从而思考如何优化数据库。
慢查询日志
慢查询日志的作用是什么?
慢查询日志用于记录执行时间超过指定限时(默认限时是10秒)的查询语句。
如何设置限时的时长?
通过参数
long_query_time
设置,它的单位是秒
,默认值是10秒。
如何查看慢查询日志功能是否打开?
利用SQL语句:
SELECT variables LIKE ‘slow_query_log’;
来查看是否打开了慢查询日志功能,参数值为ON或1时,即为打开的状态。
SHOW profiles
Profile的作用是什么?
Profiles用于了解每条SQL语句的时间消耗。
如何设置Profile开启?
SET [SESSION|GLOBAL] profiling=1;
如何查看Profile是否开启?
SELECT @@profiling;
如何使用profiles文件查看每条SQL语句的时间消耗?
SHOW profiles;
注意:每次执行这个SQL语句时,结果表中的query_id都会变化。
如何查看某条SQL语句更具体的时间消耗?
SHOW profile for query n;
查看query_id为n的SQL语句的具体执行时间消耗。
explain
explain的作用是什么?如何使用?
用于查看表的索引、连接表等的信息。
使用方式如下:
EXPLAINS 查询语句;
拓展
视图
存储过程
游标
SQL语句练习
查询比平均薪资高的员工信息
select * from emp where salary > (select avg(salary) from emp)
查询低于本部门平均工资的员工信息
SELECT * FROM emp e1 where e1.salary < (select avg(e2.salary) from emp e2 where e1.dept_id = e2.dept_id )
查询 “研发部” 员工的平均工资
SELECT avg(salary)
FROM emp
where dept_id = (SELECT id from dept where name = '研发部')
查询拥有员工的部门ID、部门名称
SELECT distinct d.id ,d.name
FROM emp e join dept d on e.dept_id = d.id
查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来
SELECT e.*,d.name '部门名称'
FROM emp e left join dept d on e.dept_id = d.id
where e.age > 40
查询所有员工的工资等级
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:
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:SELECT MAX(hp_max) FROM heros;
查询英雄的名字,以及他们的名字字数:
SQL:SELECT CHAR_LENGTH(name), name FROM heros
查询英雄上线日期(对应字段 birthdate)的年份,只显示有上线日期的英雄即可(有些英雄没有上线日期的数据,不需要显示):
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: SELECT * FROM heros WHERE DATE(birthdate)>'2016-10-01'
查询不同的生命最大值的英雄数量是多少:
SQL: SELECT COUNT(DISTINCT hp_max) FROM heros
统计不同生命最大值英雄的平均生命最大值,保留小数点后两位:
SQL: SELECT ROUND(AVG(DISTINCT hp_max), 2) FROM heros
查找薪水最高的前 3 名员工。
SELECT *
FROM employees
ORDER BY salary DESC
LIMIT 3;
统计每个部门(dept_id)的平均薪资,并仅显示平均薪资高于 15000 的部门。
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)。
SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;
查询没有订单的客户(customers 表的 id 不在 orders 表的 customer_id 中)。
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id
);
相关文章:
SQL知识体系
SQL复习 MySQL SQL介绍 SQL SQL的全拼是什么? SQL全拼:Structured Query Language,也叫结构化查询语言。 SQL92和SQL99有什么区别呢? SQL92和SQL99分别代表了92年和99年颁布的SQL标准。 在 SQL92 中采用(ÿ…...
编译安装php
前置准备 这里的可能不全,每个人安装的模块不一致,依赖也不不相同,按实际情况调整 yum install libxml2 -y yum install libxml2-devel -y yum install openssl-devel -y yum install sqlite-devel -y yum install libcurl-devel -yyum ins…...
【分果果——DP(困难)】
题目 分析 分果果题解参考,下面是补充https://blog.csdn.net/AC__dream/article/details/129431299 关于状态 设f[i][j][k]表示第i个人取到的最后一个糖果编号是j,第i-1个人取到的最后一个糖果编号小于等于k时的最大重量的最小值 关于转移方程 关于 j …...
利用ffplay播放udp组播视频流
ffplay -fs -fflags nobuffer -flags low_delay -analyzeduration 0 -probesize 32 -framedrop -sync ext -strict experimental udp://224.1.1.1:5001 -fs : 全屏显示 -fflags nobuffer : 禁用输入缓冲(减少100-200ms缓冲延迟) -an…...
C++中变量与容器的默认初始化:0的奥秘
在C编程的世界里,初始化是一个至关重要的概念。它决定了变量或容器在程序开始执行时的初始状态。然而,对于不同的数据类型和容器,C标准对于默认初始化的行为有着不同的规定。本文将深入探讨C中变量与容器的默认初始化规则,特别是关…...
VScode内接入deepseek包过程(本地部署版包会)
目录 1. 首先得有vscode软件 2. 在我们的电脑本地已经部署了ollama,我将以qwen作为实验例子 3. 在vscode上的扩展商店下载continue 4. 下载完成后,依次点击添加模型 5. 在这里可以添加,各种各样的模型,选择我们的ollama 6. 选…...
spark
阶段性 阶段一: 单机时代 阶段二: 大数据时代-分布式处理 阶段三: 实时大数据时代 hadoop慢因为她的计算结果保存在磁盘 处理在spark中可解决属于内存 Hadoop特点: 高可靠性 高拓展性 高效性 高容错性...
蓝桥杯---排序数组(leetcode第912题)
文章目录 1.题目重述2.思路分析3.代码解释 1.题目重述 题目的要求是不使用库函数或者是其他的内置的函数(就是已经实现好的函数),也就是这个排序的逻辑需要我们自己进行实现; 2.思路分析 其实这个例子也是很容易理解的ÿ…...
【Javascript Day18】
目录 标签事件绑定的属性参数 阻止默认行为 dialog的实现及组织冒泡(捕获)传递 基于冒泡的事件委托 键盘事件的事件源对象信息 JS的自动触发操作 标签事件绑定的属性参数 <!-- 标签上的事件绑定,事件源对象通过 关键字event传递 --…...
轻量级C通用库Klib解读 —— kalloc
前言 Klib是一个独立的轻量级c通用库,里面大多数组件除了C标准库外不包含外部库,想用对应组件直接拷贝对应文件即可使用。 该库致力于高效和较小的内存占用,其中部分组件(如khash、kbtree、ksort、kvec),无…...
认识HTML的标签结构
一、HTML的基本概念 1.什么是HTML? ①HTML是描述网页的一种标记语言,也被称为超文本标记语言【并不是一种编程语言】 ②HTML包含了HTML标签和文本内容 ③HTML文档也称为web页面 2.HTML的标签 HTML的标签通常成对出现,HTML文档由标签和受…...
C语言 实现一个比较两个整型的函数 / qsort的使用 /qsort排序结构体
一、qsort的一般使用方法 int cmp_int(const void* e1, const void* e2) {return *(int*)e1 - *(int*)e2; } // //使用qsort对数组进行排序,升序 void test1() {int arr[] { 9,8,7,6,5,4,3,2,1,0 };int sz sizeof(arr) / sizeof(arr[0]);//bubble_sort(arr, sz);…...
Arcmap python环境安装sklearn
Arcmap自带的环境为Python2.7,默认安装目录为C:\Python27\ArcGIS10.7 直接安装sklearn会发生兼容性问题,且默认环境不包括pip,因此需要先安装pip 下载 get-pip.py 访问 https://bootstrap.pypa.io/pip/2.7/get-pip.py 并下载 get-pip.py。运…...
FastAdmin后端列表导入表格数据
后台添加数据的时候增加通过表格导入功能 如下图index.html页面增加导入和模板下载按钮代码如下 <div class"panel panel-default panel-intro">{:build_heading()}<div class"panel-body"><div id"myTabContent" class"ta…...
R语言用逻辑回归贝叶斯层次对本垒打数据与心脏移植数据后验预测检验模拟推断及先验影响分析|附数据代码...
全文链接:https://tecdat.cn/?p40152 在统计学领域中,层次建模是一种极为强大且实用的工具。它能够巧妙地处理复杂的数据结构,通过分层的方式对数据进行建模。在贝叶斯统计的框架内,层次建模优势尽显,其可以有效地融合…...
Python基于自然语言处理技术的新闻文本分类系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
mybatis存储过程返回list
在MyBatis中调用存储过程并返回列表(List)通常涉及以下几个步骤: 定义存储过程:首先,在数据库中定义存储过程,并确保它返回结果集。配置MyBatis映射文件:在MyBatis的映射文件中配置调用存储过程…...
Unity项目实战-订阅者发布者模式
实战订阅者发布者模式详解 下面实例是一个射击类游戏,玩家可以切换枪支,最初的设计如下 public class Player:MonoBehaviour {//......省略代码逻辑//我们以及配置好了Scroll的输入,并配置了Scroll的输入事件,当玩家滚动鼠标滚轮…...
长文档处理痛点:GPT-4 Turbo引文提取优化策略与替代方案讨论
引言 随着GPT-4 Turbo的发布,其支持的128K上下文窗口(约300页文本)被视为处理长文本的突破性升级。然而,实际应用中,用户发现模型在提取长文档中的引文时存在显著缺陷:文档前三分之一的引文数量远多于中间…...
Deepseek 万能提问公式:高效获取精准答案
### **Deepseek 万能提问公式:高效获取精准答案** 在使用 Deepseek 或其他 AI 工具时,提问的质量直接决定了答案的精准度和实用性。以下是一个万能的提问公式回答: --- ### **1. 明确背景(Context)** - **作用**…...
Ubuntu中离线安装Docker
Ubuntu中离线安装Docker 前言 本教程将详细介绍如何在 Ubuntu 22.04 系统上,通过 .deb 包离线安装 Docker CE、Docker CE CLI 和 Docker Compose。 适用于无法访问互联网的环境。 准备工作 下载 .deb 包 在可以访问互联网的机器上,下载 Docker CE、…...
Linux配置SSH公钥认证与Jenkins远程登录进行自动发布
问题描述:在使用jenkins进行自动化部署时,其中一步是使用jenkins向目标服务器推送文件时,需要先在jenkins的系统配置中进行配置(事先安装好对应插件),配置远程服务器时,报错: 检查以…...
【故障处理】- 11g数据泵到19c导致的job不自动执行
【故障处理】- 11g数据泵到19c导致的job不自动执行 一、概述二、报错原因三、解决方法 一、概述 业务正常上线以后,客户反馈大量的job到时间了也不正常运行。 二、报错原因 该报错匹配bug 32249704,导致了迁移之后job的log_user从业务用户变成了sys。JOB…...
WPF8-常用控件
目录 写在前面:1. 按钮控件1.1. Button 按钮1.2. RepeatButton:长按按钮1.3. RadioButton:单选按钮 2. 数据显示控件2.1. TextBlock:只读文本控件2.2. Lable:标签 显示文本控件2.3. ListBox:显示可选择项的列表2.4. DataGrid&…...
电商小程序(源码+文档+部署+讲解)
引言 随着移动互联网的快速发展,电商小程序成为连接消费者与商家的重要桥梁。电商小程序通过数字化手段,为消费者提供了一个便捷、高效的购物平台,从而提升购物体验和满意度。 系统概述 电商小程序采用前后端分离的架构设计,服…...
关于C#的一些基础知识点汇总
1.C#结构体可以继承接口吗?会不会产生GC? 在 C# 中,结构体不能继承类,但可以实现接口。 代码: interface IMyInterface {void MyMethod(); }struct MyStruct : IMyInterface {public void MyMethod(){Console.Write…...
七、敏捷开发工具:持续集成与部署工具
一、敏捷开发工具——持续集成与部署工具 持续集成(CI)与持续部署(CD)是现代敏捷开发中不可或缺的关键实践。通过自动化构建、测试和部署流程,团队可以快速反馈、提高代码质量,并加速产品交付。为此,持续集成与部署工具应运而生,它们能够帮助开发团队在整个开发周期内…...
【工具类】 Hutool 中用于生成随机数的工具类
博主介绍:✌全网粉丝22W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
vue3和vue2的组件开发有什么区别
Vue3和Vue2在组件开发上存在不少差异,下面从多个方面详细介绍: 响应式原理 Vue2:用Object.defineProperty()方法来实现响应式。打个比方,它就像给对象的每个属性都安排了一个“小管家”,属性被访问或修改时࿰…...
防御保护选路练习
拓扑 配置 IP的基本配置 r2 [R2]int g0/0/0 [R2-GigabitEthernet0/0/0]ip add 12.0.0.2 255.255.255.0 [R2]int g0/0/2 [R2-GigabitEthernet0/0/2]ip add 210.1.1.254 255.255.255.0 [R2-GigabitEthernet0/0/2]int g0/0/1 [R2-GigabitEthernet0/0/1]ip add 200.1.1.254 255.…...
SQL Server 运算符优先级
在 SQL Server 中,运算符的优先级决定了在没有使用括号明确指定计算顺序时,运算符的执行顺序。 运算符优先级列表 括号 () 一元运算符 (正号)-(负号)~(按位取反) 乘法、除法和取模…...
【RK3588嵌入式图形编程】-SDL2-构建模块化UI
构建模块化UI 文章目录 构建模块化UI1、概述2、创建UI管理器3、嵌套组件4、继承5、多态子组件6、总结在本文中,将介绍如何使用C++和SDL创建一个灵活且可扩展的UI系统,重点关注组件层次结构和多态性。 1、概述 在前面的文章中,我们介绍了应用程序循环和事件循环,这为我们的…...
用STC-ISP写延时函数
若想写出自己可以定义时长的延时函数,需要重新生成一个1ms的延时函数并稍加修改。 STC-ISP生成的1ms的延时函数代码如下: void Delay1ms(void) //12.000MHz {unsigned char data i, j;i 2;j 239;do{while (--j);} while (--i); }将上述代码改为可自定…...
DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
对于个人开发者或尝鲜者而言,本地想要部署 DeepSeek 有很多种方案,但是一旦涉及到企业级部署,则步骤将会繁琐很多。 比如我们的第一步就需要先根据实际业务场景评估出我们到底需要部署什么规格的模型,以及我们所要部署的模型&…...
使用 Docker 部署 Apache Spark 集群教程
简介 Apache Spark 是一个强大的统一分析引擎,用于大规模数据处理。本文将详细介绍如何使用 Docker 和 Docker Compose 快速部署一个包含一个 Master 节点和两个 Worker 节点的 Spark 集群。这种方法不仅简化了集群的搭建过程,还提供了资源隔离、易于扩…...
基于暗通道先验的图像去雾算法解析与实现
一、算法背景 何凯明团队于2009年提出的暗通道先验去雾算法《single image haze removal using dark channel prior》,通过统计发现:在无雾图像的局部区域中,至少存在一个颜色通道的像素值趋近于零。这一发现为图像去雾提供了重要的理论依据…...
深入内存调试:Valgrind工具的终极指南(转)
在软件开发的世界里,代码质量就是生命线,而内存管理又是这条生命线中最脆弱的一环。内存泄漏,哪怕只是微小的一处,日积月累,都可能对整个系统造成灾难性的打击,无论是大型企业级应用、实时性要求极高的嵌入…...
深入解析MediaPipe:强大的实时计算机视觉框架
深入解析MediaPipe:强大的实时计算机视觉框架 1. 引言 在计算机视觉应用的快速发展中,实时处理和低延迟成为了许多应用的关键需求。Google 开发的 MediaPipe 是一个强大的开源框架,它能够高效处理 手势识别、姿态估计、物体检测、语音处理 …...
DeepSeek 和 ChatGPT 在特定任务中的表现:逻辑推理与创意生成
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux网络编程笔记: https://blog.cs…...
大白话实战Sentinel
Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Se…...
【AI面板识别】
题目描述 AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。 由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1&#x…...
Docker安装Kafka(不依赖ZooKeeper)
创建docker-compose.yaml version: "3.9" #版本号 services:kafka:image: apache/kafka:3.9.0container_name: kafkahostname: kafkaports:- 9092:9092 # 容器内部之间使用的监听端口- 9094:9094 # 容器外部访问监听端口environment:KAFKA_NODE_ID: 1KAFKA_PROCES…...
大道至简 少字全意 易经的方式看 jvm基础 、 内存模型 、 gc、 内存异常、内存调优实战案例 、类加载机制、双亲委派模型 适用于 懂而久未用回忆 ,不懂而需明正理而用
目录 介绍 内存模型 一、线程私有区域 二、线程共享区域 1.堆Heap 2. 方法区Method Area 3.运行时常量池 Runtime constant Pool 三、直接内存(Direct Memory) 四、内存异常与调优 五、总结对比 类加载机制 一、类加载的三大阶段 二、双亲委派模型 三、类加载的特…...
【Java学习】继承
一、继承 子类继承父类,子类这个类变量的引用在原有的指向子类自己类变量空间的原有访问权限上,增加上了父类类变量空间的访问权限,此时子类类变量指向的空间变为了原来子类类变量空间加上父类类变量空间,此时子类类变量空间就变成…...
Ubuntu24安装MongoDB(解压版)
目录 0.需求说明1.环境检查2.下载软件2.1.下载MongoDB服务端2.2.下载MongoDB连接工具(可略过)2.3.检查上传或下载的安装包 3.安装MongoDB3.1.编辑系统服务3.2.启动服务3.3.客户端连接验证3.3.1.创建管理员用户 4.远程访问4.1.开启远程访问4.2.开放防火墙 0.需求说明 问&#x…...
计算机毕业设计Python考研院校推荐系统 考研分数线预测 考研推荐系统 考研可视化(代码+LW文档+PPT+讲解视频)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Python 爬虫框架对比与推荐
Python 爬虫框架对比与推荐 Python 爬虫框架对比与推荐1. Scrapy1.1 框架介绍1.2 优点1.3 缺点1.4 适用场景 2. PySpider2.1 框架介绍2.2 优点2.3 缺点2.4 适用场景 3. Selenium3.1 框架介绍3.2 优点3.3 缺点3.4 适用场景 4. BeautifulSoup Requests(自定义方案&am…...
本地DeepSeek模型GGUF文件转换为PyTorch格式
接前文,我们在本地Windows系统上,基于GGUF文件部署了DeepSeek模型(DeepSeek-R1-Distill-Qwen-1.5B.gguf版本),但是GGUF是已经量化的版本,我们除了对其进行微调之外,无法对其训练,那么还有没有其他办法对本地的GGUF部署的DeepSeek模型进行训练呢?今天我们就反其道而行之…...
自动化测试框架搭建-单次接口执行-三部曲
目的 判断接口返回值和提前设置的预期是否一致,从而判断本次测试是否通过 代码步骤设计 第一步:前端调用后端已经写好的POST接口,并传递参数 第二步:后端接收到参数,组装并请求指定接口,保存返回 第三…...
SAP F1搜索帮助 添加自定义功能按钮
最近deepseek 比较火,好多伙伴把deep seek 调用集成到SAP 系统,集成需要方便的去查询问题,方便一点就是添加在F1搜索帮助的地方,看到有朋友问看自定义按钮怎么添加在F1的工具栏,跟踪了下代码,尝试了下&…...