今日頭條—抖音部門測試開發工程師數據庫面試題
Class表
Book表
--練習
--創建class表(code編碼,name名稱,model班型,book_code教材編碼,state編碼)
create table Class(Code char(20) not null,Name char(40) not null,Model char(40),Book_code char(10) not null,State char(10)
not null,Price char(10) not null)
insert into class values('PX201705001','初一地理強化','精品班','009','1','1180')
insert into class values('PX201705002','初一語文強化','精品班','007','0','1180')
insert into class values('PX201705003','初一數學強化','精品班','006','1','980')
insert into class values('PX201705004','初一英語強化','精品班','003','1','780')
insert into class values('0120176001','張曉明','一對一','','1','15000')
--創建教材表(code編碼,name名稱,suject科目,ver教材版本,desc教材描述)
? create table Book(Code char(20) not null,Name char(40) not null,Subject char(40) not null,Ver char(10) not null,desc char(10)
not null)
? insert into book values('001','新概念1冊','英語','1','你試試? ')
insert into book values('002','新概念2冊','英語','2','你試試?<')
insert into book values('003','新概念3冊','英語','3','你試試?>')
insert into book values('004','新
練習題
Class表
Book表
--練習
--創建class表(code編碼,name名稱,model班型,book_code教材編碼,state編碼)
create table Class(Code char(20) not null,Name char(40) not null,Model char(40),Book_code char(10) not null,State char(10)
not null,Price char(10) not null)
insert into class values('PX201705001','初一地理強化','精品班','009','1','1180')
insert into class values('PX201705002','初一語文強化','精品班','007','0','1180')
insert into class values('PX201705003','初一數學強化','精品班','006','1','980')
insert into class values('PX201705004','初一英語強化','精品班','003','1','780')
insert into class values('0120176001','張曉明','一對一','','1','15000')
--創建教材表(code編碼,name名稱,suject科目,ver教材版本,desc教材描述)
? create table Book(Code char(20) not null,Name char(40) not null,Subject char(40) not null,Ver char(10) not null,desc char(10)
not null)
? insert into book values('001','新概念1冊','英語','1','你試試? ')
insert into book values('002','新概念2冊','英語','2','你試試?<')
insert into book values('003','新概念3冊','英語','3','你試試?>')
insert into book values('004','新概念4冊','英語','4','你試試?"')
insert into book values('005','新概念5冊','英語','5','你試試? ;我會的!')
insert into book values('006','初一數學人教版1冊','數學','1','你試試? ;哈飛')
insert into book values('007','初一語文人教版1冊','語文','1','你試試?我會的!')
insert into book values('008','初一語文人教版2冊','語文','2','你試“哈飛”?')
insert into book values('009','初一地理人教版1冊','地理','1','你試試<;樸新>?')
insert into book values('010','初一生物人教版1冊','生物','1','你試試<;樸新>;?')
--1 請用1個sql獲取教材科目(subject)都有幾科(要求不重復)?
--考察關鍵字distinct
select distinct subject from book
--2 請用1個sql統計每個科目(subject)的教材共多少本?
--考察分組group by
select subject,count(*) as sum_sujects from book group by subject
--3 請用1個sql獲取有超過3本教材的科目和教材數量?
--考察過濾分組having
select subject,count(*) as sum_subject from book group by subject having count(*) >3
--4 請用1個sql查詢出班級表中所有班級信息和每個班級對應的教材名稱是什么?
--考察內聯結/自然聯結innor join
select class.*,book.name from class inner join book on class.book_code = book.code
select c.*,b.name from class as c,book as b where c.book_code = b.code
--加:請用1個sql查詢出班級表中所有班級信息和每個班級對應的教材名稱是什么?還要沒有教材版本的班級信息
--考察外聯結outer join? 不支持right outer join和full outer join;left outer join 表示從from子句中左邊的表(class表)中選擇所有行
select class.*,book.name from class left outer join book on class.book_code = book.code
--5 請用1個sql語句獲取班級類型(Model)為“精品班”且“教材的版本”為第一版的“有效”班級總價格是多少?
--考察and sum() 表別名
select c.code,c.model,c.book_code,c.state,b.code,b.ver,sum(c.price) as sum_price from class as c,book as b where c.model = '精品班' and c.book_code = b.code and b.ver = '1' and c.state = '1'
--6 請用一個sql把第4題目中班級對應教材為空的班級教材更新關聯成“初一生物人教版1冊”教材
select class.*, book.name from class left outer join book on class.book_code = book.code -- 第四題
--“初一生物人教版1冊”對應book_code = 010,更新之前為空的class表里的book_code為010就行
update class set book_code = '010' where code = '0120176001'
--7 請用一個sql把班級表的price字段進行擴容,改成varchar(20),原本是char(10)
alter table class modify column price varchar(20);
如果是int類型:alter table class modify column price int(20);
8 請用1個sql語句獲取描述desc中包含html轉義字符的記錄(例如: ;<:等)
select * from book where desc like ‘%&%’
轉義字符串的組成
轉義字符串(Escape Sequence),即字符實體(Character Entity)分成三部分:第一部分是一個&符號,英文叫ampersand;第二部分是實體(Entity)名字或者是#加上實體(Entity)編號;第三部分是一個分號。
轉義字符串(Escape Sequence)也稱字符實體(Character Entity)。在HTML中,定義轉義字符串的原因有兩個:第一個原因是像“<”和“>”這類符號已經用來表示HTML標簽,因此就不能直 接當作文本中的符號來使用。為了在HTML文檔中使用這些符號,就需要定義它的轉義字符串。當解釋程序遇到這類字符串時就把它解釋為真實的字符。在輸入轉 義字符串時,要嚴格遵守字母大小寫的規則。第二個原因是,有些字符在ASCII字符集中沒有定義,因此需要使用轉義字符串來表示。
9 請用一個sql語句獲取描述desc中包含三個英文字母連寫記錄
如果是oracle庫,可以用sql:
select * from book where REGEXP_LIKE(desc,'[[:alpha:]]{3}')
正則:
https://www.cnblogs.com/q1104460935/p/7991321.html
如果是mysql庫,可以用sql:但是沒搜出正確答案來
select * from book where desc like '%[a-z][a-z][a-z]%'
10 如果教材數據很多,執行上述查詢速度不是很理想,請說出你對數據庫表(或java代碼方面)的優化建議
這張表可以拆分,拆分成兩張表,書籍詳細信息表,書籍類型表。兩張表都建索引,這樣查詢就快了
1)、在數據庫設計方面:
(1)建立索引;
(2)分區(MySQL,比如按時間分區);
(3)盡量使用固定長度的字段;
(4)限制字段長度;
2)、在數據庫I/O方面:
(1)增加緩沖區;
(2)如果涉及表的級聯,不同的表存儲在不同的磁盤上,以增加I/O速度;
3)、在SQL語句方面:
(1)優化SQL語句,減少比較次數;
(2)限制返回的條目數(MySQL中用limit);
4)、在Java方面:
如果是反復使用的查詢,使用PrepaerdStatement減少查詢次數。
11 請寫出sql語言中truncate和Delect,Drop表操作命令的差別?
相同點:
1).truncate和不帶where子句的delete、以及drop都會刪除表內的數據。
2).drop、truncate都是DDL語句(數據定義語言),執行后會自動提交。
不同點:
1). truncate 和 delete 只刪除數據不刪除表的結構(定義) drop 語句將刪除表的結構被依賴的約束(constrain)、觸發器(trigger)、索引(index);依賴于該表的存儲過程/函數將保留,但是變為 invalid 狀態。
2). delete 語句是數據庫操作語言(dml),這個操作會放到 rollback segement 中,事務提交之后才生效;如果有相應的 trigger,執行的時候將被觸發。 truncate、drop 是數據庫定義語言(ddl),操作立即生效,原數據不放到 rollback segment 中,不能回滾,操作不觸發 trigger。
3).delete 語句不影響表所占用的 extent,高水線(high watermark)保持原位置不動 drop 語句將表所占用的空間全部釋放。 truncate 語句缺省情況下見空間釋放到 minextents個 extent,除非使用reuse storage;truncate 會將高水線復位(回到最開始)。
4).速度,一般來說: drop> truncate > delete
5).安全性:小心使用 drop 和 truncate,尤其沒有備份的時候.否則哭都來不及 使用上,想刪除部分數據行用 delete,注意帶上where子句. 回滾段要足夠大. 想刪除表,當然用 drop 想保留表而將所有數據刪除,如果和事務無關,用truncate即可。如果和事務有關,或者想觸發trigger,還是用delete。 如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新導入/插入數據。 6).delete是DML語句,不會自動提交。drop/truncate都是DDL語句,執行后會自動提交。
7)、TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日志資源少。DELETE 語句每次刪除一行,并在事務日志中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,并且只在事務日志中記錄頁的釋放。
8)、TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 DELETE。如果要刪除表定義及其數據,請使用 DROP TABLE 語句。 9)、對于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由于 TRUNCATE TABLE 不記錄在日志中,所以它不能激活觸發器。 10)、TRUNCATE TABLE 不能用于參與了索引視圖的表