【T-SQL基礎】01.單表查詢-幾道sql查詢題
概述:
本系列【T-SQL基礎】主要是針對T-SQL基礎的總結。
【T-SQL基礎】06.透視、逆透視、分組集
【T-SQL基礎】07.資料修改
【T-SQL基礎】09.可程式設計物件
----------------------------------------------------------
----------------------------------------------------------
【T-SQL效能調優】02.Transaction Log的使用和效能問題
【T-SQL效能調優】03.執行計劃
【T-SQL效能調優】04.死鎖分析
持續更新......歡迎關注我!
本篇主要總結了常見的對單表查詢的SQL查詢題目。
首先我們必須瞭解SQL查詢的各字句在邏輯上按以下順序進行處理:
1.FROM
2.WHERE
3.Group BY
4.HAVING
5.SELECT
6.ORDER BY
在做下面的題目之前,我們可以先把環境準備好,以下的SQL指令碼可以幫助大家建立資料庫,建立表,插入資料。
題目:
1.返回2007年6月生成的訂單:
(30 row(s) affected)
本題考察的是過濾日期範圍
參考答案:
方案一:
如果要過濾日期範圍(比如,整年或正月),比較自然的方法就是使用YEAR和MONTH之類的函式。
SELECT orderid, orderdate, custid, empid FROM Sales.Orders WHERE YEAR(orderdate)= 2007 AND MONTH(orderdate)=6;
不過,應該小心的一點是:在大多數情況下,當對過濾條件中的列應用了一定的處理後,就不能以有效的方式來使用索引了。為了潛在地有效利用索引,就需要對為此進行調整,以便對過濾條件中的列不進行處理。
使用一個範圍過濾條件:
orderdate >= '20070601'
AND orderdate < '20070701'
方案二:
SELECT orderid, orderdate, custid, empid FROM Sales.Orders WHERE orderdate >= '20070601' AND orderdate < '20070701';
2.返回每個月的最後一天生成的訂單
涉及的表:Sales.Orders表
本題主要考察DATEADD和DATEDIFF的用法
DATEADD:
將指定 number 時間間隔(有符號整數)與指定 date 的指定 datepart 相加後,返回該 date。
1.語法
DATEADD (datepart , number , date ) |
2.引數:
datepart
datepart |
縮寫 |
year |
yy, yyyy |
quarter |
qq, q |
month |
mm, m |
dayofyear |
dy, y |
day |
dd, d |
week |
wk, ww |
weekday |
dw, w |
hour |
hh |
minute |
mi, n |
second |
ss, s |
millisecond |
ms |
microsecond |
mcs |
nanosecond |
ns |
number
是一個表示式,可以解析為與 date 的 datepart 相加的 int。使用者定義的變數是有效的。
如果您指定一個帶小數的值,則將小數截去且不進行舍入。
date
是一個表示式,可以解析為 time、date、smalldatetime、datetime、datetime2 或 datetimeoffset 值。date 可以是表示式、列表達式、使用者定義的變數或字串文字。如果表示式是字串文字,則它必須解析為一個 datetime 值。為避免不確定性,請使用四位數年份。有關兩位數年份的資訊,請參閱 two digit year cutoff 選項。
3.返回值
datepart 引數
dayofyear、day 和 weekday 返回相同的值。
每個 datepart 及其縮寫都返回相同的值。
如果 datepart 為 month 且 date 月份比返回月份的天數多,因而 date 中的日在返回月份中不存在,則返回返回月份的最後一天。例如,9 月份有 30 天;因此,下面兩個語句返回 2006-09-30 00:00:00.000:
SELECT DATEADD(month, 1, '2006-08-30')
SELECT DATEADD(month, 1, '2006-08-31')
number 引數
number 引數不能超出 int 的範圍。在下面的語句中,number 的引數超出 int 範圍 1。將返回如下錯誤訊息:“將表示式轉換為資料型別 int 時出現算術溢位錯誤。”
SELECT DATEADD(year,2147483648, '2006-07-31'); |
date 引數
date 引數不能增加至其資料範圍之外的值。在下面的語句中,與 date 值相加的 number 值超出了 date 資料型別的範圍。將返回如下錯誤訊息:“將值新增到 'datetime' 列導致溢位。”
SELECT
DATEADD(year,2147483647, '2006-07-31'); |
DATEDIFF:
返回指定的 startdate 和 enddate 之間所跨的指定 datepart 邊界的計數(帶符號的整數)。
語法:
DATEDIFF ( datepart , startdate , enddate ) |
引數
datepart
是指定所跨邊界型別的 startdate 和 enddate 的一部分。下表列出了所有有效的 datepart 引數。使用者定義的變數等效項是無效的。
datepart |
縮寫 |
year |
yy, yyyy |
quarter |
qq, q |
month |
mm, m |
dayofyear |
dy, y |
day |
dd, d |
week |
wk, ww |
hour |
hh |
minute |
mi, n |
second |
ss, s |
millisecond |
ms |
microsecond |
mcs |
nanosecond |
ns |
startdate
是一個表示式,可以解析為 time、date、smalldatetime、datetime、datetime2 或 datetimeoffset 值。date 可以是表示式、列表達式、使用者定義的變數或字串文字。從 enddate 減去 startdate。
為避免不確定性,請使用四位數年份。有關兩位數年份的資訊,請參閱two digit year cutoff 選項。
enddate
請參閱 startdate。
返回型別
int
返回值
每個 datepart 及其縮寫都返回相同的值。
如果返回值超出 int 的範圍(-2,147,483,648 到 +2,147,483,647),則會返回一個錯誤。對於 millisecond,startdate 與 enddate 之間的最大差值為 24 天 20 小時 31 分鐘 23.647 秒。對於 second,最大差值為 68 年。
如果為 startdate 和 enddate 都只指定了時間值,並且 datepart 不是時間 datepart,則會返回 0。
在計算返回值時不使用 startdate 或 endate 的時區偏移量部分。
由於 smalldatetime 僅精確到分鐘,因此將 smalldatetime 值用作 startdate 或 enddate 時,返回值中的秒和毫秒將始終設定為 0。
如果只為某個日期資料型別的變數指定時間值,則所缺日期部分的值將設定為預設值:1900-01-01。如果只為某個時間或日期資料型別的變數指定日期值,則所缺時間部分的值將設定為預設值:00:00:00。如果 startdate 和 enddate 中有一個只含時間部分,另一個只含日期部分,則所缺時間和日期部分將設定為各自的預設值。
如果 startdate 和 enddate 屬於不同的日期資料型別,並且其中一個的時間部分或秒小數部分精度比另一個高,則另一個的所缺部分將設定為 0。
參考答案:
方案一:
SELECT * FROM Sales.Orders WHERE MONTH(DATEADD(DAY,1,orderdate)) <> MONTH(orderdate)
方案二:
SELECT orderid, orderdate, custid, empid FROM Sales.Orders WHERE orderdate = DATEADD(month, DATEDIFF(month, '20051231', orderdate), '20051231');
得到每月的最後一天的日期:
DATEADD(month, DATEDIFF(month, '20051231', orderdate), '20051231')
3.返回姓氏(last name)中包含字母'a'兩次獲更多次的僱員
涉及的表:HR.Employees表
本題主要考察%(百分號)萬用字元的用法
百分號代表任意長度的字串,包括空字串。
參考答案:
SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname LIKE '%a%a%';
4.返回總價格(數量*單價)大於10000的所有訂單,並按總價格排序
涉及的表:Sales.OrderDetails表
參考答案:
SELECT orderid, SUM(unitprice*qty) AS totalValue FROM Sales.OrderDetails GROUP BY orderid HAVING SUM(unitprice*qty)>10000 ORDER BY totalValue desc;
5.返回2007年平均運費最高的發貨國家
涉及的表:Sales.Orders表
參考答案:
SELECT TOP(3) shipcountry, AVG(freight) AS avgfreight FROM Sales.Orders WHERE orderdate >= '20070101' AND orderdate < '20080101' GROUP BY shipcountry ORDER BY avgfreight DESC;
6.為每個顧客單獨根據訂單日期的順序(用order ID作為附加屬性)來計算其訂單的行號。
涉及的表:Sales.Orders表
(830 row(s) affected)
參考答案:
SELECT custid , orderdate , orderid , ROW_NUMBER() OVER ( PARTITION BY custid ORDER BY orderdate, orderid ) AS rownum FROM Sales.Orders ORDER BY custid , rownum;
7.構造一個SELECT語句,讓它根據每個僱員的友好稱謂,而返回其性別。對於'Ms.'和'Mrs',則返回Female:對於'Mr',則返回'Male';對於其他情況(例如,'Dr.',則返回'Unknown'。
涉及的表:HR.Employees表
1.搜尋格式的CASE表示式
SELECT empid , firstname , lastname , titleofcourtesy , CASE WHEN titleofcourtesy IN ( 'Ms.', 'Mrs.' ) THEN 'Female' WHEN titleofcourtesy = 'Mr.' THEN 'Male' ELSE 'Unknown' END AS gender FROM HR.Employees
2.簡單的CASE表示式格式
SELECT empid , firstname , lastname , titleofcourtesy , CASE titleofcourtesy WHEN 'Ms.' THEN 'Female' WHEN 'Mrs.' THEN 'Female' WHEN 'Mr.' THEN 'Male' ELSE 'Unknown' END AS gender; FROM HR.Employees
8.返回每個客戶的客戶ID和所在區域。對輸出中的行按區域排序,NULL值排在最後(在所有非NULL值之後)。
注意,T-SQL中NULL值的預設行為是把NULL值排在前面(所有非NULL值之前)。
涉及的表:Sales.Customers表。
參考答案:
SELECT custid , region FROM Sales.Customers ORDER BY CASE WHEN region IS NULL THEN 1 ELSE 0 END , region;
參考資料:
《SQL2008技術內幕:T-SQL語言基礎》
作 者:
出 處:http://www.cnblogs.com/jackson0714/
關於作者:專注於微軟平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
相關推薦
【T-SQL基礎】01.單表查詢-幾道sql查詢題
概述: 本系列【T-SQL基礎】主要是針對T-SQL基礎的總結。 【T-SQL基礎】06.透視、逆透視、分組集 【T-SQL基礎】07.資料修改 【T-SQL基礎】09.可程式設計物件 ------------------------------------------
Django 【第五篇】ORM單表增刪改查
contains 字典 exc 單表 pytho name屬性 作者 包括 刪除數據 一、添加表記錄 對於單表有兩種方式 # 添加數據的兩種方式 # 方式一:實例化對象就是一條表記錄 Frank_obj = models.Student(name ="海
【遊戲設計基礎】01-遊戲基礎知識
遊戲的定義 所謂遊戲,是指在一種虛擬環境下,由參與者按照規則行動,去實現至少一個既定的、帶有重要目標任務的娛樂性活動。 ps:竊以為該觀點缺乏一個重要因素:遊戲是自發的,但若加入該因素,該定義就顯得過於冗長。 遊戲的必備組成要素 可玩性、假想性、遊戲目標
SQL基礎語法的單表操作 select|insert|update|delete(增刪改查) 簡單使用
ati 否則 意思 ext 插入數據 基礎語法 結合 tinc style 1、select(查詢) select簡單的查詢分為兩種 註:字段也就是表結構中的列的名稱 第一種: select 字段名 from 表名 此種查詢只列出你所需要查詢的字段,要查詢多個字段以“
【軟體工程基礎】我對書中幾種軟體過程模型的特點以及優缺點的理解和總結
一、瀑布模型優點:簡單易用,將複雜的軟體開發過程明確分解為幾個順序的步驟,降低開發軟體的複雜性。嚴格,第一是每個步驟的嚴格,每個步驟都有明確的標準和技術審查,儘量減少每個步驟的錯誤,同時減少對下個階段的影響。第二是對文件的嚴格要求,每個階段都有各自的規格說明書。缺點:一次性:
【T-SQL基礎】03.子查詢
引用 鏈接 編程 pac tom 單表 獨立 但是 company 閱讀目錄 概述: 一、獨立子查詢 二、相關子查詢 三、練習題 以前總是追求新東西,發現基礎才是最重要的,今年主要的目標是精通SQL查詢和SQL性能優化。 本系列【T-SQL基礎】主要是針對T-S
【HTML基礎】表格和表單
天津 adding 文字 最小 words 常見 jpg checked 搜索引擎 本次博客的主要內容如下: meta和link 表格 表單 meta和link meta meta的屬性有兩種:name和http-equiv。 name屬性主要用於描述
【常用 JS 外掛】01 jQuery Validation 表單驗證外掛
表單驗證框架 jQuery Validation 前端表單驗證框架 頁面引用 <!-- jQuery Validation 1.14.0 --> <script src="/static/assets/plugins/jquery-valida
【常用 JS 外掛】01 jQuery Valdation 表單驗證外掛
表單驗證框架 jQuery Validation 前端表單驗證框架 頁面引用 <!-- jQuery Validation 1.14.0 --> <script src="/static/assets/plugins/jquery-valida
【T-SQL基礎】02.聯接查詢
概述: 本系列【T-SQL基礎】主要是針對T-SQL基礎的總結。 【T-SQL基礎】06.透視、逆透視、分組集 【T-SQL基礎】07.資料修改 【T-SQL基礎】09.可程式設計物件 ------------------------------------------
【WEB基礎】②js控制表單提交
1.document.forms.from.submit(); document.form.sumbit(); document.form.submit.click(); this.form.submit(); 以上幾種形式的js表單提交在firefox瀏覽器下是不起作用
【MYSQL筆記2】復制表,在已有表的基礎上設置主鍵,insert和replace
主鍵 insert 我們 key repl 圖片 prim 個數 insert語句 之前我自己建立好了一個數據庫xscj;表xs是已經定義好的 具體的定義數據類型如下: 為了復制表xs,我們新建一個表名為xstext,使用下列語句進行復制xs,或者說是備份都可以; c
【ajax技術學習】原生ajax表單使用者名稱驗證
<p></p><p></p> <%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8"%> <html> <head
【數理統計基礎】 05 - 回歸分析
關於 以及 區間估計 否則 del 相互 不同之處 最小二乘 研究 參數估計和假設檢驗是數理統計的兩個基礎問題,它們不光運用於常見的分布,還會出現在各種問題的討論中。本篇開始研究另一大類問題,就是討論多個隨機變量之間的關系。現實生活中的數據雜亂無章,夠挖掘出各種變量之間
【JAVAWEB學習筆記】01
顏色 col 文本 鏈接 target sel nbsp html標簽 劃線 案例一:網站信息顯示頁面1.什麽是HTML?(Hyper Text Markup Language:超文本標記語言)超文本:功能比普通文本更加強大標記語言:使用一組標簽對內容進行描述的一門語言(它
【項目基礎】容器、AOP理論篇
b2c 需求 mark 配置 mod 維護 term -s 強制 一、容器(砂鍋) 1、概念: 容器是應用server中位於組件和平臺之間的接口集合 2、應用: 容器一般位於應用server之內,由應用server負責載入
【ADO.NET基礎】加密方法經典集合
char 自定義 rst reac stream algorithm array temp esc 各種加密方法集錦: using System; using System.Security.Cryptography; using System.Text; using S
【數據結構】之順序表(Java語言描述)
arraylist 表數據 nbsp real 不同 1.5 根據 長度 tar 之前總結過使用C語言描述的順序表數據結構。在C語言類庫中沒有為我們提供順序表的數據結構,因此我們需要自己手寫,詳細的有關順序表的數據結構描述和C語言代碼請見【我的這篇文章】。 在Jav
【編程基礎】C語言常見宏定義
ifd 轉換成 erro get 程序 運算 efi 宏定義 當前 我們在使用C語言編寫程序的時候,常常會使用到宏定義以及宏編譯指令,有的可能比較常用,有的可能並不是很常用,是不是所有的C語言宏定義以及宏指令你都清楚呢? 指令 用途詳細介紹 # 空指令,無任何效果 #i
【計算機網絡基礎】數據鏈路層(目錄)
計算機網絡 劃分 靜態 控制 網橋 透明 回退 csma/cd 廣播 數據鏈路層知識結構 數據鏈路層組幀和透明傳輸 數據鏈路層差錯檢驗 奇偶校驗 循環冗余校驗(CRC) 海明碼 數據鏈路層可靠傳輸(ARQ協議) 停止-等待協議 回退N幀協議(GBN協議) 選擇重傳協