中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

制作網(wǎng)站賺錢嗎足球比賽統(tǒng)計(jì)數(shù)據(jù)

制作網(wǎng)站賺錢嗎,足球比賽統(tǒng)計(jì)數(shù)據(jù),wordpress站點(diǎn)相關(guān),代理網(wǎng)址大全SQL復(fù)習(xí) MySQL MySQL MySQL有什么特點(diǎn)? MySQL 不支持全外連接。 安裝 數(shù)據(jù)類型 MySQL中的數(shù)據(jù)類型分為哪些? MySQL中的數(shù)據(jù)類型主要分為三大類:數(shù)值類型、字符串類型、日期時(shí)間類型。 其中, 數(shù)值類型又分為七種:T…

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ù)值類型大小
TINYINT1bytes
SMALLINT2bytes
INT/INTEGER4bytes
BIGINT/Long8bytes

數(shù)值類型中,FLOAT、DOUBLE的大小分別是多少?

兩者都是浮點(diǎn)數(shù)值,前者是單精度浮點(diǎn)數(shù),后者是雙精度浮點(diǎn)數(shù)。

數(shù)值類型大小
FLOAT4bytes
DOUBLE8bytes

字符串類型都有哪些?

字符串類型包括:CHAR、VARCHAR、BLOB、TEXT、LONGTEXT。

CHAR和VARCHAR有什么區(qū)別?CHAR的大小是多少?VARCHAR的大小是多少?

CHAR是定長(zhǎng)字符串,VARCHAR是變長(zhǎng)字符串。

但兩者在使用時(shí)都需要指定長(zhǎng)度。

字符串類型大小
CHAR0-255bytes
VARCHAR0-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í)間類型格式
DATEYYYY-MM-DD
DATETIMEYYYY-MM-DD HH:MM:SS
TIMEHH:MM:SS
TIMESTAMPYYYY-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 的外連接包括了三種形式:

  1. 左外連接:LEFT JOIN 或 LEFT OUTER JOIN
  2. 右外連接:RIGHT JOIN 或 RIGHT OUTER JOIN
  3. 全外連接: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è)方面:

  1. 兩者執(zhí)行時(shí)間不同:WHER在分組之前執(zhí)行,不參與分組;HAVING在分組之后執(zhí)行。
  2. 判斷條件不同: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)鍵字后,所有列名前使用。如:

SQLSELECT 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有以下幾處需要掌握:

  1. ORDER BY后可以有一個(gè)或多個(gè)列名。對(duì)多個(gè)列的排序會(huì)按照先后順序進(jìn)行。
  2. OREDR BY可以設(shè)置排序規(guī)則,ASC表示遞增,DESC表示遞減。默認(rèn)按照ASC進(jìn)行排序。
  3. ORDER BY可以對(duì)非選擇列進(jìn)行排序,即:即使SELECT后沒(méi)有此列,也可以放在ORDER BY后參與排序。
  4. ORDER BY語(yǔ)句通常位于SELECT語(yǔ)句的最后一條子句,否則會(huì)報(bào)錯(cuò)。

如果我們需要對(duì)不同的列采用不同的排序規(guī)則(A列升序,B列降序),應(yīng)該怎么寫?

對(duì)不同的列進(jìn)行排序時(shí),可以直接在ORDER BY語(yǔ)句后的列名后增加排序規(guī)則。

如:

SQLSELECT 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í)行順序基本相同。

FROMWHEREGROUP BYHAVINGSELECT的字段 → DISTINCTORDER BYLIMIT

具體如下:

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í)行順序是這樣的:

  1. FROM 子句組裝數(shù)據(jù)(包括通過(guò) ON 進(jìn)行連接);
  2. WHERE 子句進(jìn)行條件篩選;
  3. GROUP BY 分組 ;
  4. 使用聚集函數(shù)進(jìn)行計(jì)算;
  5. HAVING 篩選分組;
  6. 計(jì)算所有的表達(dá)式;
  7. SELECT 的字段;
  8. ORDER BY 排序;
  9. LIMIT 篩選。

SELECT *

SELECT *有什么缺點(diǎn)?

使用SELECT * 會(huì)增加數(shù)據(jù)庫(kù)負(fù)擔(dān)。在實(shí)際工作中,應(yīng)盡量寫出所需要的列名,生產(chǎn)環(huán)境下,盡量不要使用SELECT *進(jìn)行查詢。

通配符

如何查詢英雄中,包含“太”字的英雄都有哪些?

使用通配符查詢。

SQLSELECT name FROM heros WHERE name LIKE '%太%'

為什么要盡量少的使用通配符進(jìn)行查詢?

  1. 通配符需要消耗較長(zhǎng)的時(shí)間來(lái)進(jìn)行匹配。
  2. 如果LIKE檢索的字段有索引,那么模糊查詢時(shí),索引可能失效。

太%%太有什么區(qū)別?

  1. 首先兩者最大的區(qū)別在于查詢的對(duì)象不同,前者指以“太”開(kāi)頭的元素,后者指以“太”結(jié)尾的元素。
  2. 其次,當(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 NULLIS 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ū)別是什么?

  1. WHERE 是用于過(guò)濾數(shù)據(jù)行,而 HAVING 則用于分組。
  2. 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ū)別?

  1. 前者只是統(tǒng)計(jì)數(shù)據(jù)行,不論該字段的值是否為NULL;
  2. 后者會(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ū)別是什么?

  1. 兩個(gè)函數(shù)的共同點(diǎn)都是計(jì)算字段的長(zhǎng)度。
  2. LENGTH()中,一個(gè)漢字算作三個(gè)字符,數(shù)字和字母都算作一個(gè)字符。
  3. 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 字段列表 FROM1 ,2 WHERE 條件 ... ;

什么是顯式內(nèi)連接查詢?

SELECT 字段列表 FROM1 [ INNER ] JOIN2 ON 連接條件 ... ;
#INNER可以省略

外連接查詢

外連接查詢分為哪幾類?

外連接查詢分為兩類:左外連接和右外連接。

什么是左外連接?

SELECT 字段列表 FROM1 LEFT [ OUTER ] JOIN2 ON 條件 ... ;

什么是右外連接?

SELECT 字段列表 FROM1 RIGHT [ OUTER ] JOIN2 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è):

  1. 支持事務(wù)、
  2. 支持行級(jí)鎖定(提高并發(fā)性能)、
  3. 支持外鍵約束。

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 的外連接包括了三種形式:

  1. 左外連接:LEFT JOIN 或 LEFT OUTER JOIN
  2. 右外連接:RIGHT JOIN 或 RIGHT OUTER JOIN
  3. 全外連接:FULL JOIN 或 FULL OUTER JOIN

不同 DBMS 中使用連接需要注意的地方有哪些?

  1. 不是所有的 DBMS 都支持全外連接
  2. Oracle 沒(méi)有表別名 AS
  3. SQLite 的外連接只有左連接

關(guān)于連接的性能問(wèn)題有哪些需要注意?

  1. 控制連接表的數(shù)量
  2. 在連接時(shí)不要忘記 WHERE 語(yǔ)句
  3. 使用自連接而不是子查詢

為什么要使用自連接而不是子查詢?

因?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

  1. A:原子性(Atomicity),事務(wù)是不可分割的,它是進(jìn)行數(shù)據(jù)處理操作的基本單位。
  2. 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ù)的完整性約束不能被破壞。
  3. I:隔離性(Isolation),每個(gè)事務(wù)都是彼此獨(dú)立的,不會(huì)受到其他事務(wù)的執(zhí)行影響。一個(gè)事務(wù)在提交之前,對(duì)其他事務(wù)都是不可見(jiàn)的。
  4. D:持久性(Durability),事務(wù)提交之后對(duì)數(shù)據(jù)的修改是持久性的,即使在系統(tǒng)出故障比如系統(tǒng)崩潰或者存儲(chǔ)介質(zhì)發(fā)生故障,數(shù)據(jù)的修改依然是有效的。

事務(wù)的常用控制語(yǔ)句都有哪些?

  1. START TRANSACTION 或者 BEGIN,作用是顯式開(kāi)啟一個(gè)事務(wù)。
  2. COMMIT:提交事務(wù)。當(dāng)提交事務(wù)后,對(duì)數(shù)據(jù)庫(kù)的修改是永久性的。
  3. ROLLBACK 或者 ROLLBACK TO [SAVEPOINT],意為回滾事務(wù)。意思是撤銷正在進(jìn)行的所有沒(méi)有提交的修改,或者將事務(wù)回滾到某個(gè)保存點(diǎn)。
  4. SAVEPOINT:在事務(wù)中創(chuàng)建保存點(diǎn),方便后續(xù)針對(duì)保存點(diǎn)進(jìn)行回滾。一個(gè)事務(wù)中可以存在多個(gè)保存點(diǎn)。
  5. RELEASE SAVEPOINT:刪除某個(gè)保存點(diǎn)。
  6. SET TRANSACTION,設(shè)置事務(wù)的隔離級(jí)別。

使用事務(wù)的方式有哪些?有什么區(qū)別?

使用事務(wù)有兩種方式:隱式事務(wù)和顯式事務(wù)。

  1. 隱式事務(wù):實(shí)際上就是自動(dòng)提交。
  2. 顯式事務(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 種取值:

  1. autocommit=0 時(shí),不論是否采用 START TRANSACTION 或者 BEGIN 的方式來(lái)開(kāi)啟事務(wù),都需要用 COMMIT 進(jìn)行提交,使用 ROLLBACK 對(duì)事務(wù)進(jìn)行回滾。
  2. 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 種取值:

  1. completion=0:默認(rèn)情況。當(dāng)我們執(zhí)行 COMMIT 的時(shí)候會(huì)提交事務(wù),在執(zhí)行下一個(gè)事務(wù)時(shí),還需要我們使用 START TRANSACTION 或者 BEGIN 來(lái)開(kāi)啟。
  2. 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ù)。
  3. 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ā)處理可能存在的三種異常:

  1. 臟讀(Dirty Read)
  2. 不可重復(fù)讀(Nonrepeatable Read)
  3. 幻讀(Phantom Read)

四種事務(wù)隔離的級(jí)別分別是什么?

四種事務(wù)隔離的級(jí)別分別是:

  1. 讀未提交(READ UNCOMMITTED)
  2. 讀已提交(READ COMMITTED)
  3. 可重復(fù)讀(REPEATABLE READ)
  4. 串行化(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è)角度入手:

  1. 選擇合適的DBMS
  2. 優(yōu)化表設(shè)計(jì)
  3. 優(yōu)化邏輯查詢
  4. 優(yōu)化物理查詢
  5. 使用Redis或Memcached作為緩存
  6. 庫(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 之間。

SQLSELECT 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

查詢英雄最大生命值的最大值:

SQLSELECT MAX(hp_max) FROM heros;

查詢英雄的名字,以及他們的名字字?jǐn)?shù):

SQLSELECT CHAR_LENGTH(name), name FROM heros

查詢英雄上線日期(對(duì)應(yīng)字段 birthdate)的年份,只顯示有上線日期的英雄即可(有些英雄沒(méi)有上線日期的數(shù)據(jù),不需要顯示):

SQLSELECT 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 日之后上線的所有英雄:

SQLSELECT * 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
http://www.risenshineclean.com/news/22134.html

相關(guān)文章:

  • 好看的網(wǎng)站設(shè)計(jì)網(wǎng)站seo怎么優(yōu)化關(guān)鍵詞排名培訓(xùn)
  • 做外貿(mào)自己的公司網(wǎng)站成品app直播源碼有什么用
  • spring boot 網(wǎng)站開(kāi)發(fā)網(wǎng)站編輯
  • 知道域名怎么進(jìn)入網(wǎng)站北京網(wǎng)站建設(shè)公司報(bào)價(jià)
  • 圣輝友聯(lián)劉金鵬做網(wǎng)站鄭州網(wǎng)站關(guān)鍵詞優(yōu)化公司哪家好
  • 供應(yīng)長(zhǎng)沙手機(jī)網(wǎng)站建設(shè)天津關(guān)鍵詞排名推廣
  • wordpress 修改登錄地址seo的定義是什么
  • 企業(yè)網(wǎng)站模板下載需謹(jǐn)慎百度信息流投放在哪些平臺(tái)
  • 上傳自己做的網(wǎng)站后臺(tái)怎么辦常見(jiàn)的網(wǎng)絡(luò)營(yíng)銷方式有哪些
  • 網(wǎng)站重新制作多久google重新收錄網(wǎng)絡(luò)營(yíng)銷策略有哪幾種
  • redis做緩存的網(wǎng)站并發(fā)數(shù)百度推廣關(guān)鍵詞價(jià)格查詢
  • 手機(jī)網(wǎng)站 文件上傳百度熱榜排行
  • 重慶做網(wǎng)站推廣電商網(wǎng)站排名
  • 網(wǎng)站反鏈騰訊廣告
  • 網(wǎng)絡(luò)app制作網(wǎng)站有哪些內(nèi)容app開(kāi)發(fā)流程
  • 做女朋友的網(wǎng)站qq群引流推廣軟件
  • wordpress 一站多主題國(guó)內(nèi)優(yōu)秀網(wǎng)頁(yè)設(shè)計(jì)賞析
  • 與做機(jī)器人有關(guān)的網(wǎng)站軟件開(kāi)發(fā)需要學(xué)什么
  • iis 網(wǎng)站目錄權(quán)限網(wǎng)站制作維護(hù)
  • 惠州seo推廣外包北京百度關(guān)鍵詞優(yōu)化
  • icp備案網(wǎng)站更名整站優(yōu)化多少錢
  • 做家具的企業(yè)網(wǎng)站最吸引人的營(yíng)銷廣告詞
  • 免費(fèi)游戲網(wǎng)頁(yè)入口西安網(wǎng)站seo外包
  • 深圳雙語(yǔ)網(wǎng)站制作網(wǎng)站的seo是什么意思
  • 怎么做裝修網(wǎng)站seo優(yōu)化招商
  • 家裝建材網(wǎng)購(gòu)平臺(tái)推薦seo外鏈平臺(tái)
  • 做網(wǎng)站廠家廣告策劃公司
  • 做網(wǎng)站客戶沒(méi)有付定金深圳網(wǎng)站優(yōu)化推廣
  • 前端開(kāi)發(fā)培訓(xùn)機(jī)構(gòu)成都西安官網(wǎng)seo
  • 畢業(yè)設(shè)計(jì)做系統(tǒng)跟做網(wǎng)站哪個(gè)容易打廣告去哪個(gè)平臺(tái)免費(fèi)