不簡單的SQL查詢和排序語句


真不簡單!!

一:使用select語句進行查詢

語法:

SELECT    <列名>

FROM      <表名>

[WHERE    <查詢條件表達式>]

[ORDER BY <排序的列名>[ASC或DESC]]

eg1:

SELECT               SCode,SName,SAddress

FROM   Students

WHERE               SSEX = 0

ORDER BY   SCode

二:查詢所有列和行:

eg:

SELECT * FROM Course 

SELECT * FROM Students 

三:*查詢部分列

eg:

SELECT SName, SAddress  FROM Students 

SELECT SName ,SGrade  FROM Students

WHERE SAddress = '北京'

四:列別名

eg:

SELECT SCode AS 學生編號,SName  AS 學生姓名,

        SAddress AS 學生地址 

FROM Students

WHERE SAddress <> '河南新鄉'

 

SELECT FirstName + '.' + LastName AS 姓名

FROM Employees

注意:

1. + 連接的數據類型必須兼容

2. 如果 + 連接字符型數據,結果為字符串數據的連接

3. 如果 + 連接數值型數據,結果為數值的和

五:使用等號命名列

eg:

SELECT  姓名 = FirstName+'.'+LastName

FROM Employees

 

六:查詢空行

eg:

SELECT SName FROM Students WHERE SEmail IS NULL

七:*使用常量列

eg:

SELECT 姓名=SName,地址= SAddress , '北京新興橋' AS 學校名稱

FROM Students

八:限制固定行數

eg:

SELECT TOP 5 SName, SAddress

FROM Students WHERE SSex = 0

九:*按百分數返回行

eg:

SELECT TOP 20 PERCENT SName, SAddress

FROM Students WHERE SSex = 0

十:相關練習:

* 查詢全部S1的學生信息
*查詢全部S2的學生的姓名和電話
*查詢全部S1女同學的信息
*查詢課時超過60的科目信息
*查詢 S2的科目名稱
*查詢S2男同學的姓名和住址
*查詢無電子郵件的學生姓名和年級信息
*查詢出生日期在1993年之后的S2的學生姓名和年級信息
*查詢參加了日期為2013年2月15日的“HTML和CSS網頁技術”科目考試的成績信息
十一:升序排列
eg:

SELECT StudentID,Score  FROM Score  ORDER BY Score

SELECT StudentID AS 學生編號,(Score*0.9+5) AS 綜合成績

FROM Score

WHERE (Score*0.9+5)>60

ORDER BY Score

十二:降序排列

eg:

SELECT StudentID,Score  FROM Score  ORDER BY Score DESC

十三:按多列排序

eg:

SELECT StudentID AS 學生編號, CourseID AS 課程ID, Score AS 成績

FROM Score

WHERE Score > 60

ORDER BY CourseID, Score

常見問題:

.SQL語句不區分大小寫

.字符串和日期類型都需要單引號

.起表名的時候,千萬不要起得太好,例如不要使用User作為表名。

如果表名和關鍵字重復了,我們可以通過[]取消轉義

select * from [User]

注意:新建查詢窗口中的中文空格。

select  * from Message

十四:常用的幾類函數:

* 字符串函數
*用於控制返回給用戶的字符串
*日期函數
*用於操作日期值
*數學函數
*用於對數值進行代數運算
*系統函數
*獲取有關SQL Server中對象和設置的系統信息
1:字符串函數

函數名稱:CharIndex('str1','str2',index)//位置從開始

--參數含義:

--第一個參數:要查詢的字符串

--第二個參數:在哪個字符串中搜索

--第三個參數:從str2的第幾個字母開始搜索

eg:

select charindex('好好學','S1是S2的基礎,所以大家好好學',1) 

SELECT CHARINDEX('JBNS','My Jbns Course') 

select charindex('微冷的雨','好人啊微冷的雨',4)

select charindex('媽媽說','我們要為國家爭光,媽媽說,是人就要有理想',11)

 

len():獲取小括號中字符串的長度,空格也算一個字符長度

eg:

select len('明天咱們還上課,希望大家回去好好休息')

select len('大家都是好孩子                ')

注意點:如果內容以多個空格結尾,那么結尾的多個空格,是不計算長度的

 

upper():將括號中出現的英文全部轉換成大寫

select upper('i can speak english.你能嗎?')

select lower('I HAVE A DREAM')

select upper('i have a dream,俺有一個夢想')

 

LTrim():清除括號中內容左邊的空格(left:right)

select ltrim('                              生活不是林黛玉,      '

select rtrim('         生活不是林黛玉,      ')

 

--既想移除左邊空格,也想移除右邊空格

select rtrim(ltrim('         生活,      '))

select ltrim(rtrim('   你還好吧!   '))

select len(rtrim('今年奇怪了,北京沒下雪,    '))

 

substring('字符串',截取的位置,截取的長度)

select substring('好吧,我愛自己偉大的祖國,真的',6,1)

 

right():從字符串右邊返回指定類型的字符

select left('大家今天好像都沒有交日記本,我去',3)

select right('大家今天好像都沒有交日記本,我去',2)

 

replace('str1','要替換的字符','目標字符'):

select replace('周傑倫,殘疾人,雖然手不殘疾,但是X殘疾','殘疾','好')

 

stuff('字符串',刪除的起始位置,刪除的長度,'插入的字符串')

select stuff('我愛你中國,我愛你故鄉',4,2,'北京')

select stuff('我們都要有理想,為了理想我們熬夜,當然以犧體為代價',6,2,'自信')

2:日期函數

--01.getdate():獲取當前日期和時間

select getdate()

--1000ms是s

--02.dateadd(按年/月/日添加,增量,時間)

select dateadd(yy,100,'2014-8-6')

select dateadd(year,-20,getdate())

--03.datediff(按年/月/日求差,小時間,大時間)

 select datediff(year,'1998-01-01',getdate())

 

--04.datename:獲取某個日期是星期幾

select datename(dw,'2014-08-06')

--05.datepart(mm,日期):獲取指定日期對應的年/月/日部分 

select datepart(yy,getdate())

--Year yy

--Month mm

--Day  dd

--push(推)  pull(拉)

--通過該方式也可以獲取當天是周幾

select datepart(dw,getdate())

3:數學函數

--01.rand():產生一個到之間的隨機數

select right(rand(),4)

Select rand()

 

--如果產生四位數(-9999)

--02.abs:取絕對值

select abs(-10)

select abs(10)

--非負數

--03.ceiling:天花板,你要看天花板,抬頭,向上取整

select ceiling(1.999991)

--04.floor:向下取整

select floor(1.999999)

select ceiling(1.000000000000001)

select floor(2.999999999999999)

--04.power(5,2)求冪值

select power(4,4)

select 1*2/3+5-56+100-5/100

 

select power(2,3)

--05.round:將一個數字四舍五入到指定精度

select round(42.564,1)

--06.sign:如果括號中寫的是一個正數,返回,如果是負數,返回-1

--如果是返回

select sign(20)

select sign(0)

--07.sqrt()開平方

select sqrt(9)

 
4:系統函數
相關練習:
*1: 某公司印了一批充值卡,卡的密碼是隨機生成的,現在出現這個問題:

    卡里面的字母“O和數字0”、“字母i和數字1”,用戶反映說看不清楚,公司決定,把存儲在數據庫中的密碼中所有的“O”都改成“0”,把所有的“i”都改成“1”;

*請編寫SQL語句實現以上要求
*數據庫表名:Card
密碼列名:PassWord
分析:
*實現卡密碼更新的功能,需要使用UPDATE語句
*牽涉到字符串的替換,需要使用到SQL Server中的函數REPLACE()
答案:

UPDATE Card SET PassWord = REPLACE(PassWord ,'O','0')

UPDATE Card SET PassWord = REPLACE(PassWord ,'i','1')

2:在數據庫表中有以下字符數據,如:

  13-1、13-2、13-3、13-10、13-100、13-108、13-18、13-11、13-15、14-1、14-2

*現在希望通過SQL語句進行排序,並且首先要按照前半部分的數字進行排序,然后再按照后半部分的數字進行排序,輸出要排成這樣:

  13-1、13-2、13-3、13-10、13-11、13-15、13-18、13-100、13-108、14-1、14-2

*數據庫表名:SellRecord
*列名:ListNumber、
分析:
*排序:ORDER BY
*在ORDER BY的排序列中,需要重新計算出排序的數字
*前半部分的數字:
*找到“-”符號的位置
*取其左半部分
*使用CONVERT函數將其轉換為數字:

 后半部分的數字:

*找到“-”符號的位置
*把從第一個位置到該位置的全部字符替換為空格
使用CONVERT函數將其轉換為數字:0
答案:

SELECT ListNumber

FROM    SellRecord

ORDER BY

CONVERT(int, LEFT(ListNumber, CHARINDEX('-', ListNumber)-1)),

CONVERT(int, STUFF(ListNumber,1, CHARINDEX('-', ListNumber), ''))

3:

使用SELECT語句查詢數據
*使用函數處理數據
*需求說明:
*查詢年齡超過20周歲的Y2的學生信息
*查詢1月份過生日的學生信息
*查詢今天過生日的學生姓名及所在年級
*查詢學號為“Y21003007”的學生Email的域名
*

新生入學,為其分配一個Email地址 

分析:

*年滿20周歲的條件

DATEDIFF(DD,BornDate, GETDATE())>=365*20 

*
*獲取Email的域名

RIGHT(Email, LEN(Email) - CHARINDEX('@',Email) )

*
*獲取當前日期的年、月、日

CONVERT(VARCHAR(4), DATEPART(YYYY,GETDATE()))

*

獲取4位隨機數 

RIGHT(RAND(),4) 

 

世上無難事,只怕有心人。                                                                                 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM