1. 程式人生 > >資料庫SQL實戰:MySql練習(下)

資料庫SQL實戰:MySql練習(下)

文章目錄

31. 獲取select * from employees對應的執行計劃

  • sql語句
explain select * from employees;

在 SQLite 語句之前,可以使用 “EXPLAIN” 關鍵字或 “EXPLAIN QUERY PLAN” 短語,用於描述表的細節。
explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。 使用方法,在select語句前加上explain就可以了。
參考:https://www.cnblogs.com/yycc/p/7338894.html

32. 將employees表的所有員工的last_name和first_name拼接起來作為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`));
  • sql語句
SELECT last_name||" "||first_name AS Name FROM employees

不同資料庫連線字串的方法不完全相同,MySQL、SQL Server、Oracle等資料庫支援CONCAT方法,而本題所用的SQLite資料庫只支援用連線符號"||"來連線字串。
https://blog.csdn.net/u012260238/article/details/70245452

33. 建立一個actor表,包含如下列資訊

列表 型別 是否為NULL 含義
actor_id smallint(5) not null 主鍵id
first_name varchar(45) not null 名字
last_name varchar(45) not null 姓氏
last_update timestamp not null 最後更新時間,預設是系統的當前時間
  • sql語句
create table actor( 
    actor_id smallint(5) primary key NOT null, 
    first_name varchar(45) not null, 
    last_name varchar(45) not null, 
    last_update timestamp not null default (datetime('now','localtime')) 
);

使用預設值為系統時間default (datetime(‘now’,‘localtime’))
34. 對於表actor批量插入如下資料

CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))
actor_id 	first_name 	last_name 	last_update 
1 	PENELOPE 	GUINESS 	2006-02-15 12:34:33 
2 	NICK 	WAHLBERG 	2006-02-15 12:34:33 
  • sql語句
insert into actor values (1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'),
                         (2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33');

35. 對於表actor批量插入如下資料,如果資料已經存在,請忽略,不使用replace操作

CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))
actor_id 	first_name 	last_name 	last_update 
'3' 	'ED' 	'CHASE' 	'2006-02-15 12:34:33' 
  • SQLite3
insert or ignore into actor values(3,'ED','CHASE','2006-02-15 12:34:33');
  • MySQL
insert ignore into actor values(3,'ED','CHASE','2006-02-15 12:34:33');

36. 對於如下表actor,其對應的資料為:

actor_id first_name last_name last_update
1 PENELOPE GUINESS 2006-02-15 12:34:33
2 NICK WAHLBERG 2006-02-15 12:34:33

建立一個actor_name表,將actor表中的所有first_name以及last_name匯入該表。 actor_name表結構如下:

列表 型別 是否為NULL 含義
first_name varchar(45) not null 名字
last_name varchar(45) not null 姓氏
create table actor_name
(
first_name varchar(45) not null,
last_name varchar(45) not null
);
  • sql語句
insert into actor_name select first_name, last_name from actor;

37. 針對如下表actor結構建立索引:

CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))

對first_name建立唯一索引uniq_idx_firstname,對last_name建立普通索引idx_lastname。

  • sql語句
create unique index uniq_idx_firstname on actor(first_name);
create index idx_lastname on actor(last_name);

給指定表或者檢視的某列新增索引使用語句:
create [unique/…] index indexName on tableName(colName)

38. 針對actor表建立檢視actor_name_view,只包含first_name以及last_name兩列,並對這兩列重新命名,first_name為first_name_v,last_name修改為last_name_v:

CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))
  • sql語句
create view actor_name_view as
select first_name first_name_v, last_name last_name_v
from actor;

注意 create view … as … 的 as是建立檢視語法中的一部分,不可省略。

39. 針對salaries表emp_no欄位建立索引idx_emp_no,查詢emp_no為10005, 使用強制索引

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`));
create index idx_emp_no on salaries(emp_no);
  • SQLite
select * from salaries indexed by idx_emp_no where emp_no = 10005;
  • MySQL
select * from salaries force index idx_emp_no where emp_no = 10005;

40. 現在在last_update後面新增加一列名字為create_date, 型別為datetime, NOT NULL,預設值為’0000 00:00:00’

CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')));

現在在last_update後面新增加一列名字為create_date, 型別為datetime, NOT NULL,預設值為’0000 00:00:00’

  • sql語句
alter table actor add create_date datetime not null default '0000-00-00 00:00:00';

用alter table … add …語句可以向已存在的表插入新欄位,並且能夠與建立表時一樣,在欄位名和資料型別後加入not null、default等限定。

41. 構造一個觸發器audit_log,在向employees_test表中插入一條資料的時候,觸發插入相關的資料到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
);
  • sql語句
create trigger audit_log after insert on employees_test
begin
    insert into audit values(new.id,new.name);
end;

構造觸發器時注意以下幾點:
1.建立觸發器使用語句:create trigger triggername;
2.指定觸發器觸發的事件在執行某操作之前還是之後,使用語句:before/after [insert/update/add] on tablename;
3.觸發器觸發的事件寫在begin和end之間;
4.觸發器中可以通過new獲得觸發事件之後2對應的tablename的相關列的值,old獲得觸發事件之前的2對應的tablename的相關列的值。

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);

insert into titles_test values ('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');
  • sql語句
delete from titles_test 
where id
not in (select min(id) from titles_test group by emp_no);

本題思路如下:
先用 group by 和 min() 選出每個 emp_no 分組中最小的 id,然後用 delete from … where … not in … 語句刪除 “非每個分組最小id對應的所有記錄”。

43. 將所有to_date為9999-01-01的全部更新為NULL,且 from_date更新為2001-01-01

  • sql語句
update titles_test 
set to_date = NULL, from_date = '2001-01-01' 
where to_date = '9999-01-01';

更新若干列:
update表名 set 列名 = 新值 where 列名 = 某值;
注意:若干列 to_date = NULL 和 from_date = ‘2001-01-01’ 之間只能用逗號連線,切勿用 and 連線。

44. 將id=5以及emp_no=10001的行資料替換成id=5以及emp_no=10005,其他資料保持不變,使用replace實現

  • sql語句
replace into titles_test 
values (5, 10005, 'Senior Engineer', '1986-06-26', '9999-01-01');
update titles_test set emp_no = replace(emp_no,10001,10005) where id = 5;

本題運用 replace有兩種解法:
方法一:全欄位更新替換。由於 replace的新記錄中 id=5,與表中的主鍵 id=5 衝突,故會替換掉表中 id=5 的記錄,否則會插入一條新記錄(例如新插入的記錄 id = 10)。並且要將所有欄位的值寫出,否則將置為空。
方法二:運用replace (X,Y,Z)函式。其中X是要處理的字串,Y是X中將要被替換的字串,Z是用來替換Y的字串,最終返回替換後的字串。以下語句用 update和replace配合完成,用REPLACE函式替換後的新值複製給 id=5 的 emp_no。replace的引數為整型時也可通過。

45. 將titles_test表名修改為titles_2017

  • sql語句

alter table titles_test rename to titles_2017;

46. 在audit表上建立外來鍵約束,其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
);
  • sql語句
CREATE TABLE audit(
emp_no INT NOT NULL,
create_date datetime NOT NULL,
foreign key(emp_no) references employees_test(id);
);

注:SQLite中不能通過 alter table … add foreign key … references … 語句來對已建立好的欄位建立外來鍵。
SQL foreign key約束:
http://www.w3school.com.cn/sql/sql_foreignkey.asp

47. 存在如下的檢視:

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

如何獲取emp_v和employees有相同的資料?

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_no birth_date first_name last_name gender hire_date
10006 1953-04-20 Anneke Preusig F 1989-06-02
10007 1957-05-23 Tzvetan Zielinski F 1989-02-10
10008 1958-02-19 Saniya Kalloufi M 1994-09-15
10009 1952-04-19 Sumant Peac F 1985-02-18
10010 1963-06-01 Duangkaew Piveteau F 1989-08-24
  • sql語句
select * from emp_v;
select em.* from employees em, emp_v ev where em.emp_no = ev.emp_vo;
select * from employees intersect select * from emp_v;

方法一:利用檢視的定義。emp_v的全部記錄均由 employees 匯出,因此直接輸出 emp_v 所有記錄。
方法二:用 where選取二者 emp_no 相等的記錄。由於檢視 emp_v 的記錄是從 employees 中匯出的,所以要判斷兩者中相等的資料,只需要判斷emp_no相等即可。
方法三:用 intersect關鍵字求 employees 和 emp_v 的交集。

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`));
  • sql語句
update salaries 
set salary = salary * 1.1 
where emp_no 
in (select s.emp_no 
   from salaries s 
   join emp_bonus eb 
   on s.emp_no = eb.emp_no 
   and s.to_date = '9999-01-01');

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

輸出格式:

cnts
select count(*) from employees;
select count(*) from departments;
select count(*) from dept_emp;
select count(*) from dept_manager;
select count(*) from salaries;
select count(*) from titles;
  • sql語句
select "select count(*) from " || name || ";"  cnts
from sqlite_master 
where type = 'table';

本題主要有以下兩個關鍵點:
1、SQLite資料庫中一個特殊的名叫 sqlite_master 上執行一個select查詢以獲得所有表的索引。每一個 SQLite 資料庫都有一個叫sqlite_master的表, 它定義資料庫的模式。
對於表來說,type 欄位永遠是 ‘table’,name 欄位永遠是表的名字。
2、在 SQLite 中用 “||” 符號連線字串。

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`));

輸出格式:

name
Facello’Georgi
Simmel’Bezalel
Bamford’Parto
Koblick’Chirstian
Maliniak’Kyoichi
Preusig’Anneke
  • sql語句
select last_name || "'" || first_name name
from employees;

51. 查詢字串’10,A,B’ 中逗號’,'出現的次數cnt

  • sql語句
select (length("10,A,B")-length(replace("10,A,B",",","")))/length(",") cnt

使用length()函式與replace()函式的結合靈活地解決了統計子串出現次數的問題,屬於技巧題,即先用replace函式將原串中出現的子串用空串替換,再用原串長度減去替換後字串的長度,最後除以子串的長度(本題中此步可省略,若子串長度大於1則不可省)。

52. 獲取Employees中的first_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`));

輸出格式:

first_name
Chirstian
Tzvetan
Bezalel
Duangkaew
Georgi
Kyoichi
Anneke
Sumant
Mary
Parto
  • sql語句
select first_name 
from employees 
order by substr(first_name,length(first_name)-1);

本題考查 substr(X,Y,Z) 或 substr(X,Y) 函式的使用。其中X是要擷取的字串。Y是字串的起始位置(注意第一個字元的位置為1,而不為0),取值範圍是±(1~length(X)),當Y等於length(X)時,則擷取最後一個字元;當Y等於負整數-n時,則從倒數第n個字元處擷取。Z是要擷取字串的長度,取值範圍是正整數,若Z省略,則從Y處一直擷取到字串末尾;若Z大於剩下的字串長度,也是擷取到字串末尾為止。

53. 按照dept_no進行彙總,屬於同一個部門的emp_no按照逗號進行連線,結果給出dept_no以及連接出的結果employees

CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));

輸出格式:

dept_no employees
d001 10001,10002
d002 10006
d003
d004 10003,10004
d005 10007,10008,10010
  • SQLite
select dept_no, group_concat(emp_no) employees
from dept_emp
group by dept_no;
  • MySQL
select dept_no,group_concat(emp_no SEPARATOR ',') employees
from dept_emp 
group by dept_no;

本題要用到SQLite的聚合函式group_concat(X,Y),其中X是要連線的欄位,Y是連線時用的符號,可省略,預設為逗號。此函式必須與 GROUP BY 配合使用。

54. 查詢排除當前最大、最小salary之後的員工的平均工資avg_salary

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`));

輸出格式:

avg_salary
69462.5555555556
  • sql語句
select avg(salary) avg_salary 
from salaries 
where to_date = '9999-01-01' 
and salary not in (select max(salary) from salaries)
and salary not in (select min(salary) from salaries);

55. 分頁查詢employees表,每5行一頁,返回第2頁的資料

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 
            
           

相關推薦

資料庫SQL實戰MySql練習

文章目錄 31. 獲取select * from employees對應的執行計劃 32. 將employees表的所有員工的last_name和first_name拼接起來作為Name,中間以一個空格區分 33. 建立一個actor表,包含如

資料庫SQL實戰MySql練習

文章目錄 1. 查詢最晚入職員工的所有資訊 2. 查詢入職員工時間排名倒數第三的員工所有資訊 3. 查詢各個部門當前(to_date='9999-01-01')領導當前薪水詳情以及其對應部門編號dept_no 4. 查詢所有已經分配部門

SQL作業綜合練習的返評

庫文件 spl val 查找 括號 冰箱 HR 題目 tar 一:作業題目:綜合練習(二) 二:題目要求: 1、創建數據庫CPXS,保存於E盤根目錄下以自己學號+姓第一個字母(阿拉伯數字+大寫字母)方式創建的文件夾中,初始大小5MB,最大20MB,以10%方式增長,日誌文件

OPEN(SAP) UI5 學習入門系列之二 最佳實踐練習

可以先把程式碼下載到本地並跑起來,這樣可以對這個最佳實踐的程式有一個直觀的瞭解。 頁面導航如下:  銷售訂單列表(Master) -> 銷售訂單明細(Detail) -> 行專案明細(LineItem),在每個明細頁面都可以返回到上一層。 具體頁面之間的導航是如何實現的呢?  我們從頁面的入口 

mysql======練習1

char sel ddr cte 考試科目 unique sco score select mysql 練習題***創建student表mysql> create table student ( -> id int(10) not null unique

網站搭建筆記精簡版---廖雪峰WebApp實戰-Day10:使用者登陸筆記

這裡的登陸頁面轉換花了好長時間。 網頁登陸完整日誌分析(重要) 此處講述了具體signin.html的javascrip部分如何進行相應,寫出了相關函式的呼叫順序。花了好長時間理清楚思路。已調通的具體程式碼參考該網頁。或參考之前的博文。 Signin.html GET ‘/sig

網路基本功細說路由 網路基本功細說路由

網路基本功(五):細說路由(下)   轉載請在文首保留原文出處:EMC中文支援論壇https://community.emc.com/go/chinese      介紹  

1026二分查詢

目錄 一、四種常見的二分查詢變形問題 二、程式碼實現 三、適用性分析 四、思考 一、四種常見的二分查詢變形問題 1.查詢第一個值等於給定值的元素 2.查詢最後一個值等於給定值的元素 3.查詢第一個大於等於給定值的元素 4.查詢最後一個小於等於給定值的元素

第九講產生式模型NaiveBayes, HMM

目錄 1 引言 2 隱馬爾科夫模型(HMM) 2.1 模型介紹 2.2 HMM概率計算問題及其求解演算法 2.3 預測與學習 2.4 HMM與動態系統 3 小結 參考文獻   1 引言   上一講已經提到生成式模型中的樸素貝葉斯演算

matlab第八課影象分析

目標: 影象閾值 背景評估 聯通區域標記 一、影象閾值 graythresh():找出一個影象的最佳閾值是什麼 im2bw():轉變影象為二值影象 I = imread('rice.png'); level=graythresh(I); % 獲

【TeeChart Pro ActiveX教程】使用函式

下載TeeChart Pro ActiveX最新版本 在上一篇文章中,我們介紹到了在Teechart Pro ActiveX中的功能特點和新增功能,今天我們接著講定義資料來源、功能期間和週期樣式 (一)定義資料來源 上一節中的示例重點介紹如何使用Datasource通過程式碼填充Function.S

CS231n課程筆記最優化筆記

原文連結:https://zhuanlan.zhihu.com/p/21387326?refer=intelligentunit 內容列表: 簡介 損失函式視覺化 最優化 策略#1:隨機搜尋 策略#2:隨機區域性搜尋 策略#3:跟隨梯度

9.spring事務管理:宣告式事務管理

宣告式事務管理  sprin的宣告式事務是管理AOP技術實現的事務管理,其本質是是對方法前後進行攔截,然後 在目標方法開始之前建立或者加入一個事務,在執行完成目標方法之後根據執行情況提交或者回滾事務。   宣告式事務管理優點:不需要通過程式設計的方式管理事務,因而不需要在業務邏輯程

Qtum量子鏈研究院閃電網路

Qtum量子鏈研究院:Mia Qtum量子鏈研究院即日起將會定期進行技術課程,每期一個主題,在這裡我們用最專業的視角解讀當下區塊鏈技術熱點話題。第一期的主題:閃電網路,早在2017年11月Qtum便先一步引入閃電網路,詳情見《基於Qtum量子鏈的閃電網路功能簡介

MySQL高可用方案之DRBD+MySQL+RHCS

續:MySQL高可用方案之DRBD+MySQL+RHCS(上) 五、MySQL5.6.42安裝 安裝步驟(兩臺機器都要安裝) [[email protected] ~]# cd /opt/ [[email protected] opt]# ls mysql-5.6.42-linux

1105散列表

目錄 帶著問題去學習 一、為什麼散列表和連結串列經常放在一起使用? 二、散列表和連結串列如何組合起來使用? 1.LRU(Least Recently Used)快取淘汰演算法 1.1.LRU快取淘汰演算法主要操作有哪些?主要包含3個操作: 1.2.如何用連結串列實現LRU

組合語言編寫子程式課程設計1

題目: 彙編程式碼: assume cs:codesg data segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','

函式程式設計實驗四列表練習2

{- 吳坎 17341163 [email protected] 資料科學與計算機學院計算機專業 -} {- 稱一個三元組(x,y,z)是畢達哥拉斯三元組,如果x*x + y*y == z*

資料庫學習筆記和小練習14函式

函式分為系統函式和自定義函式。 一、系統函式 1 文字處理函式 select lower(Sdept) as Sdept_lower from student order by Sdept; 常用舉例: lower() 函式將文字轉化為小寫。 upper()  -> 

Go遊戲伺服器開發的一些思考綜合考察

(接下來的內容,大部分都是純邏輯問題,與語言沒有多大關係。Go語言的作用就是利用它的語言特性,提供介面來應對變化) 世界場景搭建 Cell伺服器 拆出Cell服務,是業內公認的。MMO RP