數據庫查詢的基本格式為:
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