SQL server學習(二)表結構操作、SQL函數、高級查詢


數據庫查詢的基本格式為:

select          ----輸出(顯示)你要查詢出來的值

from           -----查詢的依據

where         -----篩選條件(對依據(數據庫中存在的表))

group by      -----對篩選后的數據 進行分組

having        ----- 篩選條件(對分組后的結果再次篩選)

order by      -----將結果進行排序

注意:基本語法格式順序不能變,順序不能變,但可以缺省

表結構操作

表結構操作是需要去修改表結構,使用的關鍵字是alter,其他方式無法對表進行操作的時候,比如,新增列,刪除列,修改列類型等操作,就需要使用alter方法了。

新增列

alter table stu
add sid int

刪除列

alter table stu
drop column sid

修改列類型

alter table stu
alter column sid char(1)

修改列類型需要注意的是:如果列中有數據,則不能修改該列數據類型

新增約束

alter table stu
add constraint ck_ssex check (ssex=0 or ssex=1)

新增兩列

alter table stu
add siphone nchar(11),smoney money

刪除約束

alter table stu
drop ck_ssex

SQL函數

SQL函數分為五類,字符串函數,日期函數,數學函數,系統函數,聚合函數

字符串函數如下表所示:

函數名

描述

舉例

charindex

用來尋找一個指定的字符串在另一個字符串中的起始位置

select charindex('apple','this is apple',1)返回值為:9

len

返回傳遞給它的字符串長度

select len('yihuqingjiu')

返回值為:11

lower

把傳遞給它的字符串轉換為小寫

select lower('YIHUQINGJIU')

返回值為:yihuqingjiu

upper

把傳遞給它的字符串轉換為大寫

select upper('yihuqingjiu')

返回值為:YIHUQINGJIU

ltrim

清除字符左邊的空格

select ltrim(' yihuqingjiu ')

返回值為:yihuqingjiu ,左邊空格被清除

rtrim

清除字符串右邊的空格

select rtrim('yihuqingjiu ')

返回值為: yihuqingjiu,右邊空格被清除

right

從字符串右邊返回指定數目的字符

select right('yihuqingjiu',3)

返回值為:jiu

replace

替換一個字符串中的字符

select replace('yihuqingjiu','yi','wen')

返回值為:wenhuqingjiu

stuff

在一個字符串中,刪除指定長度的字符,並在該位置插入一個新的字符串

select stuff('yihuqingjiu',3,6,'wen')

返回值為:yiwenjiu,3,6指的是,以第三個字符開始,往后6個字符都刪除

日期函數如下表所示:

函數名

描述

舉例

getdate

獲取當前的系統日期

select getdate()

返回值為:當前的時間日期

dateadd

將指定的數值添加到指定的日期部分后的日期

select dateadd(dd,4,'17/6/17')

返回值為:2017-06-21,年為yy,月為mm,日為dd,所以上述代碼在日為17的基礎上加4

datediff

兩個日期之間的指定日期部分的區別

select datediff(mm,'17/8/15','17/10/15')

返回值為:2,月份相差2,年月日表示方法同上

datename

日期中指定日期部分的字符串形式

select datename(dw,'17/10/7')

返回值為:星期六

datepart

日期中指定日期部分的整數形式

select datepart(day,'17/10/7')

返回值為:7

日期參數及縮寫如下表所示:

日期部分

縮寫

year 

yy, yyyy

quarter(表季度,返回1-4)

qq, q

month

mm, m

dayofyear(在當前時間的多少天)

dy, y

day

dd, d

week

wk, ww

weekday

dw

hour

hh

minute

mi, n

second

ss, s

millisecond

ms

數學函數如下表所示:

函數名

描述

舉例

abs

取數值表達式的絕對值

select abs(-1025)

返回值為:1025

ceiling

返回大於或等於所給數字表達式的最小整數

select ceiling(28.9)

返回值為:29

floor

取小於或等於指定表達式的最大整數

select floor(28.9)

返回值為:28

power

取數值表達式的冪值

select power(8,2)

返回值為:64

round

將數值表達式四舍五入為指定精度

select round(36.55789,3)

返回值為:36.55800

sign

對於正數返回1,負數返回-1,0則返回0

select sign(36)

返回值為:1

sqrt

取浮點表達式的平方根

select sqrt(16)

返回值為:4

系統函數如下表所示:

函數名

描述

舉例

convert

用來轉變數據類型

select convert(nchar(3),123)

返回值為:123

current_user

返回當前用戶的名字

select current_user

返回值為:用戶分組名,dbo或guest

datalength

返回用於指定表達式的字節數

select datalength('用戶分組名dbo')

返回值為:13,漢字占兩個字節

host_name

返回當前用戶所登錄的計算機名字

select host_name()

返回值為:所登錄的計算機名

system_user

返回當前所登錄的用戶名稱

select system_user

返回值為:當前登錄名,比如sa

user_name

從給定的用戶ID放回用戶名

select user_name(1)

返回值為:dbo,括號中數字不同返回的數據也不同

聚合函數如下所示:

min ---最小

max ---最大

sum ---和

avg ---平均

count ---統計(個數)

需要注意的是:聚合函數需要和分組group by一起使用

例:

select avg(成績)
from student
group by 科目

高級查詢

查詢中where與having的區別:

本質上沒有區別,都是對數據做篩選,只不過 where對原始表中的數據篩選,而having是對分完組后的數據篩選

去重復的關鍵字是distinct

例:

select distinct depart
from teacher

多表查詢

多表查詢需要將表連接在一張表中做查詢操作,連接表有如下幾種方式

1.全連接(笛卡爾連接)

2.左連接

3.右連接

4.內連接

第一種連接方式語法為:

select *
from 表1,表2
where 表1.列=表2.列 

第二種連接方式的語法為:

select *
from 表1 left join 表2 on 表1.列=表2.列

第三種連接方式的語法為:

select *
from 表1 right join 表2 on 表1.列=表2.列

第四種連接方式的額語法為:

select *
from 表1 inner join 表2 on 表1.列=表2.列

子查詢

子查詢分為四種,where子查詢、from子查詢、in子查詢和exists子查詢

where子查詢是將一個查詢的結果作為另一個查詢的條件

from子查詢是將一個查詢的結果作為另一個查詢的來源(表)

in子查詢是指要查詢的數據包含其中

exists子查詢是判斷某數據是否存在

where子查詢例:

select stuName 
from stuInfo 
where stuNo=(select stuNo from stuMarks where writtenExam=60)

where條件查詢:

  a. 比較運算符 = ,!=(<>),< > <= >=

  b. like , not like ('%'匹配任意多個字符,'_'匹配任意單個字符)

  c. in , not in , between and

    in,匹配多個數據

    like,模糊查詢,對字符、字符串使用

    shop_price between 1000 and 3000

  d. is null , is not null

通配符如下表所示:

通配符

解釋

示例

‘_’

一個字符

A Like 'C_'

%

任意長度的字符串

B Like 'CO_%'

[ ]

括號中所指定范圍內的一個字符

C Like '9W0[1-2]'

[^]

不在括號中所指定范圍內的一個字符

D Like ‘%[A-D][^1-2]'

from子查詢例:

select *
from (select * from score,grade where degree>low and degree< upp) as a  
where rank='A'

in子查詢例:

select stuName 
from stuInfo 
where stuNo in  (select stuNo from stuMarks)

exists子查詢例:

if exists(select * from sys.databases where name='new')
drop database new

其中sys.databases是指系統中所有的數據庫,exists返回值是true或false

一般來說,表連接都可以用子查詢替換,但有的子查詢卻不能用表連接替換。子查詢比較靈活、方便,常作為增刪改查的篩選條件,適合於操縱一個表的數據,表連接更適合於查看多表的數據。

排序

排序分為降序和升序,很簡單,看個例子就明白。

升序例:

select *
from student
order by sno asc

降序例:

select *
from student
order by sno desc

按多列排序:

select *
from student
order by sno asc,scj asc

排序需要注意的是,若排序字段沒有name,在select顯示是輸出不了的。

限制固定行數顯示:

select top 5 sname,saddress
from student
where ssex=0

也可以用*代表所有列

返回百分之多少行:

select top 20 percent sname,saddress
from student
where ssex=0

 


免責聲明!

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



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