制作網(wǎng)站賺錢嗎足球比賽統(tǒng)計(jì)數(shù)據(jù)
SQL復(fù)習(xí)
MySQL
MySQL
MySQL有什么特點(diǎn)?
MySQL 不支持全外連接。
安裝
數(shù)據(jù)類型
MySQL中的數(shù)據(jù)類型分為哪些?
MySQL中的數(shù)據(jù)類型主要分為三大類:數(shù)值類型、字符串類型、日期時(shí)間類型。
其中,
數(shù)值類型又分為七種:TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL。
字符串類型分為五種:CHAR、VARCHAR、BLOB、TEXT、LONGTEXT。
日期時(shí)間類型分為五種:DATE、TIME、YEAR、DATETIME、TIMESTAMP。
數(shù)值類型中,TINYINT的大小是多少?SMALLINT的大小是多少?INT/INTEGER的大小是多少?BIGINT的大小是多少?
在MySQL的數(shù)值類型中,TINYINT、SMALLINT、INT、BIGINT四者之間的大小排序是:TINYINT<SMALLINT<INT<BIGINT。
且按照2的整數(shù)冪遞增,分別對(duì)應(yīng)1bytes、2bytes、4bytes、8bytes。
數(shù)值類型 | 大小 |
---|---|
TINYINT | 1bytes |
SMALLINT | 2bytes |
INT/INTEGER | 4bytes |
BIGINT/Long | 8bytes |
數(shù)值類型中,FLOAT、DOUBLE的大小分別是多少?
兩者都是浮點(diǎn)數(shù)值,前者是單精度浮點(diǎn)數(shù),后者是雙精度浮點(diǎn)數(shù)。
數(shù)值類型 | 大小 |
---|---|
FLOAT | 4bytes |
DOUBLE | 8bytes |
字符串類型都有哪些?
字符串類型包括:CHAR、VARCHAR、BLOB、TEXT、LONGTEXT。
CHAR和VARCHAR有什么區(qū)別?CHAR的大小是多少?VARCHAR的大小是多少?
CHAR是定長(zhǎng)字符串,VARCHAR是變長(zhǎng)字符串。
但兩者在使用時(shí)都需要指定長(zhǎng)度。
字符串類型 | 大小 |
---|---|
CHAR | 0-255bytes |
VARCHAR | 0-65535bytes |
BLOB常用于什么場(chǎng)景?什么情況下會(huì)使用BLOB?
BLOB是二進(jìn)制形式的長(zhǎng)文本數(shù)據(jù),所以經(jīng)常用于圖片數(shù)據(jù)等需要用二進(jìn)制保存的數(shù)據(jù)。
日期時(shí)間類型分為哪幾種?
日期時(shí)間類型分為:DATE、TIME、YEAR、DATETIME、TIMESTAMP。
DATE類型、TIME類型、DATETIME類型、TIMESTAMP類型的數(shù)據(jù)分別是什么格式?
日期時(shí)間類型 | 格式 |
---|---|
DATE | YYYY-MM-DD |
DATETIME | YYYY-MM-DD HH:MM:SS |
TIME | HH:MM:SS |
TIMESTAMP | YYYY-MM-DD |
SQL介紹
SQL
SQL的全拼是什么?
SQL全拼:Structured Query Language,也叫結(jié)構(gòu)化查詢語(yǔ)言。
SQL92和SQL99有什么區(qū)別呢?
SQL92和SQL99分別代表了92年和99年頒布的SQL標(biāo)準(zhǔn)。
在 SQL92 中采用(+)代表從表所在的位置,而且在SQL92 中,只有左外連接和右外連接,沒(méi)有全外連接。
LEFT JOIN 和 RIGHT JOIN 只存在于 SQL99 及以后的標(biāo)準(zhǔn)中,在 SQL92 中不存在,只能用(+)表示。
SQL99 的外連接有哪些形式?
SQL99 的外連接包括了三種形式:
- 左外連接:LEFT JOIN 或 LEFT OUTER JOIN
- 右外連接:RIGHT JOIN 或 RIGHT OUTER JOIN
- 全外連接:FULL JOIN 或 FULL OUTER JOIN
SQL語(yǔ)言按照功能劃分為哪四部分?它們分別是什么作用?
SQL語(yǔ)言按照功能劃分為DDL、DML、DCL、DQL四部分。
DDL:Data Definition Language,數(shù)據(jù)定義語(yǔ)言。用于定義數(shù)據(jù)庫(kù)對(duì)象,包括數(shù)據(jù)庫(kù)、數(shù)據(jù)表和列。
DML:Data Manipulation Language,數(shù)據(jù)操作語(yǔ)言。用于增加、刪除、修改數(shù)據(jù)表中的記錄。
DCL:Data Control Language,數(shù)據(jù)控制語(yǔ)言。用于定義訪問(wèn)權(quán)限和安全級(jí)別。
DQL:Data Query Language,數(shù)據(jù)查詢語(yǔ)言。用于查詢想要的記錄。
什么是ER圖?
ER圖即Entity Relationship Diagram,也叫實(shí)體-關(guān)系圖。是用于描述現(xiàn)實(shí)世界的概念模型,主要包含三個(gè)要素:實(shí)體、屬性、關(guān)系。
實(shí)體:我們要管理的對(duì)象;
屬性:每個(gè)實(shí)體的屬性;
關(guān)系:對(duì)象之間的關(guān)系。
SQL的單行注釋怎么寫?多行注釋怎么寫?
-- 單行注釋
#單行注釋
/*
多行注釋
*/
SELECT、FROM、WHERE、HAVING、ORDER BY、LIMIT、GROUP BY七個(gè)關(guān)鍵字之間的執(zhí)行順序是什么?
執(zhí)行順序是:FROM→ WHERE →GROUP BY → HAVING→SELECT→ORDER BY→LIMIT。
為表添加了別名之后,還能使用原來(lái)的表名嗎?
一旦設(shè)置別名,就不能再直接使用表名了。
int(11)
中的11
是什么意義?
int
代表整數(shù)類型,11
代表顯示長(zhǎng)度為11位,即最大有效顯示長(zhǎng)度,與類型包含的數(shù)值范圍大小無(wú)關(guān)。
varchar(255)
中的255
是什么含義?
255
表示可變字符串類型的最大長(zhǎng)度為255。
DCL
DCL是?作用是什么?主要關(guān)鍵字有哪些?
DCL(Data Control Language),是數(shù)據(jù)庫(kù)控制語(yǔ)言。
主要用于管理數(shù)據(jù)庫(kù)用戶、控制用戶數(shù)據(jù)庫(kù)訪問(wèn)權(quán)限。
主要關(guān)鍵字包括:GRANT、REVOKE等。
如何查詢MySQL中的所有用戶?重點(diǎn)
SELECT * FROM mysql.user;
如何創(chuàng)建用戶?重點(diǎn)
CREATE USER '用戶名'@'主機(jī)名' IDENTIFIED BY '密碼';
如何修改用戶密碼?重點(diǎn)
ALTER USER '用戶名'@'主機(jī)名' IDENTIFIED WITH mysql_native_password BY '新密碼' ;
如何刪除用戶?重點(diǎn)
DROP USER '用戶名'@'主機(jī)名' ;
如何查詢用戶的權(quán)限?重點(diǎn)
SHOW GRANTS FOR '用戶名'@'主機(jī)名' ;
如何授予用戶權(quán)限?重點(diǎn)
GRANT 權(quán)限列表 ON 數(shù)據(jù)庫(kù)名.表名 TO '用戶名'@'主機(jī)名';
如何撤銷用戶權(quán)限?重點(diǎn)
REVOKE 權(quán)限列表 ON 數(shù)據(jù)庫(kù)名.表名 FROM '用戶名'@'主機(jī)名';
CREATE USER 'itsy'@'localhost' IDENTIFIED BY '123456';
#以上語(yǔ)句的作用是什么?
創(chuàng)建用戶itsy, 只能夠在當(dāng)前主機(jī)localhost訪問(wèn), 密碼123456。
CREATE USER 'sycoder'@'%' IDENTIFIED BY '123456';
#以上語(yǔ)句的作用是什么?
創(chuàng)建用戶sycoder, 可以在任意主機(jī)訪問(wèn)該數(shù)據(jù)庫(kù), 密碼123456。
ALTER USER 'sycoder'@'%' IDENTIFIED WITH mysql_native_password BY '111111' ;
#以上語(yǔ)句的作用是什么?
修改用戶sycoder的訪問(wèn)密碼為111111。
DROP USER 'itsy'@'localhost';
#以上語(yǔ)句的作用是什么?
刪除 itsy@localhost 用戶。
DDL
什么是DDL?DDL的作用是什么?主要關(guān)鍵字包括哪些?
DDL全拼為Data Definition Language,也就是數(shù)據(jù)定義語(yǔ)言。
用于定義數(shù)據(jù)庫(kù)對(duì)象,包括數(shù)據(jù)庫(kù)、數(shù)據(jù)表和列。
主要關(guān)鍵字包括:CREATE、DROP、USE、SHOW、ALTER、TRUNCATE等。
如何查看當(dāng)前有哪些數(shù)據(jù)庫(kù)?
SHOW databases;#查看哪些數(shù)據(jù)庫(kù)
如何查詢當(dāng)前數(shù)據(jù)庫(kù)?
SELECT database();
如何創(chuàng)建數(shù)據(jù)庫(kù)?
create database [ if not exists ] 數(shù)據(jù)庫(kù)名 [ default charset 字符集 ] [ collate 排序 規(guī)則 ] ;
如果創(chuàng)建的數(shù)據(jù)庫(kù)已經(jīng)存在,如何避免出現(xiàn)報(bào)錯(cuò)ERROR 1007
?
加上可選參數(shù)
if not exists
,可以解決這個(gè)問(wèn)題
如何刪除數(shù)據(jù)庫(kù)?
drop database [ if exists ] 數(shù)據(jù)庫(kù)名;
如果刪除的數(shù)據(jù)庫(kù)本身就不存在,如何避免報(bào)錯(cuò)?
加上參數(shù)
IF EXISTS
。
DROP DATABASE IF EXISTS itsy;
如何切換數(shù)據(jù)庫(kù)?
use 數(shù)據(jù)庫(kù)名;
如何查看當(dāng)前數(shù)據(jù)庫(kù)中的所有表?
show tables;
如何查看指定表的結(jié)構(gòu)?
desc 表名;
如何查詢指定表的建表語(yǔ)句?
show create table 表名;
如何創(chuàng)建表?
CREATE TABLE 表名( 字段1 字段1類型 [COMMENT 字段1注釋 ],字段2 字段2類型 [COMMENT 字段2注釋 ], 字段3 字段3類型 [COMMENT 字段3注釋 ], ...... 字段n 字段n類型 [COMMENT 字段n注釋 ] )
[ COMMENT 表注釋 ];
如何向表中添加字段?
ALTER TABLE 表名 ADD 字段名 類型 (長(zhǎng)度)[ COMMENT 注釋 ] [ 約束 ];
如何修改字段的數(shù)據(jù)類型?
ALTER TABLE 表名 MODIFY 字段名 新數(shù)據(jù)類型 (長(zhǎng)度);
如何修改字段名和字段類型?
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 類型 (長(zhǎng)度) [ COMMENT 注釋 ] [ 約束 ];
如何刪除字段?
ALTER TABLE 表名 DROP 字段名;
如何修改表名?
ALTER TABLE 表名 RENAME TO 新表名;
如何刪除表?
DROP TABLE [ IF EXISTS ] 表名;
如何刪除指定表,并創(chuàng)建新表?
TRUNCATE TABLE 表名;
DML
什么是DML?DML的作用是什么?主要關(guān)鍵字是哪些?
DML是Data Manipulatioin Language,也叫數(shù)據(jù)操作語(yǔ)言。
主要用于對(duì)數(shù)據(jù)的增加、刪除和修改。
主要關(guān)鍵字包括:INSERT、UPDATE、DELETE。
如何向指定的表中添加數(shù)據(jù)?
向指定的表中添加數(shù)據(jù)時(shí),分為兩種情況:
第一種:只給指定的字段添加數(shù)據(jù)(其它字段采用默認(rèn)值)。
第二種:給全部字段添加數(shù)據(jù)。
當(dāng)我們?yōu)槿孔侄钨x值時(shí),可以省去字段名的內(nèi)容。
#給指定的字段添加數(shù)據(jù):
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
#給全部字段添加數(shù)據(jù):
INSERT INTO 表名 VALUES (值1, 值2, ...);
如何修改指定數(shù)據(jù)的字段內(nèi)容?
UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 條件 ] ;
如何刪除指定表中的指定數(shù)據(jù)?如果刪除表中的數(shù)據(jù)時(shí),沒(méi)有添加WHERE關(guān)鍵字,會(huì)有什么后果?
如果米有WHERE關(guān)鍵字,會(huì)將表中的數(shù)據(jù)全部刪除。
DELETE FROM 表名 [ WHERE 條件 ]
DQL
什么是DQL?DQL有什么作用?DQL的關(guān)鍵字有哪些?
DQL(Data Query Language),即數(shù)據(jù)庫(kù)查詢語(yǔ)言。
DQL主要用于數(shù)據(jù)的查詢。
DQL的關(guān)鍵字包括:SELECT、WHERE、GROUP、ORDER BY、FROM、DISTINCT、HAVING、LIMIT。
為列添加別名使用什么關(guān)鍵字?
為列添加別名需要使用AS關(guān)鍵字,但其實(shí)AS關(guān)鍵字可以省略。
WHERE和HAVING的區(qū)別是什么?重點(diǎn)
兩者的區(qū)別主要體現(xiàn)在兩個(gè)方面:
- 兩者執(zhí)行時(shí)間不同:WHER在分組之前執(zhí)行,不參與分組;HAVING在分組之后執(zhí)行。
- 判斷條件不同:WHERE不能對(duì)聚合函數(shù)進(jìn)行判斷,但是HAVING可以。
使用ORDER BY
對(duì)查詢結(jié)果進(jìn)行排序時(shí),如果不指定排序方式,則默認(rèn)排序方式是什么?
ORDER BY的排序方式有兩種,DESC和ASC。
默認(rèn)的排序方式是ASC,也就是升序排序。
LIMIT
的作用是什么?起始索引是從幾開(kāi)始的?
LIMIT用于分頁(yè)查詢。起始索引是從0開(kāi)始的。
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查詢記錄數(shù) ;
LIMIT的起始索引什么情況下可以省略?
如果只查詢第一頁(yè)的數(shù)據(jù),可以省略LIMIT的起始索引。
SELECT查詢
在SELECT查詢中,關(guān)鍵字的順序是什么?
關(guān)鍵字的順序是絕對(duì)不能顛倒的:
SELECT...FROM...WHERE...GROUP BY...HAVING...ORDER BY...
查詢常數(shù)
為什么要對(duì)常數(shù)進(jìn)行查詢呢?
常數(shù)查詢用于整合不同的數(shù)據(jù)源時(shí),作為標(biāo)記數(shù)據(jù)源來(lái)源的標(biāo)記。如:
SELECT '王者榮耀' as platform,name FROM heros;
在這段SQL語(yǔ)句中,我們虛構(gòu)了一個(gè)
platform
字段,并將其設(shè)置為固定值“王者榮耀”。所以查詢結(jié)果中,將會(huì)增加一個(gè)字段
platform
,其內(nèi)容均為“王者榮耀”。
使用常數(shù)查詢時(shí),有哪些需要注意的地方?
需要注意,如果常數(shù)是一個(gè)字符串,則必須使用單引號(hào)
‘’
,沒(méi)有單引號(hào)的常數(shù),會(huì)被SQL當(dāng)作列名進(jìn)行檢查,從而造成“找不到列”的錯(cuò)誤。但如果常數(shù)是一個(gè)數(shù)字,則可以直接寫數(shù)字,不會(huì)造成報(bào)錯(cuò)。
去除重復(fù)行
去除重復(fù)行使用的關(guān)鍵字是什么?
去除重復(fù)行需要使用
DISTINCT
關(guān)鍵字。
DISTINCT
關(guān)鍵字的作用是什么?如何使用?
DISTINCT
用于去除查詢結(jié)果中的重復(fù)數(shù)據(jù),其去重的對(duì)象是所有的列。在SELECT關(guān)鍵字后,所有列名前使用。如:
SQL:SELECT DISTINCT attack_range FROM heros
如果DISTINCT的位置錯(cuò)誤,則會(huì)造成報(bào)錯(cuò)。
排序
對(duì)查詢結(jié)果進(jìn)行排序時(shí)需要使用的關(guān)鍵字是什么?
使用ORDER BY對(duì)查詢的結(jié)果進(jìn)行排序。
ORDER BY語(yǔ)句有什么地方需要掌握?
ORDER BY有以下幾處需要掌握:
- ORDER BY后可以有一個(gè)或多個(gè)列名。對(duì)多個(gè)列的排序會(huì)按照先后順序進(jìn)行。
- OREDR BY可以設(shè)置排序規(guī)則,ASC表示遞增,DESC表示遞減。默認(rèn)按照ASC進(jìn)行排序。
- ORDER BY可以對(duì)非選擇列進(jìn)行排序,即:即使SELECT后沒(méi)有此列,也可以放在ORDER BY后參與排序。
- ORDER BY語(yǔ)句通常位于SELECT語(yǔ)句的最后一條子句,否則會(huì)報(bào)錯(cuò)。
如果我們需要對(duì)不同的列采用不同的排序規(guī)則(A列升序,B列降序),應(yīng)該怎么寫?
對(duì)不同的列進(jìn)行排序時(shí),可以直接在ORDER BY語(yǔ)句后的列名后增加排序規(guī)則。
如:
SQL:SELECT name, hp_max FROM heros ORDER BY mp_max, hp_max DESC
此時(shí),查詢結(jié)果將會(huì)按照mp_max升序,hp_max降序的方式排序。
約束返回結(jié)果數(shù)
如何約束返回結(jié)果的數(shù)量?
在MySQL中,使用LIMIT關(guān)鍵字來(lái)約束返回結(jié)果的數(shù)量。
注意,在不同的DBMS中,使用的關(guān)鍵字是不同的。
約束返回結(jié)果有什么好處?
約束返回結(jié)果可以減少數(shù)據(jù)表的網(wǎng)絡(luò)傳輸量,提升查詢效率。避免全表掃描。
執(zhí)行順序
SQL中,SELECT語(yǔ)句的執(zhí)行順序是什么樣的?重點(diǎn)
注意,在MySQL和Oracle中,SELECT的執(zhí)行順序基本相同。
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 語(yǔ)句內(nèi)部的執(zhí)行順序是什么樣的?重點(diǎn)
一條完整的 SELECT 語(yǔ)句內(nèi)部的執(zhí)行順序是這樣的:
- FROM 子句組裝數(shù)據(jù)(包括通過(guò) ON 進(jìn)行連接);
- WHERE 子句進(jìn)行條件篩選;
- GROUP BY 分組 ;
- 使用聚集函數(shù)進(jìn)行計(jì)算;
- HAVING 篩選分組;
- 計(jì)算所有的表達(dá)式;
- SELECT 的字段;
- ORDER BY 排序;
- LIMIT 篩選。
SELECT *
SELECT *
有什么缺點(diǎn)?
使用
SELECT *
會(huì)增加數(shù)據(jù)庫(kù)負(fù)擔(dān)。在實(shí)際工作中,應(yīng)盡量寫出所需要的列名,生產(chǎn)環(huán)境下,盡量不要使用SELECT *
進(jìn)行查詢。
通配符
如何查詢英雄中,包含“太”字的英雄都有哪些?
使用通配符查詢。
SQL:SELECT name FROM heros WHERE name LIKE '%太%'
為什么要盡量少的使用通配符進(jìn)行查詢?
- 通配符需要消耗較長(zhǎng)的時(shí)間來(lái)進(jìn)行匹配。
- 如果LIKE檢索的字段有索引,那么模糊查詢時(shí),索引可能失效。
太%
和%太
有什么區(qū)別?
- 首先兩者最大的區(qū)別在于查詢的對(duì)象不同,前者指以“太”開(kāi)頭的元素,后者指以“太”結(jié)尾的元素。
- 其次,當(dāng)對(duì)應(yīng)字段存在索引時(shí),前者不會(huì)進(jìn)行全表掃描,后者會(huì)進(jìn)行全表掃描。
比較運(yùn)算符
SQL中的比較運(yùn)算符有哪些?
SQL中的運(yùn)算符有10種:
>
、>=
、<
、<=
、=
、<>或!=
、BETWEEN AND
、IN()
、LIKE 占位符
、IS NULL
和IS NOT NULL
。
BETWEEN AND
包含最大值和最小值嗎?
BETWEEN AND
包含最大值和最小值。
邏輯運(yùn)算符
SQL中的邏輯運(yùn)算符有哪些?
SQL中的邏輯運(yùn)算符有四種:IN、AND或
&&
、OR或||
、NOT或!
。
當(dāng) WHERE 子句中同時(shí)存在 OR 和 AND 的時(shí)候,哪個(gè)優(yōu)先級(jí)會(huì)更高?
當(dāng) WHERE 子句中同時(shí)存在 OR 和 AND 的時(shí)候,AND 執(zhí)行的優(yōu)先級(jí)會(huì)更高,即: SQL 會(huì)優(yōu)先處理 AND 操作符,然后再處理 OR 操作符。
所以當(dāng)WHERE子句中同時(shí)出現(xiàn)AND和OR的時(shí)候,一定要注意執(zhí)行的先后順序。
分組
GROUP BY是什么?有什么地方需要注意?
GROUP BY用于對(duì)查詢到的數(shù)據(jù)進(jìn)行分組。使用GROUP BY進(jìn)行分組時(shí),字段的值為NULL的數(shù)據(jù)也會(huì)被分為一組。
WHERE和HAVING的區(qū)別是什么?
- WHERE 是用于過(guò)濾數(shù)據(jù)行,而 HAVING 則用于分組。
- HAVING一般和GROUP BY組合使用。
DBMS
DBMS
常見(jiàn)的DBMS有哪些?哪些是關(guān)系型數(shù)據(jù)庫(kù)?哪些是非關(guān)系型數(shù)據(jù)庫(kù)?重點(diǎn)
常見(jiàn)的DBMS有MySQL、SQL Server、Redis、Elasticsearch、DB2和MongoDB。
關(guān)系型數(shù)據(jù)庫(kù):Oracle、MySQL、SQL Server、DB2。
非關(guān)系型數(shù)據(jù)庫(kù):MongoDB、Redis、Elasticsearch。
其中,MongoDB是文檔型數(shù)據(jù)庫(kù),Redis是鍵值型數(shù)據(jù)庫(kù),Elasticsearch是搜索引擎。
DBMS是什么?
DBMS即DataBase Management System,也叫數(shù)據(jù)庫(kù)管理系統(tǒng)。
DBS和DBMS哪一個(gè)概念更大?重點(diǎn)
DBS即DataBase System,也叫數(shù)據(jù)庫(kù)系統(tǒng),包括了數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理系統(tǒng)以及數(shù)據(jù)庫(kù)管理人員DBA。
所以DBS是比DBMS更大的概念。
NoSQL數(shù)據(jù)庫(kù)有哪些類型?重點(diǎn)
NoSQL類型眾多,包括:鍵值型數(shù)據(jù)庫(kù)、搜索引擎、文檔型數(shù)據(jù)庫(kù)、列存儲(chǔ)和圖型數(shù)據(jù)庫(kù)等。
鍵值型數(shù)據(jù)庫(kù)的優(yōu)缺點(diǎn)是什么?重點(diǎn)
鍵值型數(shù)據(jù)庫(kù)常用于內(nèi)容緩存。
優(yōu)點(diǎn):查詢速度快。
缺點(diǎn):無(wú)法自由使用條件過(guò)濾。
如果不知道數(shù)據(jù)的鍵,就需要遍歷所有的鍵來(lái)查詢。
Redis是最流行的鍵值型數(shù)據(jù)庫(kù)。
什么是文檔型數(shù)據(jù)庫(kù)?
文檔型數(shù)據(jù)庫(kù)將文檔作為處理信息的基本單位,一個(gè)文檔就相當(dāng)于一條記錄。MongoDB是最流行的文檔型數(shù)據(jù)庫(kù)。
什么是搜索引擎?
搜索引擎的優(yōu)勢(shì)在于采用了全文搜索的技術(shù),相對(duì)關(guān)系型數(shù)據(jù)庫(kù),有更高的全文檢索效率。
什么是列存儲(chǔ)?
“列式存儲(chǔ)”式相對(duì)于“行式存儲(chǔ)”而言的,常見(jiàn)的Oracle、MySQL、SQL Server等都是“行式存儲(chǔ)數(shù)據(jù)庫(kù)”,而列式存儲(chǔ)強(qiáng)調(diào)“將數(shù)據(jù)按照列存儲(chǔ)到數(shù)據(jù)庫(kù)中”。
列存儲(chǔ)的優(yōu)勢(shì)在于大大降低系統(tǒng)的I/O,適用于分布式文件系統(tǒng)。
為什么列存儲(chǔ)能降低系統(tǒng)的I/O?
因?yàn)椴捎昧写鎯?chǔ)時(shí),相鄰數(shù)據(jù)的數(shù)據(jù)類型是相同的,這就為壓縮提供了方便。壓縮之后,自然也就可以降低系統(tǒng)的I/O。
什么是圖型數(shù)據(jù)庫(kù)?
利用圖的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)了實(shí)體之間的關(guān)系,數(shù)據(jù)模型主要以節(jié)點(diǎn)和邊(也叫關(guān)系)來(lái)實(shí)現(xiàn),優(yōu)勢(shì)在于能高效地解決復(fù)雜的關(guān)系問(wèn)題。
Oracle
Oracle
Oracle通過(guò)什么來(lái)判斷是否存在緩存和執(zhí)行計(jì)劃,從而決定使用硬解析還是軟解析的?
Oracle通過(guò)共享池來(lái)判斷。
Oracle中的SQL是如何執(zhí)行的?
Oracle中的SQL的執(zhí)行分為六個(gè)步驟:
語(yǔ)法檢查→語(yǔ)義檢查→權(quán)限檢查→共享池檢查→優(yōu)化器→執(zhí)行器
什么是語(yǔ)法檢查?什么是語(yǔ)義檢查?
語(yǔ)法檢查指:檢查SQL的拼寫是否正確,當(dāng)SQL的拼寫有問(wèn)題時(shí),Oracle會(huì)報(bào)語(yǔ)法錯(cuò)誤。
語(yǔ)義檢查指:檢查SQL中的訪問(wèn)對(duì)象是否存在。
語(yǔ)法檢查和語(yǔ)義檢查共同保證SQL語(yǔ)句沒(méi)有錯(cuò)誤。
什么是權(quán)限檢查?
權(quán)限檢查指:檢查用戶是否具備訪問(wèn)該數(shù)據(jù)的權(quán)限。
什么是共享池檢查?
共享池(Shared Pool)是一塊內(nèi)存池,主要用于緩存SQL語(yǔ)句和該SQL語(yǔ)句的執(zhí)行計(jì)劃。
Oracle通過(guò)檢查共享池中是否存在SQL語(yǔ)句的執(zhí)行計(jì)劃,來(lái)判斷進(jìn)行軟解析還是硬解析。
具體的流程是:Oracle首先對(duì)SQL語(yǔ)句進(jìn)行Hash運(yùn)算,根據(jù)得出的Hash值在庫(kù)緩存(Library Cache)中查找,如果存在該SQL語(yǔ)句的執(zhí)行計(jì)劃,就按既有的執(zhí)行計(jì)劃執(zhí)行,跳過(guò)優(yōu)化器環(huán)節(jié),直接進(jìn)入執(zhí)行器環(huán)節(jié),這就是軟解析;如果不存在該SQL語(yǔ)句的執(zhí)行計(jì)劃,就進(jìn)入優(yōu)化器環(huán)節(jié),創(chuàng)建該SQL語(yǔ)句的解析樹(shù),生成執(zhí)行計(jì)劃。
什么是優(yōu)化器?什么是執(zhí)行器?
優(yōu)化器:會(huì)進(jìn)行硬解析,創(chuàng)建解析樹(shù),生成執(zhí)行計(jì)劃。
執(zhí)行器:SQL語(yǔ)句的具體執(zhí)行位置。
什么是硬解析?什么是軟解析?
硬解析和軟解析離不開(kāi)共享池。
對(duì)于一個(gè)SQL語(yǔ)句,Oracle會(huì)先計(jì)算該SQL語(yǔ)句的Hash值,根據(jù)此Hash值,判斷共享池中是否有對(duì)應(yīng)的執(zhí)行計(jì)劃。如果有,就會(huì)執(zhí)行軟解析;相反,如果沒(méi)有,就會(huì)進(jìn)行硬解析。
軟解析即利用共享池中的現(xiàn)有的執(zhí)行計(jì)劃執(zhí)行SQL語(yǔ)句;
硬解析指共享池的緩存中,沒(méi)有SQL語(yǔ)句的執(zhí)行計(jì)劃,需要利用優(yōu)化器創(chuàng)建解析樹(shù)對(duì)SQL語(yǔ)句進(jìn)行解析,然后生成執(zhí)行計(jì)劃。
庫(kù)緩存區(qū)的作用是什么?
庫(kù)緩存區(qū)主要用于緩存SQL語(yǔ)句和執(zhí)行計(jì)劃。
數(shù)據(jù)字典緩沖區(qū)的作用是什么?
數(shù)據(jù)字典緩沖區(qū)用于Oracle中的對(duì)象定義,如:表、視圖、索引等對(duì)象。
對(duì)SQL語(yǔ)句進(jìn)行解析時(shí),需要從數(shù)據(jù)字典緩沖區(qū)中獲取。
綁定變量
Oracle中的綁定變量有什么作用?有什么弊端?
綁定變量可以讓我們減少硬解析,減少優(yōu)化器的解析工作量。
但綁定變量本質(zhì)是動(dòng)態(tài)SQL的方式,參數(shù)的變化會(huì)對(duì)SQL執(zhí)行的效率造成影響,同時(shí),綁定變量也會(huì)對(duì)SQL優(yōu)化造成一定的影響。
MySQL
如何檢查你本機(jī)有沒(méi)有安裝MySQL?
待定
my.ini文件有什么作用?
my.ini文件用于對(duì)MySQL進(jìn)行配置,如:修改默認(rèn)存儲(chǔ)引擎、修改默認(rèn)事務(wù)隔離級(jí)別等。
MySQL中的SQL是如何執(zhí)行的?SQL語(yǔ)句在MySQL中的執(zhí)行流程是什么?
在MySQL中,SQL語(yǔ)句是在mysqld中的SQL層執(zhí)行的,具體流程為:
SQL語(yǔ)句→查詢緩存→解析器→優(yōu)化器→執(zhí)行器。
MySQl的架構(gòu)是什么?
MySQL采用的是C/S架構(gòu),即:Client/Server。
服務(wù)器端使用的是mysqld。
mysqld的結(jié)構(gòu)是什么樣的?
mysqld分為三層結(jié)構(gòu):連接層、SQL層、存儲(chǔ)引擎層。
MySQL和Oracle的區(qū)別是什么?
MySQL中的存儲(chǔ)引擎采用了插件的形式,每種存儲(chǔ)引擎都對(duì)應(yīng)一種數(shù)據(jù)庫(kù)應(yīng)用環(huán)境。且允許開(kāi)發(fā)人員設(shè)置自己的存儲(chǔ)引擎。
MySQL中,常用的存儲(chǔ)引擎有哪些?
MySQL中常用的存儲(chǔ)引擎有:InnoDB、MyISAM、Memory、NDB、Archive等。
mysqld
連接層的作用是什么?
連接層負(fù)責(zé)建立客戶端和服務(wù)器端的連接。
連接建立后,客戶端會(huì)發(fā)送SQL到服務(wù)器端。
SQL層的作用是什么?
SQL層負(fù)責(zé)對(duì)SQL語(yǔ)句進(jìn)行查詢處理。
存儲(chǔ)引擎層的作用是什么?
存儲(chǔ)引擎層負(fù)責(zé)與數(shù)據(jù)庫(kù)打交道,負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和讀取。
SQL層的結(jié)構(gòu)是什么樣的?
SQL層分為四部分:查詢緩存、解析器、優(yōu)化器、執(zhí)行器。
為什么MySQL8.0之后,拋棄了查詢緩存的功能?
拋棄的原因主要在于查詢緩存的效率不高。
查詢緩存的作用是什么?
查詢緩存會(huì)保存已經(jīng)之前查詢過(guò)的SQL語(yǔ)句,當(dāng)這條SQL語(yǔ)句再次出現(xiàn)時(shí),服務(wù)器端就會(huì)直接將結(jié)果返回給客戶端;如果查詢緩存中沒(méi)有這條SQL語(yǔ)句,就會(huì)進(jìn)入解析器階段。
Navicat
SQL函數(shù)
SQL函數(shù)
為什么不建議使用SQL函數(shù)?
因?yàn)椴煌腄BMS之間的差異很大,大部分DBMS都會(huì)有屬于自己的SQL函數(shù),這導(dǎo)致采用SQL函數(shù)的代碼的可移植性很差。
聚合函數(shù)
什么是聚合函數(shù)?常用的聚合函數(shù)有哪些?
聚合函數(shù)也叫聚集函數(shù),指用于對(duì)一組數(shù)據(jù)進(jìn)行匯總的函數(shù)。參數(shù)為一組數(shù)據(jù)的集合,返回值為單個(gè)值。
常用的聚合函數(shù)有五個(gè):COUNT、MAX、MIN、AVG、SUM。
WHERE、聚合函數(shù)、HAVING三者之間的執(zhí)行順序是什么?
WHERE→聚合函數(shù)→HAVING。
COUNT(*)和COUNT(字段)有什么區(qū)別?
- 前者只是統(tǒng)計(jì)數(shù)據(jù)行,不論該字段的值是否為NULL;
- 后者會(huì)忽略字段的值為NULL的數(shù)據(jù)。
當(dāng)MAX或MIN函數(shù)的參數(shù)為字符串時(shí),如何計(jì)算最大值或最小值?
MAX 和 MIN 函數(shù)用于字符串類型數(shù)據(jù)的統(tǒng)計(jì)時(shí),如果是英文字母,則按照 A—Z 的順序排列,越往后,數(shù)值越大。如果是漢字則按照全拼拼音進(jìn)行排列,越靠后,值越大。
需要說(shuō)明,我們需要先把 name 字段(漢字類型)統(tǒng)一轉(zhuǎn)化為 gbk 類型,使用CONVERT(name USING gbk),然后再使用 MIN 和 MAX 取最小值和最大值。
數(shù)值函數(shù)
常用的數(shù)值函數(shù)有哪些?
常用的數(shù)值函數(shù)有:ABS、SIGN、SQRT、LEAST、MOD、ROUND。
ROUND函數(shù)有什么作用?
ROUND函數(shù)可以對(duì)數(shù)據(jù)進(jìn)行四舍五入,它有兩個(gè)參數(shù),分別表示需要處理的數(shù)據(jù)和四舍五入的位數(shù)。
SELECT ABS(-2)
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 2。
SELECT MOD(101,3)
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果 2。
SELECT ROUND(37.25,1)
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果 37.3。
字符串函數(shù)
常用的字符串函數(shù)有哪些?
常用的字符串函數(shù)有:CONCAT、LENGTH、CHAR_LENGTH、LOWER、UPPER、SUBSTRING、REPLACE。
LEENGTH()
和CHAR_LENGTH()
的區(qū)別是什么?
- 兩個(gè)函數(shù)的共同點(diǎn)都是計(jì)算字段的長(zhǎng)度。
- 在
LENGTH()
中,一個(gè)漢字算作三個(gè)字符,數(shù)字和字母都算作一個(gè)字符。- 在
CHAR_LENGTH()
中,漢字、數(shù)字、字母,都算作一個(gè)字符。
SELECT CONCAT('abc', 123)
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 abc123。
SELECT LENGTH('你好')
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 6。
SELECT CHAR_LENGTH('你好')
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 2。
SELECT LOWER('ABC')
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 abc。
SELECT REPLACE('fabcd', 'abc', 123)
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 f123d。
SELECT SUBSTRING('fabcd', 1,3)
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 fab。
日期函數(shù)
常用的日期函數(shù)有哪些?
常用的日期函數(shù)有:YEAR、HOUR、QUARTER。
QUARTER函數(shù)的作用是什么?
QUARTER函數(shù)可以返回日期對(duì)應(yīng)的季度,范圍為1~4。
為什么對(duì)日期進(jìn)行比較時(shí),不能直接使用日期字符串?
我們一般使用DATE函數(shù)來(lái)對(duì)日期進(jìn)行比較。
一般情況下,我們無(wú)法確認(rèn)birthdate的數(shù)據(jù)類型是字符串,還是datetime類型,所以,使用DATE函數(shù)是比較安全的。
SELECT CURRENT_DATE()
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 2019-04-03。
SELECT CURRENT_TIME()
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 21:26:34。
SELECT CURRENT_TIMESTAMP()
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 2019-04-03 21:26:34。
SELECT EXTRACT(YEAR FROM '2019-04-03')
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 2019。
SELECT DATE('2019-04-01 12:00:05')
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 2019-04-01。
流程函數(shù)
常見(jiàn)的流程函數(shù)有哪些?
常見(jiàn)的流程函數(shù)有:IF、IFNULL。
加密解密函數(shù)
常見(jiàn)的加密解密函數(shù)有哪些?
常見(jiàn)的加密解密函數(shù)有:PASSWORD、MD5、SHA、ENCODE、DECODE。
轉(zhuǎn)換函數(shù)
什么是轉(zhuǎn)換函數(shù)?常見(jiàn)的轉(zhuǎn)換函數(shù)有哪些?
轉(zhuǎn)換函數(shù)用于轉(zhuǎn)換數(shù)據(jù)之間的類型。
常見(jiàn)的轉(zhuǎn)換函數(shù)有:CAST、COALESCE。
CAST函數(shù)的作用是什么?它的參數(shù)是什么?
CAST用于數(shù)據(jù)類型轉(zhuǎn)換,其參數(shù)是一個(gè)表達(dá)式。
這個(gè)表達(dá)式通過(guò)AS關(guān)鍵字分割了兩個(gè)參數(shù),分別表示原始數(shù)據(jù)類型和目標(biāo)數(shù)據(jù)類型。
COALESCE函數(shù)的作用是什么?
返回第一個(gè)非空數(shù)值。
SELECT CAST(123.123 AS INT)
的運(yùn)行結(jié)果是什么?為什么?
運(yùn)行結(jié)果會(huì)報(bào)錯(cuò)。
CAST 函數(shù)在轉(zhuǎn)換數(shù)據(jù)類型的時(shí)候,不會(huì)四舍五入,如果原數(shù)值有小數(shù),那么轉(zhuǎn)換為整數(shù)類型的時(shí)候就會(huì)報(bào)錯(cuò)。
SELECT CAST(123.123 AS DECIMAL(8,2))
的運(yùn)行結(jié)果是什么?DECIMAL(8,2)
是什么含義?
運(yùn)行結(jié)果為 123.12。
DECIMAL(8,2)
中,8代表整數(shù)部分和小數(shù)部分加起來(lái)最大的位數(shù),2代表小數(shù)的位數(shù)。即:精度為8位,小數(shù)位數(shù)為2位的數(shù)據(jù)類型。
SELECT COALESCE(null,1,2)
的運(yùn)行結(jié)果是什么?
運(yùn)行結(jié)果為 1。
約束
常見(jiàn)的約束有哪些?
常見(jiàn)的約束有六種:非空約束、唯一約束、主鍵約束、默認(rèn)約束、外鍵約束、檢查約束。
六種常見(jiàn)約束對(duì)應(yīng)的關(guān)鍵字分別是什么?
約束 | 關(guān)鍵字 |
---|---|
非空約束 | NOT NULL |
唯一約束 | UNIQUE |
主鍵約束 | PRIMARY KEY |
外鍵約束 | FOREIGN KEY |
默認(rèn)約束 | DEFAULT |
檢查約束 | CHECK |
主鍵約束的作用是什么?
主鍵約束的作用是唯一標(biāo)識(shí)一條記錄,不能重復(fù),不能為空。即:UNIQUE+NOT NULL。
一個(gè)數(shù)據(jù)表的主鍵只能有一個(gè),但是,主鍵可以是一個(gè)字段,也可以是多個(gè)字段組合。
外鍵約束的作用是什么?
外鍵約束確保了表與表之間引用的完整性。一個(gè)表中的外鍵,對(duì)應(yīng)另一張表中的主鍵。
普通索引和唯一性約束有什么區(qū)別?
唯一性約束相當(dāng)于創(chuàng)建了一個(gè)約束和普通索引(NORMAL INDEX),普通索引只是提升數(shù)據(jù)的檢索速度,不是對(duì)字段的唯一性約束。
多表查詢
多表查詢
多表查詢分為哪幾類?
多表查詢分為四類:內(nèi)連接查詢、外連接查詢、自連接查詢、聯(lián)合查詢。
內(nèi)連接查詢
內(nèi)連接查詢分為哪幾類?
內(nèi)連接查詢分為兩類:隱式內(nèi)連接查詢和顯式內(nèi)連接查詢。
什么是隱式內(nèi)連接查詢?
SELECT 字段列表 FROM 表1 , 表2 WHERE 條件 ... ;
什么是顯式內(nèi)連接查詢?
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 連接條件 ... ;
#INNER可以省略
外連接查詢
外連接查詢分為哪幾類?
外連接查詢分為兩類:左外連接和右外連接。
什么是左外連接?
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 條件 ... ;
什么是右外連接?
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 條件 ... ;
現(xiàn)有表1、表2,兩張表,C是它們的交集,A、B分別是兩表不相交的部分?jǐn)?shù)據(jù),則表1左外連接表2時(shí),查詢結(jié)果是什么?表1右外連接表2的結(jié)果是什么?
左外連接會(huì)將左表的全部數(shù)據(jù)以及兩表相交的部分?jǐn)?shù)據(jù)查詢出來(lái)作為結(jié)果。
所以表1左外連接表2的結(jié)果是A+C。
同理可知,表1右外連接表2的結(jié)果是C+B。
自連接查詢
什么是自連接?
SELECT 字段列表 FROM 表A 別名A JOIN 表A 別名B ON 條件 ... ;
聯(lián)合查詢
什么是聯(lián)合查詢?
SELECT 字段列表 FROM 表名 ...
UNION [ALL]
SELECT 字段列表 FROM 表名 ...
子查詢
標(biāo)量子查詢、列子查詢、行子查詢、表子查詢的區(qū)別是什么?
子查詢分為:標(biāo)量子查詢、列子查詢、行子查詢、表子查詢。
它們的分類依據(jù)是查詢結(jié)果的格式。
即:
標(biāo)量子查詢的結(jié)果是單個(gè)值;
列子查詢的結(jié)果是一列數(shù)據(jù);
列行子查詢的結(jié)果是一行數(shù)據(jù);
表子查詢的結(jié)果是多行多列的表。
子查詢相關(guān)的常用的關(guān)鍵字有哪些?
子查詢常用的關(guān)鍵字有:IN、NOT IN、ANY、SOME、ALL。
關(guān)聯(lián)子查詢和非關(guān)聯(lián)子查詢的區(qū)別是什么?
關(guān)聯(lián)子查詢和非關(guān)聯(lián)子查詢的區(qū)別在于是否執(zhí)行多次子查詢。
非關(guān)聯(lián)子查詢:子查詢從數(shù)據(jù)表中查詢了數(shù)據(jù)結(jié)果,這個(gè)數(shù)據(jù)結(jié)果只執(zhí)行一次,然后這個(gè)數(shù)據(jù)結(jié)果作為主查詢的條件進(jìn)行執(zhí)行。
關(guān)聯(lián)子查詢:子查詢需要執(zhí)行多次,即采用循環(huán)的方式,先從外部查詢開(kāi)始,每次都傳入子查詢進(jìn)行查詢,然后再將結(jié)果反饋給外部。
什么是存在性檢測(cè)子查詢?
使用EXISTS關(guān)鍵字的子查詢即為存在性檢測(cè)子查詢。
什么是集合比較子查詢?
存儲(chǔ)引擎
MySQL中,常用的存儲(chǔ)引擎有哪些?
MySQL中常用的存儲(chǔ)引擎有:InnoDB、MyISAM、Memory、NDB、Archive等。
InnoDB的特點(diǎn)是什么?
InnoDB是MySQL5.5版本之后的默認(rèn)引擎。
最大的特點(diǎn)有三個(gè):
- 支持事務(wù)、
- 支持行級(jí)鎖定(提高并發(fā)性能)、
- 支持外鍵約束。
MyISAM的特點(diǎn)是什么?
MyISAM是MySQL5.5之前的默認(rèn)存儲(chǔ)引擎,特點(diǎn)是:不支持事務(wù),不支持外鍵,但是速度快且占用的內(nèi)存少。
Memory的特點(diǎn)是什么?
Memory的特點(diǎn)是:使用系統(tǒng)內(nèi)存作為存儲(chǔ)介質(zhì),可以得到更快的響應(yīng)速度。但是,如果mysqld進(jìn)程崩潰,則會(huì)導(dǎo)致所有數(shù)據(jù)丟失,所以要慎重使用Memory作為存儲(chǔ)引擎。
NDB的特點(diǎn)是什么?
NDB主要用于MySQL Cluster分布式集群環(huán)境。
Archive的特點(diǎn)是什么?
Archive有很好的壓縮機(jī)制,用于文件歸檔,在請(qǐng)求寫入時(shí),會(huì)進(jìn)行壓縮,常用來(lái)作為倉(cāng)庫(kù)。
如何查看當(dāng)前 MySQL 支持的存儲(chǔ)引擎都有哪些?
通過(guò) SHOW ENGINES 命令來(lái)查看當(dāng)前 MySQL 支持的存儲(chǔ)引擎都有哪些,以及這些存儲(chǔ)引擎是否支持事務(wù)。
連接
內(nèi)連接:將多個(gè)表之間滿足連接條件的數(shù)據(jù)行查詢出來(lái)。它包括了等值連接、非等值連接和自連接。外連接:會(huì)返回一個(gè)表中的所有記錄,以及另一個(gè)表中匹配的行。它包括了左外連接、右外連接和全連接。交叉連接:也稱為笛卡爾積,返回左表中每一行與右表中每一行的組合。在 SQL99 中使用的 CROSS JOIN。
NATURAL JOIN
CROSS JOIN
ON 連接
USING 連接
SQL92和SQL99中的連接有什么區(qū)別?
在 SQL92 中采用(+)代表從表所在的位置,而且在SQL92 中,只有左外連接和右外連接,沒(méi)有全外連接。
LEFT JOIN 和 RIGHT JOIN 只存在于 SQL99 及以后的標(biāo)準(zhǔn)中,在 SQL92 中不存在,只能用(+)表示。
SQL99 的外連接有哪些形式?
SQL99 的外連接包括了三種形式:
- 左外連接:LEFT JOIN 或 LEFT OUTER JOIN
- 右外連接:RIGHT JOIN 或 RIGHT OUTER JOIN
- 全外連接:FULL JOIN 或 FULL OUTER JOIN
不同 DBMS 中使用連接需要注意的地方有哪些?
- 不是所有的 DBMS 都支持全外連接
- Oracle 沒(méi)有表別名 AS
- SQLite 的外連接只有左連接
關(guān)于連接的性能問(wèn)題有哪些需要注意?
- 控制連接表的數(shù)量
- 在連接時(shí)不要忘記 WHERE 語(yǔ)句
- 使用自連接而不是子查詢
為什么要使用自連接而不是子查詢?
因?yàn)樽硬樵兊呐袛鄬?duì)象是未知的數(shù)據(jù)表;自連接的判斷對(duì)象是已知的數(shù)據(jù)表,
所以大部分 DBMS 中都對(duì)自連接處理進(jìn)行了優(yōu)化,在許多 DBMS 的處理過(guò)程中,對(duì)于自連接的處理速度要比子查詢快得多。
事務(wù)
事務(wù)
MySQL 5.5 版本之前,默認(rèn)的存儲(chǔ)引擎是什么?為什么要改變默認(rèn)的存儲(chǔ)引擎?
MySQL 5.5 版本之前,默認(rèn)的存儲(chǔ)引擎是MyISAM。在 5.5 版本之后默認(rèn)存儲(chǔ)引擎是 InnoDB。
InnoDB 取代 MyISAM 的重要原因,是因?yàn)镮nnoDB 支持事務(wù),而MyISAM不支持事務(wù)。
事務(wù)的英文是什么?
事務(wù)的英文是transaction。
事務(wù)的特性是什么?
事務(wù)的特性:ACID
- A:原子性(Atomicity),事務(wù)是不可分割的,它是進(jìn)行數(shù)據(jù)處理操作的基本單位。
- C:一致性(Consistency),數(shù)據(jù)庫(kù)在進(jìn)行事務(wù)操作后,會(huì)由原來(lái)的一致?tīng)顟B(tài),變成另一種一致的狀態(tài)。當(dāng)事務(wù)提交后,或者當(dāng)事務(wù)發(fā)生回滾后,數(shù)據(jù)庫(kù)的完整性約束不能被破壞。
- I:隔離性(Isolation),每個(gè)事務(wù)都是彼此獨(dú)立的,不會(huì)受到其他事務(wù)的執(zhí)行影響。一個(gè)事務(wù)在提交之前,對(duì)其他事務(wù)都是不可見(jiàn)的。
- D:持久性(Durability),事務(wù)提交之后對(duì)數(shù)據(jù)的修改是持久性的,即使在系統(tǒng)出故障比如系統(tǒng)崩潰或者存儲(chǔ)介質(zhì)發(fā)生故障,數(shù)據(jù)的修改依然是有效的。
事務(wù)的常用控制語(yǔ)句都有哪些?
- START TRANSACTION 或者 BEGIN,作用是顯式開(kāi)啟一個(gè)事務(wù)。
- COMMIT:提交事務(wù)。當(dāng)提交事務(wù)后,對(duì)數(shù)據(jù)庫(kù)的修改是永久性的。
- ROLLBACK 或者 ROLLBACK TO [SAVEPOINT],意為回滾事務(wù)。意思是撤銷正在進(jìn)行的所有沒(méi)有提交的修改,或者將事務(wù)回滾到某個(gè)保存點(diǎn)。
- SAVEPOINT:在事務(wù)中創(chuàng)建保存點(diǎn),方便后續(xù)針對(duì)保存點(diǎn)進(jìn)行回滾。一個(gè)事務(wù)中可以存在多個(gè)保存點(diǎn)。
- RELEASE SAVEPOINT:刪除某個(gè)保存點(diǎn)。
- SET TRANSACTION,設(shè)置事務(wù)的隔離級(jí)別。
使用事務(wù)的方式有哪些?有什么區(qū)別?
使用事務(wù)有兩種方式:隱式事務(wù)和顯式事務(wù)。
- 隱式事務(wù):實(shí)際上就是自動(dòng)提交。
- 顯式事務(wù):需要手寫 COMMIT 命令提交事務(wù)。
Oracle默認(rèn)的事務(wù)使用方式是哪一種?MySQL默認(rèn)的事務(wù)使用方式是哪一種?如何設(shè)置MySQL的事務(wù)提交方式?
Oracle默認(rèn)的事務(wù)使用方式是顯式事務(wù),即不自動(dòng)提交,需要手動(dòng)寫COMMIT命令來(lái)提交事務(wù)
MySQL默認(rèn)的事務(wù)使用方式是隱式事務(wù),即:自動(dòng)提交。
如果要改變MySQL的事務(wù)提交方式,需要配置MySQL的參數(shù):
mysql> set autocommit =0; //關(guān)閉自動(dòng)提交
mysql> set autocommit =1; //開(kāi)啟自動(dòng)提交
事務(wù)相關(guān)參數(shù)
autocommit參數(shù)的作用有哪些?set autocommit =1;
有什么作用?
MySQL 中,autocommit的默認(rèn)值是0,。
autocommit參數(shù)有 2 種取值:
- autocommit=0 時(shí),不論是否采用 START TRANSACTION 或者 BEGIN 的方式來(lái)開(kāi)啟事務(wù),都需要用 COMMIT 進(jìn)行提交,使用 ROLLBACK 對(duì)事務(wù)進(jìn)行回滾。
- autocommit=1 時(shí),每條 SQL 語(yǔ)句都會(huì)自動(dòng)進(jìn)行提交。
所以,
set autocommit =1;
的作用是設(shè)置事務(wù)的默認(rèn)提交方式為自動(dòng)提交。
completion_type 參數(shù)的作用有哪些?SET @@completion_type = 1;
有什么作用?
MySQL 中,completion_type 的默認(rèn)值是0。
completion_type 參數(shù)有 3 種取值:
- completion=0:默認(rèn)情況。當(dāng)我們執(zhí)行 COMMIT 的時(shí)候會(huì)提交事務(wù),在執(zhí)行下一個(gè)事務(wù)時(shí),還需要我們使用 START TRANSACTION 或者 BEGIN 來(lái)開(kāi)啟。
- completion=1:當(dāng)我們提交事務(wù)后,相當(dāng)于執(zhí)行了 COMMIT AND CHAIN,開(kāi)啟一個(gè)鏈?zhǔn)绞聞?wù),即當(dāng)我們提交事務(wù)之后,會(huì)自動(dòng)開(kāi)啟一個(gè)相同隔離級(jí)別的事務(wù)。
- completion=2:也就是 COMMIT=COMMIT AND RELEASE,當(dāng)我們提交后,會(huì)自動(dòng)與服務(wù)器斷開(kāi)連接。
所以
SET @@completion_type = 1;
的作用是開(kāi)啟鏈?zhǔn)绞聞?wù),即:提交了事務(wù)之后,自動(dòng)開(kāi)啟一個(gè)隔離級(jí)別相同的新事務(wù)。
事務(wù)隔離
事務(wù)并發(fā)處理可能存在的三種異常是什么?
事務(wù)并發(fā)處理可能存在的三種異常:
- 臟讀(Dirty Read)
- 不可重復(fù)讀(Nonrepeatable Read)
- 幻讀(Phantom Read)
四種事務(wù)隔離的級(jí)別分別是什么?
四種事務(wù)隔離的級(jí)別分別是:
- 讀未提交(READ UNCOMMITTED)
- 讀已提交(READ COMMITTED)
- 可重復(fù)讀(REPEATABLE READ)
- 串行化(SERIALIZABLE)
臟讀(Dirty Read)是什么?
讀到了其他事務(wù)還沒(méi)有提交的數(shù)據(jù)。
不可重復(fù)讀(Nonrepeatable Read)是什么?
對(duì)某數(shù)據(jù)進(jìn)行讀取時(shí),由于有其他事務(wù)對(duì)這個(gè)數(shù)據(jù)同時(shí)進(jìn)行了修改或刪除,導(dǎo)致兩次讀取的結(jié)果不同。
幻讀(Phantom Read)是什么?
當(dāng)事務(wù)A根據(jù)指定查詢條件對(duì)某數(shù)據(jù)多次進(jìn)行讀取時(shí),由于有其他事務(wù)更改了符合查詢條件的數(shù)據(jù),導(dǎo)致事務(wù)A多次得到的數(shù)據(jù)的數(shù)量不同。
四種隔離級(jí)別之間的高低關(guān)系是什么?
串行化 > 可重復(fù)讀 > 讀已提交 > 讀未提交。
讀已提交能解決哪些并發(fā)處理異常?
讀已提交只能解決臟讀的問(wèn)題,無(wú)法解決不可重復(fù)度和幻讀。
讀未提交能解決哪些并發(fā)處理異常?
讀未提交不能解決任何并發(fā)處理異常。
可重復(fù)讀能解決哪些并發(fā)處理異常?
可重復(fù)讀可以解決臟讀和不可重復(fù)讀問(wèn)題,不能解決幻讀問(wèn)題。
回滾日志和重做日志(這似乎屬于MySQL)
持久性是通過(guò)事務(wù)日志來(lái)保證的。當(dāng)我們通過(guò)事務(wù)對(duì)數(shù)據(jù)進(jìn)行修改的時(shí)候,首先會(huì)將數(shù)據(jù)庫(kù)的變化信息記錄到重做日志中,然后再對(duì)數(shù)據(jù)庫(kù)中對(duì)應(yīng)的行進(jìn)行修改。這樣做的好處是,即使數(shù)據(jù)庫(kù)系統(tǒng)崩潰,數(shù)據(jù)庫(kù)重啟后也能找到?jīng)]有更新到數(shù)據(jù)庫(kù)系統(tǒng)中的重做日志,重新執(zhí)行,從而使事務(wù)具有持久性。
索引
SQL優(yōu)化
對(duì)數(shù)據(jù)庫(kù)進(jìn)行調(diào)優(yōu)時(shí),都有哪些維度可以選擇?
對(duì)數(shù)據(jù)庫(kù)調(diào)優(yōu)時(shí),可以從以下幾個(gè)角度入手:
- 選擇合適的DBMS
- 優(yōu)化表設(shè)計(jì)
- 優(yōu)化邏輯查詢
- 優(yōu)化物理查詢
- 使用Redis或Memcached作為緩存
- 庫(kù)級(jí)優(yōu)化
拓展
視圖
存儲(chǔ)過(guò)程
游標(biāo)
SQL語(yǔ)句練習(xí)
查詢比平均薪資高的員工信息
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 )
查詢 “研發(fā)部” 員工的平均工資
SELECT avg(salary)
FROM emp
where dept_id = (SELECT id from dept where name = '研發(fā)部')
查詢擁有員工的部門ID、部門名稱
SELECT distinct d.id ,d.name
FROM emp e join dept d on e.dept_id = d.id
查詢所有年齡大于40歲的員工, 及其歸屬的部門名稱; 如果員工沒(méi)有分配部門, 也需要展示出來(lái)
SELECT e.*,d.name '部門名稱'
FROM emp e left join dept d on e.dept_id = d.id
where e.age > 40
查詢所有員工的工資等級(jí)
SELECT e.* ,s.id '薪資等級(jí)'
FROM emp e left join salgrade s on e.salary > s.losal and e.salary <= s.hisal
查詢主要定位或者次要定位是法師或是射手的英雄,同時(shí)英雄的上線時(shí)間不在 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;
查詢英雄的名字,以及他們的名字字?jǐn)?shù):
SQL:SELECT CHAR_LENGTH(name), name FROM heros
查詢英雄上線日期(對(duì)應(yīng)字段 birthdate)的年份,只顯示有上線日期的英雄即可(有些英雄沒(méi)有上線日期的數(shù)據(jù),不需要顯示):
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
查詢?cè)?2016 年 10 月 1 日之后上線的所有英雄:
SQL: SELECT * FROM heros WHERE DATE(birthdate)>'2016-10-01'
查詢不同的生命最大值的英雄數(shù)量是多少:
SQL: SELECT COUNT(DISTINCT hp_max) FROM heros
統(tǒng)計(jì)不同生命最大值英雄的平均生命最大值,保留小數(shù)點(diǎn)后兩位:
SQL: SELECT ROUND(AVG(DISTINCT hp_max), 2) FROM heros