數(shù)據(jù)庫SQL實戰(zhàn)|SQL答案集合及解析(41-50)

牛客數(shù)據(jù)庫SQL實戰(zhàn)題(41-50題)

41帝蒿、構造一個觸發(fā)器audit_log

構造一個觸發(fā)器audit_log荐糜,在向employees_test表中插入一條數(shù)據(jù)的時候,觸發(fā)插入相關的數(shù)據(jù)到audit中。

CREATE TABLE employees_test(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);

CREATE TABLE audit(
EMP_no INT NOT NULL,
NAME TEXT NOT NULL
);

答案

create trigger audit_log after insert on employees_test
begin
insert into audit values(new.id, new.name);
end;

參考:疟┦希客討論區(qū)
構造觸發(fā)器時注意以下幾點:
1)用 CREATE TRIGGER 語句構造觸發(fā)器延塑,用 BEFORE或AFTER 來指定在執(zhí)行后面的SQL語句之前或之后來觸發(fā)TRIGGER。
2)觸發(fā)器執(zhí)行的內容寫出 BEGIN與END 之間答渔。
3)可以使用 NEW與OLD 關鍵字訪問觸發(fā)后或觸發(fā)前的employees_test表單記錄关带。

42、刪除emp_no重復的記錄沼撕,只保留最小的id對應的記錄宋雏。

CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

答案

delete from titles_test 
where emp_no not in (select min(id) from titles_test group by emp_no)

43、將所有to_date為9999-01-01的全部更新為NULL

將所有to_date為9999-01-01的全部更新為NULL,且 from_date更新為2001-01-01务豺。

CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

答案

update titles_test 
set to_date=null, from_date='2001-01-01'
where to_date='9999-01-01'

update后面不用加table關鍵字磨总,修改的兩列用逗號鏈接,而不是and笼沥。

44蚪燕、將id=5以及emp_no=10001的行數(shù)據(jù)替換成id=5以及emp_no=10005

其他數(shù)據(jù)保持不變,使用replace實現(xiàn)奔浅。

CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

答案

update titles_test
set emp_no=replace(emp_no, 10001, 10005)
where id=5

運用REPLACE(X,Y,Z)函數(shù)馆纳。其中X是要處理的字符串,Y是X中將要被替換的字符串汹桦,Z是用來替換Y的字符串鲁驶,最終返回替換后的字符串。

45营勤、將titles_test表名修改為titles_2017

CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

答案

alter table titles_test rename to titles_2017

mysql中不用寫to

46灵嫌、在audit表上創(chuàng)建外鍵約束壹罚,其emp_no對應employees_test表的主鍵id

CREATE TABLE employees_test(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);

CREATE TABLE audit(
EMP_no INT NOT NULL,
create_date datetime NOT NULL
);

答案

drop table audit;
create table audit(
    emp_no int not null,
    create_date datetime not null,
    foreign key(emp_no) references employees_test(id));

這一題判斷代碼的程序有問題葛作,中間的字段前面必須4個空格,并且最后的);提頭寫到新行會判錯猖凛。
再就是SQLite中不能通過 ALTER TABLE ... ADD FOREIGN KEY ... REFERENCES ... 語句來對已創(chuàng)建好的字段創(chuàng)建外鍵赂蠢,因此只能先刪除表,再重新建表的過程中創(chuàng)建外鍵辨泳。
mysql使用ALTER添加外鍵的語句表達式為:ALTER TABLE tablename ADD FOREIGN KEY...REFERENCES...虱岂。而在這里不能使用alter來添加外鍵,因此就只能先刪除表菠红,然后再建立該表第岖,在表中直接進行外鍵約束。
alter table my_tab1 add [constraint 外鍵名] foreign key(外鍵字段名) references mytab2(主鍵字段名);

47试溯、如何獲取emp_v和employees有相同的數(shù)據(jù)

存在如下的視圖:

create view emp_v as select * from employees where emp_no >10005;

如何獲取emp_v和employees有相同的數(shù)據(jù)蔑滓?

CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));

答案

其實這題,emp_v本來就是從employees導出的視圖,要獲取他們相同的數(shù)據(jù)键袱,直接select * from emp_v就好燎窘。
用where:

select v.*
from emp_v as v, employees as em
where v.emp_no=em.emp_no

select v.*或者select em.*都可以,但是不能直接select *蹄咖,否則會得到兩張表中符合條件的重復記錄褐健。
用intersect求交集的方法:

select *
from emp_v
intersect
select *
from employees

兩表位置可以調換。

48澜汤、將所有獲取獎金的員工當前的薪水增加10%

create table emp_bonus(
emp_no int not null,
recevied datetime not null,
btype smallint not null);

CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL, 
PRIMARY KEY (emp_no,from_date));

答案

update salaries
set salary=salary*1.1
where emp_no in (select sa.emp_no
                 from salaries as sa 
                 inner join emp_bonus as bo
                 on sa.emp_no=bo.emp_no 
                 where sa.to_date='9999-01-01')

49蚜迅、針對庫中的所有表生成select count(*)對應的SQL語句

輸出格式為:

cnts
select count(*) from employees;
select count(*) from departmens;
select count(*) from dept_emp;
select count(*) from dept_manager;
select count(*) from salaries;
select count(*) from titles;

這題的意思是要獲取所有表的名字,然后輸出上面的表格银亲,一張表一行慢叨。
參考:牛客討論區(qū)
在 SQLite 系統(tǒng)表 sqlite_master 中可以獲得所有表的索引务蝠,其中字段 name 是所有表的名字拍谐,而且對于自己創(chuàng)建的表而言,字段 type 永遠是 'table'馏段。
然后在 SQLite 中用 “||” 符號連接字符串轩拨。

答案

select "select count(*) from "|| name ||";" as cnts
from sqlite_master
where type='table'

在mysql中獲取所有表名的語句為:

select table_name from information_schema.tables where table_schema='shop';

其中shop為數(shù)據(jù)庫名字。
mysql中合并字段用concat()
所以mysql版本答案為:

create table hi as 
select table_name from information_schema.tables where table_schema='shop';

select * from hi;

select concat('select count(*) from', ' ', TABLE_NAME, ';') as cnts from hi;

或將上述兩個步驟合并為一條語句為:

select concat('select count(*) from', ' ', TABLE_NAME, ';') as cnts
 from (select table_name from information_schema.tables where table_schema='shop') as hi;

50院喜、將employees表中的所有員工的last_name和first_name通過(')連接起來

CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));

答案

select last_name||"'"||first_name
from employees;

結尾

如果您發(fā)現(xiàn)我的文章有任何錯誤亡蓉,或對我的文章有什么好的建議,請聯(lián)系我喷舀!如果您喜歡我的文章砍濒,請點喜歡~*我是藍白絳,感謝你的閱讀硫麻!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末爸邢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拿愧,更是在濱河造成了極大的恐慌杠河,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浇辜,死亡現(xiàn)場離奇詭異券敌,居然都是意外死亡,警方通過查閱死者的電腦和手機柳洋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門待诅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人熊镣,你說我怎么就攤上這事卑雁×⒂桑” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵序厉,是天一觀的道長锐膜。 經常有香客問我,道長弛房,這世上最難降的妖魔是什么道盏? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮文捶,結果婚禮上荷逞,老公的妹妹穿的比我還像新娘。我一直安慰自己粹排,他們只是感情好种远,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顽耳,像睡著了一般坠敷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上射富,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天膝迎,我揣著相機與錄音,去河邊找鬼胰耗。 笑死限次,一個胖子當著我的面吹牛,可吹牛的內容都是我干的柴灯。 我是一名探鬼主播卖漫,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赠群!你這毒婦竟也來了羊始?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤乎串,失蹤者是張志新(化名)和其女友劉穎店枣,沒想到半個月后速警,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叹誉,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年闷旧,在試婚紗的時候發(fā)現(xiàn)自己被綠了长豁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡忙灼,死狀恐怖匠襟,靈堂內的尸體忽然破棺而出钝侠,到底是詐尸還是另有隱情,我是刑警寧澤酸舍,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布帅韧,位于F島的核電站,受9級特大地震影響啃勉,放射性物質發(fā)生泄漏忽舟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一淮阐、第九天 我趴在偏房一處隱蔽的房頂上張望叮阅。 院中可真熱鬧,春花似錦泣特、人聲如沸浩姥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勒叠。三九已至,卻和暖如春膏孟,著一層夾襖步出監(jiān)牢的瞬間缴饭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工骆莹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颗搂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓幕垦,卻偏偏與公主長得像丢氢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子先改,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容