SQL(結構化查詢語言)
關係數據庫的標準語言
SQL Server、Oracle、DB2
非過程化語言
不需要指定對數據的存放方法
統一的語言
創建、修改以及刪除數據對象(數據庫、表等)
T-SQL
SQL的加強版, 提供了類似於程序語言的基本功能
變量說明、流程控制、功能函數
DML:數據操縱語言
查詢、插入、刪除和修改數據
SELECT、INSERT、UPDATE、DELETE
DCL:數據控制語言
建立數據庫、數據庫對象和定義其列
CREATE、ALTER、DROP
DDL:數據定義語言
控制數據庫組件的存取許可、存取權限等
GRANT、REVOKE
比較運算符
運算符 | 含義 |
= | 等於 |
> | 大於 |
< | 小於 |
<= | 小於等於 |
>= | 大於等於 |
<> | 不等於 |
!> | 不等於 |
BETWEEN | 指定值的包含範圍(包含邊界)。使用 And 分隔開始值和結束值 |
IS [Not] NULL | 指定是否搜索空值或非空值 |
LIKE | 模糊查詢,與指定字符串進行模式匹配 |
IN | 是否在數據範圍裏面 |
通配符
運算符 | 含義 |
AND | 組合兩個條件,並在兩個條件都爲True時取值爲True |
OR | 組合兩個條件,並在兩個條件之一爲 True 時取值爲True |
NOT | 和其他操作符一起使用,取反的操作 |
1.創建數據庫:
Createdatabasebenet--創建一個數據庫名爲”benet“
on
(
name=benet,--文件的邏輯名
filename='d:\benet.mdf',--數據文件存放的物理位置
size=10MB,--文件的初始大小
maxsize=100MB,--文件的總存儲空間大小
filegrowth=10MB--文件的自動增長大小
)
logon
(
name=benet_log,
filename='d:\benet.ldf',--日誌文件存放的物理位置
size=10MB,--日誌文件的初始大小
maxsize=100MB,--日誌文件的總存儲大小
filegrowth=10MB--日誌文件自動增長大小
)
Go
2.創建表:
usebenet--在benet數據庫下創建表
createtablestudent--創建一個表爲”student“
(
sidintidentity(1,1)primarykeynotnull,
--設置標示符自動增長”identity“設置主鍵”primarykey' 不爲空“not null”
namenvarchar(50)notnull,
sexnvarchar(50) default'男'notnull, --默認值爲”男”
ageintnotnull,
birthdaysmalldatetime null
)
3.插入記錄:
usebenet--在benet數據庫student表下插入記錄
insertintostudent(name,sex,age,birthday)
values ('zhangsan','男',22,'1994-01-01'),
('lisi','女',24,'1992-02-03'),
('wangwu','男',25,' ')
4.修改數據:
usebenet
updatestudent--把原來wangwu的性別"男",改爲"女"
setsex='女'
wherename='wangwu'
usebenet
updatestudent--把所有性別爲"男",改爲"女"
setsex='女'
wheresex='男'
usebenet
updatestudent--把所有人的年齡都+10
setage=age+10
usebenet
updatestudent--把zhangsan的年齡+10
setage=age+10
wherename='zhangsan'
5.修改表:
usebenet
altertablestudent--添加列cid
addcidintnull
usebenet
altertablestudent
dropcolumncid--刪除列cid
usebenet
altertablestudent--修改birthday的數據類型爲datetime
altercolumnbirthdaydatetime
6.修改列名:
usebenet
execsp_rename'student.sex(原始表內的列名)','性別(新列名)','column' --把列名“sex”改爲“性別”
7.刪除:
刪除數據(注意:語句DELETE和DROP TABLE之間有一個非常重要的區別。DELETE刪除一個表中的一部分或全部的內容。而DROP TABLE則將表的內容和表的大綱全都一起刪除。這樣,在執行了DELETE語句之後,表依然存在於數據庫中,儘管表中或許已沒有行了,但在執行DROP TABLE語句後,表將不復存在)
條件刪除 | 記錄事物日誌 | 重置標識符列 | 外鍵約束 | |
Delete | 使用where子句按條件刪除 | 是,數據可以恢復 | 否 | 可以用於含有外鍵約束的表 |
Truncate table | 只能清空整個表 | 否,數據無法恢復 | 重置標識符列爲0 | 不能用於含有外鍵約束的表 |
usebenet
deletefromstudent--刪除表中所有性別爲“男”的信息
where性別='男'
usebenet
deletefromstudent--刪除表中所有年齡爲“34”的信息
whereage='34'
usebenet
droptablestudent--刪除表
8.select 查詢
(1)查詢studen表中的所有數據,“*”代表全部
usebenet
select*fromstudent
(2)查詢studen表中的name列
usebenet
selectnamefromstudent
(3)查詢studen表中的name列和sex列,用","隔開
usebenet
selectname,sex
fromstudent
(4)查詢studen表中的李四的年齡
usebenet
selectage
fromstudent
wherename='李四'
(5)查詢studen表中的不爲李四的年齡
usebenet
selectage
fromstudent
wherename<>'李四'--(where name!='李四'\where not name='李四')
(6)查詢studen表中的name大於24的
usebenet
selectname,age
fromstudent
whereage>24
(7)查詢studen表中的name大於等於30的
usebenet
selectname,age
fromstudent
whereage>=30
(8)查詢studen表中的name小於24的
usebenet
selectname,age
fromstudent
whereage<24
(9)查詢studen表中的name小於等於30的
usebenet
selectname,age
fromstudent
whereage<=30
(10)查詢studen表中的age等於18並且age等於30的
usebenet
selectname
fromstudent
whereage=18 and age=30--(whereage in (18,30))
(11)查詢studen表中的name大於等於30的並且小於等於50
usebenet
selectname,age
fromstudent
whereage>=30 andage<=50 --(where age between 30 and 50,如果不等於加“not”)
(12)查詢studen表中的name小於等於30的或者大於等於50
usebenet
selectname,age
fromstudent
whereage<=30 orage>=50 --(where age not between 30 and 50)
(13)查詢studen表中的sex爲女並且年齡等於18
usebenet
selectname,age
fromstudent
wheresex='女'andage=18
(14)查詢studen表中的所有sex(不重複)使用distinct
usebenet
selectdistinctsex--查詢studen表中的所有sex(不重複)
fromstudent
NOT操作的優先級最高,AND其次,OR最低
比較以下兩個語句的不同:
(15)比如:
usebenet
Select*
Fromstudent
Where age>22 andage<30)
orcid=1 andsex='男'
--先執行age>22 andage<30,然後執行cid=1 andsex='男'
,最後執行age<3 orcid=1
(16)查詢student中cid爲空的性名
usebenet
Selectname
Fromstudent
Wherecidisnull --不爲空(where cid is not null)
Selectcount(*)
Fromstudent
9.聚合函數
AS子句可以用來改變結果集列的名稱
比如:
(1)查看setudent表中age的總和
SelectSUM(age)as年齡
Fromstudent
(2)查看setudent表中age的平均數
Selectavg(age)as年齡
Fromstudent
(3)查看student表中age的的總個數
Selectcount(age)as總個數
Fromstudent
(4)查看student表中age的最大值和最小值
Selectmax(age) -- 最大值
Fromstudent
Selectmin(age) --最小值
Fromstudent
10.分組查詢:按照一定條件分類組合,通過groupby 子句實現,having子句的作用是篩選滿足條件的組
(1)統計每個課程的總成績
Selectcidas課程編號,sum(score)as總成績
Fromscore
groupbycid
(2)統計每個課程的平均成績
Selectcidas課程編號,avg(score)as平均成績Fromscore
groupbycid
(3)統計每個學生每個課程的平均成績
Selectsidas學生編號,cidas課程編號,avg(score)as平均成績
Fromscore
groupbysid,cid
(4)只顯示補考過的學生成績
Selectsidas學生編號,cidas課程編號,avg(score)as平均成績Fromscore
groupbysid,cid
havingcount(score)>1
11.降序升序、Top
(1)查詢student中的所有數據,並以年齡降序排列
Select*
fromstudent
orderbyagedesc --esc升序
(2)查詢student中前5列數據,並以年齡降序排列
Selecttop 5 * --用top子句實現
fromstudent
orderbyagedesc
12.LIKE操作符用於將列的值與某個特定的模式做比較。列的數據類型可以是任何字符或者日期型數據。
通配符 %:any 代表零個或多個任意字符 _:single代表某一個任意字符
(1)查詢student表中所有姓名以張開頭的姓名和年齡
Selectname,age
fromstudent
wherenamelike'張%'
(2)查詢student表中所有姓名不是以張開頭的姓名和年齡
Selectname,age
fromstudent
wherename not like'張%'
(3)查詢student表中所有姓名無論第幾個字爲“德”的姓名和年齡
Selectname,age
fromstudent
wherenamelike'_德%'
(4)查詢student表中所有姓名第二個字爲“德”的姓名和年齡
Selectname,age
fromstudent
wherenamelike'%德%'
(5)查詢student表中年齡爲2和3開頭的所有姓名
Selectname
fromstudent
whereagelike'[2-3]%'
(6)查詢姓(firstname)的打頭字母不是J,K,L,M,N,O,並且名(lastname)的打頭字母不是E或者Z的所有學生的編號和名字
Selectstid,name
Fromstudent
Wherefirstnamelike'[^J-O]%'
andlastnamelike'[^EZ]%'
13.多表查詢
合併union
把student表和score表的cid合併
Selectcid
Fromstudent
union
selectcid
fromscore
(1)內鏈接inner join
Selectstudent.name姓名s,student.cid班級s,
class.cid班級c,class.name名子c
fromstudent,class
wherestudent.cid=class.cid
或者標準寫法:
Selectstudent.name姓名s,student.cid班級s,
class.cid班級c,class.name名子c
fromstudentinnerjoinclass
onstudent.cid=class.cid
(2)外連接
1>左外連接使用left join(左爲主表,右爲從表,如果左表某一行在右表中沒有匹配行,則右表返回null值)
Selectstudent.name姓名s,student.cid班級編號s,
class.cid班級編號c,class.name班級名c
fromstudentleftjoinclass
onstudent.cid=class.cid
2>右外連接使用right join(右爲主表,左爲從表,如果右表某一行在左表中沒有匹配行,則左表返回null值)
Selectstudent.name姓名s,student.cid班級編號s,class.cid班級編號c,class.name班級名c
fromstudentrightjoinclass
onstudent.cid=class.cid
3>完整外連接使用full join(返回左表和右表的所有行,當某一行在另一表中沒有匹配行時,另一表返回空值)
Selectstudent.name姓名s,student.cid班級編號s,class.cid班級編號c,class.name班級c
fromstudentfulljoinclass
onstudent.cid=class.cid
4>交叉連接使用cross join(表之間沒有任何關聯條件,查詢將返回左表與右表挨個連接的所有行,就是左表中的每一行與右表的所有行一一組合
Selectstudent.name姓名s,student.cid班級編號s,class.cid班級編號c,class.name班級c
fromstudentcrossjoinclass
或者
Selectstudent.name姓名s,student.cid班級編號s,class.cid班級編號c,class.name班級c
fromstudent,class