久久综合九色综合97婷婷-美女视频黄频a免费-精品日本一区二区三区在线观看-日韩中文无码有码免费视频-亚洲中文字幕无码专区-扒开双腿疯狂进出爽爽爽动态照片-国产乱理伦片在线观看夜-高清极品美女毛茸茸-欧美寡妇性猛交XXX-国产亚洲精品99在线播放-日韩美女毛片又爽又大毛片,99久久久无码国产精品9,国产成a人片在线观看视频下载,欧美疯狂xxxx吞精视频

有趣生活

當前位置:首頁>職場>面試題你寫過比較難的sql(70道SQL經典面試題大全)

面試題你寫過比較難的sql(70道SQL經典面試題大全)

發布時間:2024-01-24閱讀(10)

導讀吐血整理了一周SQL面試題,包括了選擇題、問答題、實戰題每道題都給大家加了詳細的獨家解析幾乎每個知識點都涉及到了,我來為大家科普一下關于面試題你寫過比較難的....

吐血整理了一周SQL面試題,包括了選擇題、問答題、實戰題每道題都給大家加了詳細的獨家解析幾乎每個知識點都涉及到了,我來為大家科普一下關于面試題你寫過比較難的sql?以下內容希望對你有幫助!

面試題你寫過比較難的sql(70道SQL經典面試題大全)

面試題你寫過比較難的sql

吐血整理了一周SQL面試題,包括了選擇題、問答題、實戰題。每道題都給大家加了詳細的獨家解析。幾乎每個知識點都涉及到了。

刷完這套題,關于SQL的面試妥妥的。

題目來源:各大廠面試題、牛客網

選擇題

(1)基礎題

1、要求刪除商品表中價格大于3000的商品,下列SQL語句正確的是()

A、DELETE FROM 商品 WHERE 價格>3000

B、DELETE * FROM 商品 WHERE 價格>3000

C、DELETE FROM 商品

D、UPDATE 商品 SET * =NULL WHERE 價格>3000

正確答案: A答案解析:這道題考察的是delete語法DELETE FROM table_nameWHERE some_column=some_value;

2、在book表中,將工具書類型(tool)的書的書架序號都減少2,下列語句正確的是()

A、UPDATE books SET shelf = shelf - 2 WHERE type IS ‘tool’;

B、INSERT books SET shelf = shelf - 2 WHERE type IS ‘tool’;

C、UPDATE books SET shelf = shelf - 2 WHERE type = ‘tool’;

D、UPDATE books INTO shelf = shelf - 2 WHERE type = ‘tool’;

正確答案: C答案解析:這道題考察的是update語法。UPDATE table_nameSET column1=value1,column2=value2,…WHERE some_column=some_value;where后面語句,查找NUll值的時候可以用 type IS NUll,否則要用等于=

3、為職員表添加列,列名為年末獎金,允許為空值,數據類型為貨幣數據類型。下列SQL語句正確的是()

A、ATER TABLE 職員 ADD 年末獎金 NULL

B、ALTER TABLE 職員 ADD 年末獎金 Money NULL

C、ALTER TABLE 職員 ADD 年末獎金 Money NOT NULL

D、ALTER TABLE 職員 ADD 年末獎金 INT NULL

正確答案: B答案解析:這道題考察的是ALTER語法。如果你想在已有的表中,添加、刪除或修改列,就需要用到alter語句。添加列:ALTER TABLE table_name ADD column_name datatype修改列:在sql server中與MySql中修改列的語句有所差異,這里要注意~My SQL / Oracle:ALTER TABLE table_name MODIFY COLUMN column_name datatypeSQL Server:ALTER TABLE table_name ALTER COLUMN column_name datatype刪除列:ALTER TABLE table_name DROP COLUMN column_namemysql沒有money類型 sql server才有money類型,所以在讀題的時候要注意是否提到在mysql中。money其實跟float是同類型數據。money類型只是顯示在數據表的時候前面多加一個$樣式的符號。

4、小李在創建完一張數據表后,發現少創建了一列,此時需要修改表結構,應該用哪個語句進行操作?

A、MODIFY TABLE

B、INSERT TABLE

C、ALTER TABLE

D、UPDATE TABLE

正確答案: C答案解析:鞏固一下上一題,修改已有的表,就用alter語句。ALTER TABLE 表名 add 字段名

5、SQL語言可以分為多個類別,那么不屬于數據操縱語言DML的是()

A、update

B、grant

C、delete

D、insert

正確答案: B答案解析:grant語句是用來賦予用戶權限的,是數據控制語言(DCL)。其他3個都是數據操縱語言(DML)數據查詢語言(DQL):是由SELECT子句,FROM子句,WHERE子句組成的查詢塊數據操縱語言(DML): SELECT(查詢) INSERT(插入) UPDATE(更新) DELETE(刪除)數據定義語言(DDL):CREATE(創建數據庫或表或索引)ALTER(修改表或者數據庫)DROP(刪除表或索引)數據控制語言(DCL):GRANT(賦予用戶權限) REVOKE(收回權限) DENY(禁止權限)事務控制語言(TCL):SAVEPOINT (設置保存點)ROLLBACK (回滾) COMMIT(提交)

6、下列選項中使用別名的方法不正確的是()

A、字段名稱=別名

B、字段名稱 AS 別名

C、字段名稱 別名

D、別名=字段名稱

正確答案: D答案解析:給字段名稱起別名,B、C選項沒有疑義,as可以省略A選項,字段名稱=別名,在SQL Server中可以這樣使用,MySQL中則不可以。如果沒有特別指明是在mysql中,我們默認就在SQL Server中。

(多選題)7、在MySql中進行數據查詢時,如果要對查詢結果的列名重新命名,將sno列重新命名為學號,則下列語句正確的是( )

A、select sno as 學號 from T

B、select 學號= sno from T

C、select sno 學號 from T

D、select sno=學號 from T

正確答案: A C答案解析:鞏固一下上一題,在SQL Server 中可以使用’=’,MySQL中則不可以

8、在SQL中用條件表示價格在在30至40之間,應該如何表達?

A、in (30,40)

B、BETWEEN 30 AND 40

C、BETWEEN 30 OR 40

D、BETWEEN 30 TO 40

正確答案: B答案解析:這道題考察的是BETWEEN … AND …知識點

9、SQL語句中與Having子句同時使用的語句是?()

A、Group By

B、聯盟鏈

C、left Join

D、Where

正確答案: A答案解析:having和where作用差不多,都是用來篩選數據的。having作用在分組之后,也就是要放在group by的后面

10、已知數據表STU,現需創建視圖view_s,顯示所有男同學的信息。下列SQL語句正確的是()

A、CREATE VIEW AS SELECT * FROM STU

B、CREATE VIEW view_s AS SELECT * FROM STU WHERE 性別=‘男’

C、CREATE view_s SELECT * FROM STU WHERE 性別=‘男’

D、CREATE view_s AS SELECT * FROM STU

正確答案: B答案解析:這道題考察的是VIEW 創建視圖知識點將查詢語句放在create views view_name as 后面,這樣查詢語句的結果就會存儲在視圖中,后面可以繼續調用這個視圖數據,或者直接在視圖中查詢。視圖可以當成表格來用。CREATE VIEW view_name ASSELECT column_name(s) FROM table_nameWHERE conditionCREATE后面要加上VIEW,不然數據庫怎么知道你要創建啥~

11、Mysql中表student_info(id,name,birth ,sex),字段類型都是varchar,插入如下記錄:(‘1014’ , ‘張三’ , ‘2002-01-06’ , ‘男’); 下面SQL錯誤的是()?

A、insert into student_info values(‘1014’ , ‘張三’ , ‘2002-01-06’ , ‘男’);

B、insert into table student_info values(‘1014’ , ‘張三’ , ‘2002-01-06’ , ‘男’);

C、insert into student_info(id,name,birth,sex) values(‘1014’ , ‘張三’ , ‘2002-01-06’ , ‘男’);

D、insert into student_info(id,name,sex,birth,) values(‘1014’ , ‘張三’ , ‘男’,‘2002-01-06’ );

正確答案:B答案解析:這道題比較簡單,考察的知識點是:insert插入數據的語法。insert into 后面直接跟表名。insert into table,這種語法就不對。有些同學可能會選擇D,覺得順序不對。但前面指明的列順序,與后面是對應的(id,name,sex,birth,) values(‘1014’ , ‘張三’ , ‘男’,2002-01-06’ )

12、將成績表(grade)按成績(point)升序排列,下列語句錯誤的是()

A、SELECT * FROM grade ORDER BY point;

B、SELECT point FROM grade ORDER BY point;

C、SELECT * FROM grade ORDER BY point ASC;

D、SELECT * FROM grade ORDER BY point DESC;

正確答案: D答案解析:這道題考察的是group by語句中是升序,降序A、B選項沒有特意指定,默認是升序。ASC 表示升序,DESC 表示降序,所以D是錯的

(2)進階題

1、Mysql中表student_table(id,name,birth, sex),插入如下記錄:

(‘1001’ , ‘’ , ‘2000-01-01’ , ‘男’);

(‘1002’ , null , ‘2000-12-21’ , ‘男’);

(‘1003’ , NULL , ‘2000-05-20’ , ‘男’);

(‘1004’ , ‘張三’ , ‘2000-08-06’ , ‘男’);

(‘1005’ , ‘李四’ , ‘2001-12-01’ , ‘女’);

查詢2001年及之后出生的男生、女生總數,正確的SQL是()?

A、select sex,count() from student_table group by sex where birth >=‘2001’ ;

B、select count() from student_table where birth >=‘2001’ group by sex ;

C、select sex,count() from student_table where birth >=‘2001’ group by sex ;

D、select sex,count() from student_table group by sex having birth >=2001’ ;

正確答案: C答案解析:這道題考察的是select語句中group by分組知識點。where應該放在group by 的前面,排除Agroup by后面的字段都要在select后面出現,B選擇中的sex,沒有在select后面出現,排除BHaving后面可以跟字段和聚合函數,having后面的字段,也是只能使用在select后面出現的字段。排除D

2、某IT公司人事管理采用專門的人事管理系統來實現。后臺數據庫名為LF。新來的人事部張經理新官上任,第一件事是要對公司的員工做全面的了解。可是他在訪問員工信息表EMPL里的工資和獎金字段的時被拒絕,只能查看該表其他字段。作為LF的開發者你將如何解決這一問題:( )

A、廢除張經理的數據庫用戶帳戶對表EMPL里的工資列和獎金列的SELECT權限

B、添加張經理到db_datareader角色

C、添加張經理到db_accessadmin角色

D、授予張經理的數據庫用戶帳戶對表EMPL里的工資列和獎金列的SELECT權限。

正確答案: Ddb_accessadmin可以添加、刪除用戶的用戶db_datareader可以從所有數據表中讀取所有數據,人事經理只是想訪問員工信息表,不需要給這么大權限。

3、下列函數語句得不到相同數值結果的選項是()

A、SELECT ROUND(2.35)

B、SELECT ROUND(1.96,1)

C、SELECT TRUNCATE(1.99,1)

D、SELECT TRUNCATE(2.83,0)

正確答案: CROUND() 函數用于把數值字段舍入為指定的小數位數,第二個參數表示保留幾位小數。ROUND(2.35)結果為2,ROUND(1.96,1)結果為2.0TRUNCATE() 函數是按照小數位數進行數值截取,沒有四舍五入。第二個參數表示保留幾位小數。TRUNCATE(1.99,1)結果為1.9,TRUNCATE(2.83,0)結果為2

4、在STUDENT表中按class_type統計數據行數分組情況后,篩選出數據行數為大于10行的組

A、SELECT class_type,COUNT() FROM STUDENT GROUP BY class_type HAVING COUNT()>10

B、SELECT class_type,COUNT() FROM STUDENT GROUP BY class_type WHERE COUNT()=10

C、SELECT class_type,COUNT() FROM STUDENT HAVING COUNT()>10 GROUP BY class_type

D、SELECT class_type,COUNT() FROM STUDENT WHERE COUNT()>10 GROUP BY class_type

正確答案:A答案解析:這道題是根據class_type分組后,找出每組大于10行的數據,考察的知識點是:where和having的區別。where和having作用差不多,都是用來篩選數據的。having作用在分組之后,也就是要放在group by的后面,where放在group by的前面。這樣就排除了B、Ccount(*)是聚合函數,意思是查詢每組有多少條數據記錄。having后面可以跟聚合函數,where后面不能跟聚合函數。排除了D

5、查詢語句select stuff(‘lo ina’,3, 1, ‘ve ch’)結果為?

A、love

B、love china

C、china love

D、china

正確答案: B答案解析:stuff(原字符, 開始位置, 刪除長度, 插入字符)stuff函數是從指定的起點處開始刪除指定長度的字符,并在此處插入另一組字符

6、已知某期刊信息庫中有作家信息表author(作者編號aid,作者姓名aname,作者筆名ausername,作者郵箱aemail,備注remarks),稿件表manuscript(稿件編號mid,標題mtitle,作者編號aid,交稿時間mtime)現需要設置外鍵作者編號,下列語句正確的是()

A、ALTER TABLE manuscript

ADD CONSTRAINT FK_aid

FOREIGN KEY (aid) REFERENCES author (aid)

B、ALTER TABLE manuscript

ADD CONSTRAINT FK_aid

FOREIGN KEY (manuscript.aid) REFERENCES author (aid)

C、ALTER TABLE manuscript

ADD FOREIGN KEY (manuscript.aid)

REFERENCES author (aid)

D、ALTER TABLE manuscript

ADD FOREIGN KEY (aid)

REFERENCES author (aid)

正確答案: B答案解析:這道題考察的是設置外鍵的語法。alter table 表名 add constraint FK_ID foreign key(你的外鍵字段名) REFERENCES 外表表名(對應的表的主鍵字段名);

(多選題)7、使用SQL語句建個存儲過程proc_stu,然后以student表中的學號Stu_ID為輸入參數@s_no,返回學生個人的指定信息。下面創建存儲過程語句正確的是:( )

A、CREATE PROCEDURE proc_stu

@s_no AS int

AS

BEGIN

select * from stu.student where Stu_ID=@s_no

END

B、CREATE PROCEDURE proc_stu

@s_no int

AS

BEGIN

select * from stu.student where Stu_ID=@s_no

END

C、CREATE PROCEDURE proc_stu

@s_no int

AS

BEGIN

select * from stu.student where s_no=@s_no

END

D、CREATE PROCEDURE proc_stu

@s_no AS int

AS

BEGIN

select * from stu.student where Stu_ID=@Stu_ID

END

正確答案: A B答案解析:這道題主要考的是where后面跟的參數怎樣賦值。where 表字段=參數。Stu_ID是表格字段,@s_no是參數。

8、請取出 BORROW表中日期(RDATE字段)為當天的所有記錄?(RDATE字段為datetime型,包含日期與時間)。SQL語句實現正確的是:( )

A、select * from BORROW where datediff(dd,RDATE,getdate())=0

B、select * from BORROW where RDATE=getdate()

C、select * from BORROW where RDATE-getdate()=0

D、select * from BORROW where RDATE > getdate()

正確答案:A答案解析:這道題考察的是datediff() 函數。datediff() 函數的意思是返回兩個日期之間的時間差。datediff(dd,RDDATE,getdate())==0是意思是表中日期(RDDATE)與當前日期(getdate())這兩個日期相同,就為true。就會取出這天的記錄。dd是日,ww是周,mm是月,hh小時,mi分鐘,ss秒

9、Mysql中表student_table(id,name,birth, sex),插入如下記錄:

(‘1001’ , ‘’ , ‘2000-01-01’ , ‘男’);

(‘1004’ , ‘張三’ , ‘2000-08-06’ , ‘男’);

(‘1005’ , NULL , ‘2001-12-01’ , ‘女’);

(‘1006’ , ‘張三’ , ‘2001-12-02’ , ‘女’);

執行

select t1.name from

(select * from student_table where sex = ‘女’)t1

left join

(select * from student_table where sex = ‘男’)t2

on t1.name = t2.name;

的結果行數是()?

A、4

B、3

C、2

D、1

正確答案:C答案解析:這道題考察的是left join 左連接,左連接就是不管有沒有符合條件的數據,都會將左邊表的數據全部展示。這里左邊的表是t1 ,查出了所有性別為女的數據,就是兩條。后面不管跟上面查詢條件,這兩條數據都會顯示出來。

(多選題)10、下面有關sql 語句中 delete、truncate的說法正確的是?()

A、論清理表數據的速度,truncate一般比delete更快

B、truncate命令可以用來刪除部分數據。

C、truncate只刪除表的數據不刪除表的結構

D、delete能夠回收高水位(自增ID值)

正確答案:A、C答案解析:這道題考察的是trustcate與delete的區別在處理效率方面:drop>trustcate>delete刪除記錄方面:drop刪除整個表、trustcate刪除全部記錄但不刪除表、delete刪除部分記錄高高水線方面delete不影響所用extent,高水線保持原位置不動;trustcate會將高水線復位。

11、檢索銷量表中銷量最好的商品id和銷量,下列SQL語句正確的是()

A、SELECT 商品id,銷量 FROM 銷量表 WHERE 銷量=MAX(銷量)

B、SELECT 商品id,MAX(銷量) FROM 銷量表 GROUP BY 銷量

C、SELECT 商品id,MAX(銷量) FROM 銷量表 GROUP BY 商品id

D、SELECT 商品id,銷量 FROM 銷量表 WHERE 銷量=(SELECT MAX(銷量) FROM 銷量表)

正確答案:D答案解析:最后表格輸出的結果最好的商品id和銷量,A選項語法錯了,where后面不能跟聚合函數,having后面可以跟B選項語法錯了,group by后面的字段,需要再select后面字段中提到C選項把商品id字段分類,再對銷量取最大值,實際作用是將商品id去重 查詢商品id和對應銷量,如果分類字段沒有重復數據,效果等同‘ select * from 銷量表 ’,不符合題意。D選項是對的,先用子查詢找到最大的銷量的具體值,在找對應具體值的商品名。

12、Mysql中表student_table(id,name, birth,sex),查詢不重復的姓名總數,錯誤的是()?

A、select count(distinct name) from student_table ;

B、select count(name) from (select distinct name from student_table) t1

C、select count(name) from (select name,count(*) as c1 from student_table group by name having c1 > 1)t1

D、select count(name) from (select name from student_table group by name) t1;

正確答案:C答案解析:因為我們要查詢不重復的表名,having c1>1這里錯了,c1 >1不就相當于有多個姓名,這里應該是c1 = 1。

(多選題)13、在SQL中語法規范中,having子句的使用下面描述正確的是:( )

A、having子句即可包含聚合函數作用的字段也可包括普通的標量字段

使用having的同時不能使用where子句

B、having子句必須于group by 子句同時使用,不能單獨使用

使用having子句的作用是限定分組條件

C、having子句和where子句是等同的

D、having子句后面必須使用聚合函數

正確答案: A C答案解析:D選項,group by的作用限定分組條件,不是havingE選項:having子句和where子句作用差不多,但是也有區別,并不是等同的。F選擇:沒有函數,也可以使用having,但是要注意,having里面包含的字段,必須在select語句中提到。

14、假設創建新用戶nkw,現在想對于任何IP的連接,僅擁有user數據庫里面的select和insert權限,則列表語句中能夠實現這一要求的語句是()

A、grant select ,insert on . to ‘nkw’@’%’

B、grant select ,insert on user.* to ‘nkw’@’%’

C、grant all privileges on . to ‘nkw’@’%’

D、grant all privileges on user.* to ‘nkw’@’%’

正確答案: B答案解析:這道題考察知識點是數據庫授權命令:GRANT<權限> on 表名(或列名) to 用戶補充知識點-回收權限REVOKE <權限> on 表名(或列名) FROM 用戶

15、下列關于數據庫系統三級模式結構的表述正確的是()

A、內模式是面向數據庫用戶或應用程序的局部數據視圖

B、索引的組織方式是B 樹索引,還是Hash索引與數據庫的內模式有關

C、邏輯模式是數據庫在邏輯級上的視圖,涉及數據的物理存儲細節

D、外模式/模式映像保證了數據庫具有較高的物理獨立性

正確答案: B答案解析:這道題主要考察的是數據庫的設計步驟,以及對應的內模式、外模式、邏輯模式數據庫設計步驟主要分為以下幾方面:1)需求分析,需求分析是通過用戶需求,將數據流程圖、數據字典描述出來2)數據庫設計,這種設計和具體的數據庫管理系統沒有之間關聯,而是抽象出各用戶所需要的數據視圖,對應外模式概念3)將用ER模型或對象模型表示的數據視圖,轉換為關系模式,并對所得關系模式進行優化處理,這就是所謂的數據庫邏輯設計(這一步仍然對應于外模式和模式)4)第四步,在邏輯設計的基礎上,將所得的數據模式組織存儲到物理介質上,這就是數據庫的物理設計(這一步對應于內模式)

16、Mysql(版本8.0.25)中表student_table (id,name,birth,sex),插入如下記錄:

(‘1004’ , ‘張三’ , ‘2000-08-06’ , ‘男’);

(‘1005’ , NULL , ‘2001-12-01’ , ‘女’);

(‘1006’ , ‘張三’ , ‘2000-08-06’ , ‘女’);

(‘1007’ , ‘王五’ , ‘2001-12-01’ , ‘男’);

(‘1008’ , ‘李四’ , NULL, ‘女’);

(‘1009’ , ‘李四’ , NULL, ‘男’);

(‘1010’ , ‘李四’ , ‘2001-12-01’, ‘女’);

執行

select count(t2.birth) as c1

from (

select * from student_table where sex = ‘男’ ) t1

full join

(select * from student_table where sex = ‘女’) t2

on t1.birth = t2.birth and t1.name = t2.name ;

的結果行數是()?

A、2

B、3

C、執行報錯

D、4

正確答案: C答案解析:mysql不支持full join,應該用outer join

17、積分result表中有A B C D四列,要求:

1)當A列值大于等于B列時,選擇A列否則選擇B列

2)當C列值大于等于D列時,選擇C列否則選擇D列

用SQL語句實現正確的是:( )

A、select ( when A>=B then A else B ) MAX_AB, ( when C>=D then C else D ) MAX_CD from result

B、select (case when A>=B then A else B ) MAX_AB, (case when C>=D then C else D ) MAX_CD from result

C、select (case when A>=B then A else B end) MAX_AB, (case when C>=D then C else D end) MAX_CD from result

D、select case when A>=B then A else B end MAX_AB, case when C>=D then C else D end MAX_CD from result

正確答案: C答案解析:case when 判斷條件 then 成功結果 then 不成功結果 end

18、Mysql中表student_table(id,name, birth,sex),插入如下記錄:

(‘1001’ , ‘’ , ‘2000-01-01’ , ‘男’);

(‘1002’ , null , ‘2000-12-21’ , ‘男’);

(‘1003’ , NULL , ‘2000-05-20’ , ‘男’);

(‘1004’ , ‘張三’ , ‘2000-08-06’ , ‘男’);

(‘1005’ , ‘李四’ , ‘2001-12-01’ , ‘女’);

執行 select * from student_table where length(name) >= 0 的結果行數是()?

A、1

B、2

C、3

D、4

正確答案:C答案解析:1001和1002是不一樣的,一個是空字符串,一個是NULL。針對這兩種數據使用length()函數結果是不相同的。針對1001 length(name)結果是0,針對1002、1003 length(name)結果是空值NULL因此題干where length(name) >= 0 會篩選出 1001、1004、1005三條數據

19、有一張Person表包含如下信息:

Id Name Address Career

1 Bob China Town Chef

2 Carter Oxford Street Teacher

3 Anna Fourteen Avenue Dancer

現要選取居住地址Address不以’C’或’O’開頭的人員信息,下列MySQL查詢語句正確的是:

A、SELECT * FROM Person Address REGEXP ‘[CO]’;

B、SELECT * FROM Person Address LIKE ‘[!CO]%’;

C、SELECT * FROM Person Address LIKE ‘[^CO]%’;

D、SELECT * FROM Person Address REGEXP ‘1’;

正確答案: A答案解析:此題考的是SQL里的正則表達式查詢:SELECT * FROM Person Address REGEXP ‘^[^CO]’;[^]匹配不在括號中的任何字符,’[^CO]‘匹配任何不包含’C’或’O’的字符,其實就是匹配除了’C’或’O’之外的所有字符。^匹配文本的開始字符,’^[^CO]’ 匹配不以’C’或’O’之外開頭的所有字符。

20、”確保事務可以多次從一個字段中讀取相同的值,在此事務持續期間,禁止其他事務對此字段的更新”是對下列選項哪一個事務隔離級別的描述()

A、Read uncommitted

B、Read committed

C、Repeatable Read

D、Serializable

正確答案:C答案解析:這道題考察的是4個事務隔離級別,面試中經常考。確保事務可以多次從一個字段中讀取相同的值,就是要保證可重復讀取,可重復讀取的意思是,一端在讀取數據的同時,另一端在修改數據。在高并發環境中,很容易出現,讀取數據的一方,兩次讀取結果不一致的情況。要防止這種情況,就是要在讀取數據事務存續時,禁止寫事務,用人話說就是“可讀,不可修改”。這樣保證重復讀取數據的結果是一樣的。這一事務級別就是可重復讀取(Repeatable Read)。具體的4個事務隔離級別,可以查看問答題第12題

21、關于解決事務的臟讀的最簡單的方法,下列選項正確的是()

A、修改時加排他鎖,直到事務提交后釋放,讀取時加共享鎖

B、讀取數據時加共享鎖,寫數據時加排他鎖,都是事務提交才釋放鎖

C、修改時加共享鎖,直到事務提交后釋放,讀取時加排他鎖

D、讀取數據時加排他鎖,寫數據時加共享鎖,都是事務提交才釋放鎖

正確答案: A答案解析:共享鎖是立即釋放的。排除B、D臟讀是意思是一個數據還沒有提交,就會出現在讀取結果中,萬一數據因為異常原因沒有成功提交,查詢結果中就會出現不存在的數據。可以通過在修改時加“排他寫鎖”實現。

問答題

1、如何優化MySQL?

按照以下順序優化:

優化查詢語句

優化索引、事務處理

優化數據表結構

優化系統配置

優化硬件

2、如何優化SQL查詢語句?

(1)對查詢進行優化,首先應盡量避免全表掃描,在比較頻繁使用的字段上面加上索引。

(2)盡量避免在 where 子句中對索引列使用計算或者進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描

(3)Where子句中:where表之間的連接必須寫在其他 Where 條件之前,那些可以過濾掉最大數量

(4)用EXISTS替代IN,用NOT EXISTS替 NOT IN。

3、什么情況下設置了索引但無法使用?

(1)在 where 子句中使用 or 來連接沒有同時使用索引的條件,會使引擎放棄使用索引而進行全表掃描

(2)在 where 子句中對索引列使用計算或者進行 null 值判斷

(3)在 where 子句中,使用以“%”開頭的 LIKE 語句,進行模糊匹配

(4)數據類型出現隱式轉化(如 varchar 不加單引號的話可能會自動轉換為 int 型)

4、鎖的優化策略?

(1)多個線程盡量以相同的順序去獲取資源。

(2)不能將鎖的粒度過于細化,不然可能會出現線程的加鎖和釋放次數過多,反而效率不如一次加一把大鎖。

(3)盡量減少鎖持有的時間

(4)分段加鎖

(5)讀寫分離

5、索引對數據庫系統的負面影響是什么?

索引需要占用物理空間,增加數據庫的大小,降低正常的運行速度

當對表進行增、刪、改、的時候索引也要動態維護,這樣就降低了數據的維護速度。

6、什么情況下不適合建立索引?

(1)對于查詢中很少涉及的列或者重復值比較多的列,不宜建立索引。

(2)對于一些特殊的數據類型,不宜建立索引,比如文本字段(text)等

7、為數據表建立索引的原則有哪些?

(1)在最頻繁使用的、用以縮小查詢范圍的字段上建立索引

(2)不應該基于表來創建索引,應該基于查詢來創建索引

8、索引的底層實現原理和優化?

索引的底層實現原理是B 樹,優化是經過優化的 B 樹。主要是在所有的葉子結點中增加了指向下一個葉子節點的指針,因此 InnoDB 建議為大部分表使用默認自增的主鍵作為主索引。

9、簡單描述 MySQL 中索引、唯一索引、主鍵、聯合索引的區別,對數據庫的性能有什么影響(從讀寫兩方面)?

索引可以極大的提高數據的查詢速度,但是會降低插入、刪除、更新表的速度,因為在執行這些寫操作時,還要操作索引文件。

(1)普通索引的唯一任務是加快對數據的訪問速度,允許被索引的數據列包含重復的值。

(2)唯一索引中,每條數據記錄都是唯一的,創建唯一索引用關鍵字 UNIQUE

(3)主鍵是一種特殊的唯一索引,在一張表中只能定義一個主鍵索引,主鍵用于唯一標識一條記錄,使用關鍵字PRIMARY KEY來創建。

(4)聯合索引可以覆蓋多個數據列,如像INDEX(columnA, columnB)索引。

10、什么是事務

數據庫事務( transaction)是一個數據庫操作序列,這些操作要么全部成功,要么全部失敗,是一個不可分割的工作單位。

11、什么是數據庫的ACID原則

這個是數據庫事務標準、ACID,表示原子性(Atomicity) 、一致性(Consistency)、隔離性(Isolation)、持久化(Durability)。

(1)原子性是指在一個數據庫事務中所有的操作要么全部都做完,要么全部都不做。

(2)一致性是指在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞,比如小明有1500元,小紅有100元,小明給小紅轉賬100元,轉賬完成后,小明和小紅一共有1600元這個不能變。

(3)隔離性:各事務之間的操作不受影響

(4)持久化:事務一旦成功提交成功后,所有這個事務對數據庫的更改全部被保留下來

12、4個事務隔離級別,分別是什么?

隔離級別從低到高。

(1)未授權讀取(Read Uncommitted):允許臟讀,臟讀的意思是,一個數據還沒有提交,就會出現在讀取結果中,萬一數據因為異常原因沒有成功提交,查詢結果中就會出現不存在的數據。該隔離級別可以通過“排他寫鎖”實現。

(2)授權讀取(Read Committed):允許不可重復讀取,但不允許臟讀。不可重復讀取的意思是,允許一端在讀取數據的同時,另一端在修改數據,讀取數據的一方重復讀取時,數據結果不同是被允許的。可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。

(3)可重復讀取(Repeatable Read):禁止不可重復讀取和臟讀,但是有時可能出現幻讀。幻讀的意思是一個事務在前后兩次查詢同一個范圍的時候,后一次查詢看到了前一次查詢沒有看到的數據行。這可以通過“共享讀鎖”和“排他寫鎖”實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。

(4)序列化(Serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,不能并發執行。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。

隔離級別越高,越能保證數據的完整性和一致性,但是對并發性能的影響也越大。對于多數應用程序,可以優先考慮把數據庫系統的隔離級別設為Read Committed,它能夠避免臟讀取,而且具有較好的并發性能。盡管它會導致不可重復讀、虛讀和第二類丟失更新這些并發問題,在可能出現這類問題的個別場合,可以由應用程序采用悲觀鎖或樂觀鎖來控制。

13、SQL中的視圖是什么?

視圖可以當成表格來用,可以將查詢結果存儲在視圖中,后面可以直接調用這個視圖數據,或者繼續在視圖中查詢。

查詢語句放在create views 后面,就可以建立視圖

14、視圖的優點有哪些?

(1)簡化查詢

視圖可以將原本復雜的 SQL 語句簡化。比如前面講的子查詢,我們可以將被嵌套的子查詢保存為視圖,然后主查詢直接在視圖中查詢就可以了。這樣就不會有查詢語句的嵌套,SQL語句會更加易讀。視圖就像模塊化編程一樣,不僅會使語句結構更加清晰,還提升了代碼的復用率。

(2)安全性

使用視圖可以保護原始數據表的安全性,視圖可以對原始表的行和列進行篩選,如果我們禁止了對原始表的訪問權限,用戶只能通過視圖來修改數據,他們就無法修改視圖中未返回的那些字段和記錄。

(3)更易維護

如果沒有視圖,所有的查詢直接指向原始數據表,一旦更改原表設計,就要相應的更改該表所有的查詢語句。如果有視圖,我們只需要修改視圖的查詢語句,使其能保持原有查詢結果即可,基于視圖的查詢我們就不需要再修改了。

15、什么是存儲過程?用什么來調用?

存儲過程是一組SQL語句,用作訪問數據庫的函數。如果將sql代碼與Python代碼寫在一起,或很混亂并且難以維護,用存儲過程來代替,管理維護更加方便。

可以用一個命令對象來調用存儲過程,比如call。

16、什么是Trigger(觸發器)?

觸發器是在插入、更新、刪除語句前后自動執行的一堆SQL代碼,用于對表執行特定操作。

比如在交易表中添加一條交易,在日志表中就自動添加一條記錄,這樣就要用到觸發器。

17、什么是事件?

事件是在特定時刻自動執行任務,操作數據庫。

比如我們想在每天都執行刪除過期日志,就可以創建一個事件,在每天特定時刻來自動執行這一操作。

18、怎樣創建事件?

用 create event 語句來創建事件。

create event 事件名稱

on schedule

every 1 year

do begin

刪除語句

end

19、下面這條語句怎么優化,MySQL 如何優化 DISTINCT?比如優化 SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;

在數據量比較大的時候,使用distinct函數加索引列,會使索引失效,并掃描全表。

這個時候,應該將 DISTINCT 在所有列,都轉換為 GROUP BY。

SELECT t1.a FROM t1,t2 WHERE t1.a=t2.a GROUP BY t1.a;

20、char和varchar的區別

CHAR 和 VARCHAR 類型在存儲和檢索方面有所不同

存儲方面:CHAR 列長度固定,存儲為創建表時聲明的長度,如果插入的長度小于定義長度,則可以用空格進行填充。而varchar是一種可變長度的類型,當插入的長度小于定義長度時,插入多長就存多長。

查找效率:char查找效率會很高,varchar查找效率會更低

21、如何通俗地理解三個范式,說說范式化設計優缺點?

第一范式(1NF):是對屬性的原子性約束,要求屬性具有原子性,不可再分解;

第二范式(2NF):是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;

第三范式(3NF):是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。

范式化的優點: 可以盡量得減少數據冗余,使得更新快,體積小。

缺點:對于查詢需要多個表進行關聯,減少寫操作的效率和增加讀操作的效率,更難進行索引優化

22、MySQL 數據庫作發布系統的存儲,一天五萬條以上的增量,預計運維三年,怎么優化?

(1)設計良好的數據庫結構,不要過度顆粒化,也不要使數據過渡冗余。

(2)選擇合適的表字段數據類型和存儲引擎,適當的添加索引。

(3)MySQL 庫主從讀寫分離。

(4)找規律分表,減少單表中的數據量提高查詢速度。

(5)添加緩存機制,比如 memcached,apc 等。

(6)不經常改動的頁面,生成靜態頁面。

23、窗口函數是什么?和普通聚合函數的區別有哪些?

窗口函數,也叫OLAP(Online Anallytical Processing,聯機分析處理),可以對數據庫數據進行實時分析處理

窗口函數和普通聚合函數的區別:

(1)聚合函數是將多條記錄聚合為?條;窗?函數是每條記錄都會執行,不會改變記錄的行數

(2)聚合函數也可以?于窗?函數。

24、專用窗口函數有哪些?說一說基本用法

專用窗口函數有:rank、dense_rank、row_number等

基本語法:?窗口函數? over (partition by ?用于分組的列名? order by ?用于排序的列名?)

over關鍵字用來指定函數執?的窗?范圍,若后?括號中什么都不寫,則意味著窗口包含滿足WHERE條件的所有行,窗口函數基于所有行進行計算;如果不為空,則?持以下4種語法來設置窗?。

(1)partition by子句:窗口按照哪些字段進?分組,窗?函數在不同的分組上分別執?

(2)order by子句:按照哪些字段進?排序,窗?函數將按照排序后的記錄順序進?編號

(3)frame子句:frame是當前分區的?個子集,子句?來定義子集的規則,通常?來作為滑動窗?使?

(4)window_name:給窗口指定?個別名。如果SQL中涉及的窗口較多,采用別名可以看起來更清晰易讀

25、使用窗口函數需要注意什么?

窗?函數的執?順序是在FROM,JOIN,WHERE, GROUP BY,HAVING之后的

所以如果這些語句,需要用到窗口函數作為條件,需要在窗口函數外面套?層查詢。

26、維護數據庫的完整性和一致性,你喜歡用觸發器還是自寫業務邏輯?為什么?

首先考慮使用約束,效率最高也最方便,如check,主鍵,外鍵,非空字段等。

其次使用觸發器,這種方法可以保證,無論什么業務系統訪問數據庫都可以保證數據的完整新和一致性。

最后考慮自寫業務邏輯,但這樣會使編程復雜,效率低下。

選擇題和問答題都更新完了,有不完善的地方可以留言我們一起探討~

三、實戰題

實戰題包括次日留存率、列轉行、窗口函數等,這些大廠幾乎必考的問題。

篇幅比較長,放在下面這兩篇里面了,給大家整理了詳細的獨家解析~

太燒腦了!6道SQL大廠春招真題

吐血整理!2022年SQL大廠高頻實戰面試題

歡迎分享轉載→http://www.avcorse.com/read-215335.html

Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖