1. 程式人生 > >【T-SQL基礎】01.單表查詢-幾道sql查詢題

【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

是一個表示式,可以解析為與 datedatepart 相加的 int。使用者定義的變數是有效的。

如果您指定一個帶小數的值,則將小數截去且不進行舍入。

   date

是一個表示式,可以解析為 timedatesmalldatetimedatetimedatetime2datetimeoffset 值。date 可以是表示式、列表達式、使用者定義的變數或字串文字。如果表示式是字串文字,則它必須解析為一個 datetime 值。為避免不確定性,請使用四位數年份。有關兩位數年份的資訊,請參閱 two digit year cutoff 選項。

3.返回值

datepart 引數

dayofyeardayweekday 返回相同的值。

每個 datepart 及其縮寫都返回相同的值。

如果 datepartmonthdate 月份比返回月份的天數多,因而 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');
SELECT DATEADD(year,-2147483649, '2006-07-31');

date 引數

date 引數不能增加至其資料範圍之外的值。在下面的語句中,與 date 值相加的 number 值超出了 date 資料型別的範圍。將返回如下錯誤訊息:“將值新增到 'datetime' 列導致溢位。”

SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');

DATEDIFF:

返回指定的 startdateenddate 之間所跨的指定 datepart 邊界的計數(帶符號的整數)。

語法:

DATEDIFF ( datepart , startdate , enddate )

引數

    datepart

是指定所跨邊界型別的 startdateenddate 的一部分。下表列出了所有有效的 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

是一個表示式,可以解析為 timedatesmalldatetimedatetimedatetime2datetimeoffset 值。date 可以是表示式、列表達式、使用者定義的變數或字串文字。從 enddate 減去 startdate

為避免不確定性,請使用四位數年份。有關兩位數年份的資訊,請參閱two digit year cutoff 選項。

   enddate

請參閱 startdate

返回型別

int

返回值

每個 datepart 及其縮寫都返回相同的值。

如果返回值超出 int 的範圍(-2,147,483,648 到 +2,147,483,647),則會返回一個錯誤。對於 millisecondstartdateenddate 之間的最大差值為 24 天 20 小時 31 分鐘 23.647 秒。對於 second,最大差值為 68 年。

如果為 startdateenddate 都只指定了時間值,並且 datepart 不是時間 datepart,則會返回 0。

在計算返回值時不使用 startdateendate 的時區偏移量部分。

由於 smalldatetime 僅精確到分鐘,因此將 smalldatetime 值用作 startdateenddate 時,返回值中的秒和毫秒將始終設定為 0。

如果只為某個日期資料型別的變數指定時間值,則所缺日期部分的值將設定為預設值:1900-01-01。如果只為某個時間或日期資料型別的變數指定日期值,則所缺時間部分的值將設定為預設值:00:00:00。如果 startdateenddate 中有一個只含時間部分,另一個只含日期部分,則所缺時間和日期部分將設定為各自的預設值。

如果 startdateenddate 屬於不同的日期資料型別,並且其中一個的時間部分或秒小數部分精度比另一個高,則另一個的所缺部分將設定為 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協議) 選擇重傳協