SQL語法速成手冊_第1頁
SQL語法速成手冊_第2頁
SQL語法速成手冊_第3頁
SQL語法速成手冊_第4頁
SQL語法速成手冊_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

SQL語法速成手冊

一、基本概念

?數(shù)據(jù)庫術(shù)語

?數(shù)據(jù)庫(database)■保存有組織的數(shù)據(jù)的容器(通常是一個(gè)文件或一組文件)。

?數(shù)據(jù)表(table)-某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單。

?模式(schema)-關(guān)于數(shù)據(jù)庫和表的布局及特性的信息。模式定義了數(shù)據(jù)在表中如何存儲,

包含存儲什么樣的數(shù)據(jù),數(shù)據(jù)如何分解,各部分信息如何命名等信息。數(shù)據(jù)庫和表都有模式。

?列(column)-表中的一個(gè)字段。所有表都是由一個(gè)或多個(gè)列組成的。

?行(row)-表中的一個(gè)記錄。

?主鍵(primarykey)-一列(或一組列),其值能夠唯一標(biāo)識表中每一行。

?SQL語法

?SQL(StructuredQueryLanguage),標(biāo)準(zhǔn)SQL由ANSI標(biāo)準(zhǔn)委員會管理,從而稱為ANSI

SQL。各個(gè)DBMS都有自己的實(shí)現(xiàn),如PL/SQL、Transact-SQL等。

?SQL語法結(jié)構(gòu)

……-[UPDATEcountry_____,干岬__________

1[SETpopulation=population+1-

<1-*.-[WHEREname=.'USA1.:

£少一“18I

I

*ZhancPec

?SQL語法結(jié)構(gòu)包括:

?子句-是語句和查詢的組成成分。(在某些情況下,這些都是可選的。)

?表達(dá)式-可以產(chǎn)生任何標(biāo)量值,或由列和行的數(shù)據(jù)庫表

?謂詞-給需要評估的SQL三值邏輯(3VL)(true/false/unknown)或布爾真值指定條件,

并限制語句和查詢的效果,或改變程序流程。

?查詢-基于特定條件檢索數(shù)據(jù)。這是SQL的一個(gè)重要組成部分。

?語句-可以持久地影響綱要和數(shù)據(jù),也可以控制數(shù)據(jù)庫事務(wù)、程序流程、連接、會話或診斷。

?SQL語法要點(diǎn)

?SQL語句不區(qū)分大小寫,但是數(shù)據(jù)庫表名、列名和值是否區(qū)分,依賴于具體的DBMS以及配

置。

?例如:SELECT與select、Select是相同的。

?多條SQL語句必須以分號(;)分隔。

?處理SQL語句時(shí),所有空格都被忽略。SQL語句可以寫成一行,也可以分寫為多行。

?-一行SQL語句

?UPDATEuserSETusername='robot',password='robot'WHEREusername=

'root';

?-多行SQL語句

?UPDATEuser

?SETusemame='robo:'/password='robot'

?WHEREusername='root';

?SQL支持三種注釋

?##注釋1

?一注釋2

?/*注釋3*/

?SQL分類

?數(shù)據(jù)定義語言(DDL)

?數(shù)據(jù)定義語言(DataDefinitionLanguage,DDL)是SQL語言集中負(fù)責(zé)數(shù)據(jù)結(jié)構(gòu)定義與

數(shù)據(jù)庫對象定義的語言。

?DDL的主要功能是定義數(shù)據(jù)庫對象。

的核心指令是

?DDLCREATE.ALTER.DROPo

?數(shù)據(jù)操縱語言(DML)

?數(shù)據(jù)操縱語言(DataManipulationLanguage,DML)是用于數(shù)據(jù)庫操作,對數(shù)據(jù)庫其中

的對象和數(shù)據(jù)運(yùn)行訪問工作的編程語句。

?DML的主要功能是訪問數(shù)據(jù),因此其語法都是以讀寫數(shù)據(jù)庫為主。

?DML的核心指令是INSERT.UPDATE.DELETE.SELECT,這四個(gè)指令合稱

CRUD(Create,Read,Update,Delete),即增刪改查。

?事務(wù)控制語言(TCL)

?事務(wù)控制語言(TransactionControlLanguage,TCL)用于管理數(shù)據(jù)庫中的事務(wù)。這些用

于管理由DML語句所做的更改。它還允許將語句分組為邏輯事務(wù)。

?TCL的核心指令是COMMIT.ROLLBACK.

?數(shù)據(jù)控制語言(DCL)

?數(shù)據(jù)控制語言(DataControlLanguage,DCL)是一種可對數(shù)據(jù)訪問權(quán)進(jìn)行控制的指令,它

可以控制特定用戶賬戶對數(shù)據(jù)表、杳看表、預(yù)存程序、用戶自定義函數(shù)等數(shù)據(jù)庫對象的控

制權(quán)。

?DCL的核心指令是GRANT、REVOKE,

?DCL以控制用戶的訪問權(quán)限為主,因此其指令作法并不復(fù)雜,可利用DCL控制的權(quán)限有:

CONNECT.SELECT.INSERT.UPDATE.DELETE.EXECUTE.USAGE.

REFERENCESO

?根據(jù)不同的DBMS以及不同的安全性實(shí)體,其支持的權(quán)限控制也有所不同。

?(以下為DML語句用法)

?二、增刪改查

增刪改直,又稱為CRUD,數(shù)據(jù)庫基礴作中的基本操作。

?插入數(shù)據(jù)

?INSERTINTO語句用于向表中播入新記錄。

?插入完整的行

?INSERTINTOuser

?VALUES(10,'root','root','xxxx@163.com');

?插入行的一部分

?INSERTINTOuser(username,password,email)

?VALUES('admin','admin','xxxx@163.com');

?插入查詢出來的數(shù)據(jù)

?INSERTINTOuser(username)

?SELECTname

?FROMaccount;

■更新數(shù)據(jù)

?UPDATE語句用于更新表中的記錄。

?UPDATEuser

?SETusemame='robot',password='robot'

?WHEREusername='root';

■刪除數(shù)據(jù)

?概述

?DELETE語句用于刪除表中的記錄。

?TRUNCATETABLE可以清空表,也就是刪除所有行。

?刪除表中的指定數(shù)據(jù)

?DELETEFROMuser

?WHEREusername='robot';

?清空表中的數(shù)據(jù)

?TRUNCATETABLEuser;

?查詢數(shù)據(jù)

?概述

?SELECT語句用于從數(shù)據(jù)庫中查詢數(shù)據(jù)。

?DISTINCT用于返回唯一不同的值。它作用于所有列,也就是說所有列的值都相同才算相同。

?LIMIT限制返回的行數(shù)。可以有兩個(gè)參數(shù),第一個(gè)參數(shù)為起始行,從0開始;第二個(gè)參數(shù)

為返回的總行數(shù)。

?ASC:升序(默認(rèn))

?DESC:降序

?查詢單列

?SELECTprod_name

?FROMproducts;

?查詢多列

?SELECTprod_id,prod_name,prod_price

?FROMproducts;

?查詢所有列

?ELECT*FROMproducts;

?查詢不同的值

?SELECTDISTINCT

?vendjdFROMproducts;

?限制查詢結(jié)果

?-返回前5行

?SELECT*FROMmytableLIMIT5;

?SELECT*FROMmytableLIMIT0,5;

?-返回第3~5行

?SELECT*FROMmytableLIMIT2,3;

三、子查詢

?概述

?子查詢是嵌套在較大查詢中的SQL查詢。子查詢也稱為內(nèi)部查詢或內(nèi)部選擇,而包含子查詢的

語句也稱為外部查詢或外部選擇。

?子查詢可以嵌套在SELECT,INSERT,UPDATE或DELETE語句內(nèi)或另一個(gè)子查詢中。

?子查詢通常會在另一個(gè)SELECT語句的WHERE子句中添加。

?您可以使用匕匕較運(yùn)算符,如>,<,或比較運(yùn)算符也可以是多行運(yùn)算符,如IN,ANY或

ALL。

?子鼾旬必須被圓括號()括起來。

?內(nèi)部查詢首先在其父直詢之前執(zhí)行,以便可以將內(nèi)部查詢的結(jié)果傳遞給外部直詢。執(zhí)行過程可

以參考下圖:

StudentMarks

StudentlDName

Abe

Abhay

Actlin

Adelpbos

(SELECT<rvdeaiid.?name,bloulnarks

jFROMXodoita.marksb

OUTERQUERY、WHERE*-bBtudMtid

VANDb.totalmarkf>(r?svltofIMMCq??ry)

INNBKQUERYf黑二吟i1V

(WHEREsh>4?Mid-*V00r);

ResultofOuterQueryResultofInnerQuery

StudentlDTotalmarks

V00195

V00280

V00374

SELECTa.studeAtid.a.name,btotal.inarkf

FROMstudenta.taarktb

WHEREastudentid-bstud<etid

ANDb.totalmarks>

(SELECTtouJ.nmrkf

FROMmarls/

WHEREstoieotid-'002);f

?

@ZhangPeng

ResultofSubquery

?子查詢的子查詢

?SELECTcust_name,cust_contact

?FROMcustomers

?WHEREcustjdIN(SELECTcustjd

?FROMorders

?WHEREorder_numIN(SELECTorder_num

?FROMorderitems

?WHEREprodjd='RGAN01'));

?WHERE

?WHERE子句用于過濾記錄,即縮小訪問數(shù)據(jù)的范圍。

?WHERE后跟一個(gè)返回true或false的條件。

?WHERE可以與SELECT,UPDATE和DELETE一起使用。

?可以在WHERE子句中使用的操作符

運(yùn)算符描述

=等于

<>不等于.注爰:在SQI的一些標(biāo)本中,該攆作總可被寫成!=

>

<小于

>=大于等于

<=小于等于

BETWEEN在某個(gè)范圖內(nèi)

LIKE搜索某種模式

IN指定針對某個(gè)列的多個(gè)可能值工、?HP/F^Z

?SELECT語句中的WHERE子句

?SELECT*FROMCustomers

?WHEREcust_name='KidsPlace';

?UPDATE語句中的WHERE子句

?UPDATECustomersSETcust_name='JackJones'

?WHEREcust_name='KidsPlace";

?DELETE語句中的WHERE子句

?DELETEFROMCustomers

?WHERE='KidsPlace';

?IN和BETWEEN

?概述

?IN操作符在WHERE子句中使用,作用是在指定的幾個(gè)特定值中任選一個(gè)值。

?BETWEEN操作符在WHERE子句中使用,作用是選取介于某個(gè)范圍內(nèi)的值。

?IN示例

?SELECT*FROMproducts

?WHEREvendjdIN('DLL01\'BRS01');

?BETWEEN示例

?SELECT*FROMproducts

?WHEREprod.priceBETWEEN3AND5;

?AND、OR、NOT

?概述

?AND、OR、NOT是用于對過濾條件的邏輯處理指令。

?AND優(yōu)先級高于OR,為了明確處理順序,可以使用().

?AND操作符表示左右條件都要滿足。

?OR操作符表示左右條件滿足任意一個(gè)即可。

?NOT操作符用于否定一個(gè)條件。

?AND示例

?SELECTprodjd,prod_name,prod_price

?FROMproducts

?WHEREvendjd='DLL01'ANDprod_price<=4;

?OR示例

?SELECTprod_id,prod_name,prod_price

?FROMproducts

?WHEREvendjd='DLL01'ORvendjd='BRS01';

?NOT示例

?SELECT*FROMproducts

?WHEREprod_priceNOTBETWEEN3AND5;

?LIKE

?概述

?LIKE操作符在WHERE子句中使用,作用是確定字符串是否匹配模式。

?只有字段是文本值時(shí)才使用LIKE。

?LIKE支持兩個(gè)通配符匹配選項(xiàng):%和3

?不要濫用通配符,通配符位于開頭處匹配會非常慢。

?%表示任何字符出現(xiàn)任意次數(shù)。

?一表示任何字符出現(xiàn)一次。

?%示例

?SELECTprodjd,prod_name,prod_price

?FROMproducts

?WHEREprod_nameLIKE'%beanbag%';

?一示例

?SELECTprod_id,prod_name,prod_price

?FROMproducts

?WHEREprod_nameLIKEinchteddybear';

?四、連接和組合

?連接(JOIN)

?概述

?如果一個(gè)JOIN至少有一個(gè)公共字段并且它們之間存在關(guān)系,則該JOIN可以在兩個(gè)或多個(gè)

表上工作。

?連接用于連接多個(gè)表,使庠JOIN關(guān)鍵字,并且條件語句使用ON而不是WHERE。

?JOIN保持基表(結(jié)構(gòu)和數(shù)據(jù))不變。

?JOIN有兩種連接類型:內(nèi)連接和外連接。

?內(nèi)連接又稱等值連接,使用INNERJOIN關(guān)鍵字。在沒有條件語句的情況下返回笛卡爾積。

?白連接可以看成內(nèi)連接的一種,只是連接的表是自身而已。

?自然連接是把同名列通過=測試連接起來的,同名列可以有多個(gè)。

?內(nèi)連接vs自然連接

?內(nèi)連接提供連接的列,而自然連接自動(dòng)連接所有同名列。

?外連接返回一個(gè)表中的所有行,并且僅返回來自次表中滿足連接條件的那些行,即兩個(gè)表

中的列是相等的。外連接分為左外連接、右外連接、全外連接(Mysql不支持)。

?左外連接就是保留左表沒有關(guān)聯(lián)的行。

?右外連接就是保留右表沒有關(guān)聯(lián)的行。

?連接vs子查詢

?連接可以替換子查詢,并且比子查詢的效率一般會更快。

SQLJOINS

SEll-CT<iekci.HM>

FROMTabkAA

INNERJOINTabkBB

ONAKcy:B.Kcy

SELECT<M1CCI.UM>SEIJ£CT<*dcctUM>

FROMTaMeAAFROMTabteAA

UiFTJOINTaNcRBRIGKTJOINTabkBB

八■K"BK..ONA.Key=B.Kcy

WHEREB.Kcy1SNVU.?HEREA.Kcy1$NULL

MilJiCTVyEJS腐毆;2

FROMTubleAAFlIXOUTURJOINTobkBH

FVIXOUTERJOINTabkBHONA.Kcy-B.Kcy

ONAKcy=B.Kcy0HEREA.Kc>ISNVIX

ORILKcyISNUIX

?內(nèi)連接(INNERJOIN)

?SELECTvend_name,prod_name,prod_price

?FROMvendorsINNERJOINproducts

?ONvendors.vend_id=products.vend_id;

?自連接

?SELECTcl.custjd,cl.cust_name,cl.cust_contact

?FROMcustomerscl,customersc2

?WHEREcl.cust_name=c2.cust_name

?ANDc2.cust_contact='JimJones';

?自然連接(NATURALJOIN)

?SELECT*

?FROMProducts

?NATURALJOINCustomers;

?左連接(LEFTJOIN)

?SELECTcustomers.custjd,orders.order_num

?FROMcustomersLEFTJOINorders

?ONcustomers.custjd=orders.cust_id;

?右連接(RIGHTJOIN)

?SELECTcustomers.custjd,orders.order_num

?FROMcustomersRIGHTJOINorders

?ONcustomers.cust_id=orders.cust_id;

?組合(UNION)

?概述

?UNION運(yùn)算符將兩個(gè)或更多查詢的結(jié)果組合起來,并生成一個(gè)結(jié)果集,其中包含來自

UNION中參與查詢的提取行。

?UNION基本規(guī)則

?所有查詢的列數(shù)和列順序必須相同。

?每個(gè)查詢中涉及表的列的數(shù)據(jù)類型必須相同或兼容。

?通常返回的列名取自第一個(gè)查詢。

?默認(rèn)會去除相同行,如果需要保留相同行,使用UNIONALL。

?只能包含一個(gè)ORDERBY子句,并且必須位于語句的最后。

?應(yīng)用場景

?在一個(gè)查詢中從不同的表返回結(jié)構(gòu)數(shù)據(jù)。

?對一個(gè)表執(zhí)行多個(gè)查詢,按一個(gè)查詢返回?cái)?shù)據(jù)。

?組合查詢

?SELECTcust_name,cust_contactfcust_email

?FROMcustomers

?WHEREcust.stateIN('IL','IN','MI')

?UNION

?SELECTcust_name,cust_contact,cust_email

?FROMcustomers

?WHEREcust_name='Fun4AH';

?JOINvsUNION

?JOIN中連接表的列可能不同,但在UNION中,所有查詢的列數(shù)和列順序必須相同。

?UNION將查詢之后的行放在一起(垂直放置),但JOIN將查詢之后的列放在一起(水平

放置),即它構(gòu)成一個(gè)笛卡爾積。

?五、函數(shù)

□注意:不同數(shù)據(jù)庫的函數(shù)往往各不相同,因此不可移植。本節(jié)主要以Mysql的函數(shù)為例。

?文本處理

?圖示

函數(shù)說明

LEFT。、RIGHTO左邊或者右邊的手將

LOVER。、UPPER0轉(zhuǎn)接為小寫或者大寫

LTRIMO.RTIMO去除左邊或者右邊的空喀

LEBGTHO長度

轉(zhuǎn)的謂音值工卜飾源社%

SOUNDEX0P

?其中,SOUNDEX0可以將一個(gè)字符串轉(zhuǎn)換為描述其語音表示的字母數(shù)字模式。

?SELECT*

?FROMmytable

?WHERESOUNDEX(coll)=SOUNDEX('apple')

?日期和時(shí)間處理

?日期格式:YYYY-MM-DD

?時(shí)間格式:HH:MM:SS

?圖示

函放購明

AddDateO本m-個(gè)日刊(天、K9)

AddTlMO■tO一個(gè)時(shí)網(wǎng)(BJ.分等)

CuxDat?()返但臺mE期

CUXTIMO逅13■的時(shí)恒1

DftteO遁應(yīng)日期時(shí)間的E再部分

D&teHiffO計(jì)弼個(gè)E期之工

Date.Md()高席昊活的日期的載

Dste_For>at<>返回一個(gè)格式化的E期或融商?

DayO返國一個(gè)BIB的天數(shù)部分

DayOfVMk0對于一個(gè)EJB,逅值對應(yīng)的星期幾

Hour()逅@一個(gè)時(shí)涌的小心部分

IinuttO返回一個(gè)時(shí)】司的分1,都分

Month()亞目一個(gè)E期的月6部分

NovO運(yùn)叵蟲的E期切外何

Sec?sid<)返回一個(gè)時(shí)間的625分

TiwoO返回一個(gè)ESW國的臥前郃分

TearO返圓一個(gè)E*修舊部分之萬深牡口

?代碼示例:

?mysql>SELECTNOW();

?2018-4-1420:25:11

■數(shù)值處理

?圖示

函數(shù)說明

SINOIES

COSO余無

TANO正切

ABS()絕對值

SQRTO平方根

MODO余數(shù)

EXPO指數(shù)

PK)國周率

RANDO隨機(jī)政二腦外產(chǎn)開滿i社Z

?匯總

?圖示

函敷說明

ATC()逅回至列的平均值

COUNT()返回某列的行數(shù)

MAXO返回某列的倭大值

MIHO返回基列的M小值

SUMO逅回某列值之和外IP開源社區(qū)

?使用DISTINCT可以讓匯總函數(shù)值匯總不同的值。

?SELECTAVG(DISTINCTcoll)ASavg_col

?FROMmytable

?六、排序和分組

?ORDERBY

?ORDERBY用于對結(jié)果集進(jìn)行排序。

?ASC:升序(默認(rèn))

?DESC:降序

?可以按多個(gè)列進(jìn)行排序,并且為每個(gè)列指定不同的排序方式

?指定多個(gè)列的排序方向

?SELECT*FROMproductsORDERBYprod_priceDESC,ASC;

?GROUPBY

?概述

?GROUPBY子句將記錄分組到匯總行中。

?GROUPBY為每個(gè)組返回一個(gè)記錄。

?GROUPBY通常還涉及聚合:COUNT,MAX,SUM,AVG等。

?GROUPBY可以按一列或多列進(jìn)行分組。

?GROUPBY按分組字段進(jìn)行排序后,ORDERBY可以以匯總字段來進(jìn)行排序。

?分組

?SELECTcust_name,COUNT(cust_address)ASaddr_num

?FROMCustomersGROUPBYcust_name;

?分組后排序

?SELECTcust_name,COUNT(cust_address)ASaddr_num

?FROMCustomersGROUPBYcust_name

?ORDERBYcust_nameDESC;

?HAVING

?概述

?HAVING用于對匯總的GROUPBY結(jié)果進(jìn)行過濾。

?HAVING要求存在一個(gè)GROUPBY子句。

?WHERE和HAVING可以在相同的查詢中。

?HAVINGvsWHERE

?WHERE和HAVING都是用于過濾。

?HAVING適用于匯總的組記錄;而WHERE適用于單個(gè)記錄。

?使用WHERE和HAVING過濾數(shù)據(jù)

?SELECTcust_name,COUNT(*)ASnum

?FROMCustomers

?WHEREcust.emailISNOTNULL

?GROUPBYcust_name

?HAVINGCOUNT(*)>=1;

?(以下為DDL語句用法)

?七、數(shù)據(jù)定義

DDL的主要功能是定義數(shù)據(jù)庫對象(如:數(shù)據(jù)庫、數(shù)據(jù)表、視圖、索引等)。

?數(shù)據(jù)庫(DATABASE)

?創(chuàng)建數(shù)據(jù)庫

?CREATEDATABASEtest;

?刪除數(shù)據(jù)庫

?DROPDATABASEtest;

?選擇數(shù)據(jù)庫

?USEtest;

?數(shù)據(jù)表(TABLE)

?創(chuàng)建數(shù)據(jù)表

?普通創(chuàng)建

?CREATETABLEuser(

?idint(10)unsignedNOTNULLCOMMENT'Id;

?usernamevarchar(64)NOTNULLDEFAULT'default'COMMENT'用戶名:

?passwordvarchar(64)NOTNULLDEFAULT'default'COMMENT'密碼',

?emailvarchar(64)NOTNULLDEFAULT'default*COMMENT'郵箱’

?)COMMENT='用戶表;

?根據(jù)已有的表創(chuàng)建新表

?CREATETABLEvip_userAS

?SELECT*FROMuser;

?刪除數(shù)據(jù)表

?DROPTABLEuser;

?修改數(shù)據(jù)表

?添加列

?ALTERTABLEuser

?ADDageint(3);

?刪除列

?ALTERTABLEuser

?DROPCOLUMNage;

?修改列

?ALTERTABLE'user'

?MODIFYCOLUMNagetinyint;

?添加主鍵

?ALTERTABLEuser

?ADDPRIMARYKEY(id);

?刪除主鍵

?ALTERTABLEuser

?DROPPRIMARYKEY;

■視圖(VIEW)

?定義

?視圖是基于SQL語句的結(jié)果集的可視化的表。

?視圖是虛擬的表,本身不包含數(shù)據(jù),也就不能對其進(jìn)行索引操作。對視圖的操作和對普通

表的操作一樣。

?作用

?簡化復(fù)雜的SQL操作,比如復(fù)雜的聯(lián)結(jié);

?只使用實(shí)際表的一部分?jǐn)?shù)據(jù);

?通過只給用戶訪問視圖的權(quán)限,保證數(shù)據(jù)的安全性;

?更改數(shù)據(jù)格式和表示。

?創(chuàng)建視圖

?CREATEVIEWtop_10_user_viewASSELECTid,usernameFROMuserWHEREid<10;

?刪除視圖

?DROPVIEWtop_10_user_view;

?索引(INDEX)

?作用

?通過索引可以更加快速高效地查詢數(shù)據(jù)。

?用戶無法看到索引,它們只能被用來加速杳詢。

?注意

?更新一個(gè)包含索引的表需要比更新一個(gè)沒有索引的表花費(fèi)更多的時(shí)間,這是由于索引本身

也需要更新。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引。

?唯一索引

?唯一索引表明此索引的每一個(gè)索引值只對應(yīng)唯一的數(shù)據(jù)記錄。

?創(chuàng)建索引

?CREATEINDEXuserJndexONuser(id);

?創(chuàng)建唯一索引

?CREATEUNIQUEINDEXuserjndexONuser(id);

?刪除索引

?ALTERTABLEuserDROPINDEXuserjndex;

?約束

SQL約束用于規(guī)定表中的數(shù)據(jù)規(guī)則.

?概述

?如果存在違反約束的數(shù)據(jù)行為,行為會被約束終止。

?約束可以在創(chuàng)建表時(shí)規(guī)定(通過CREATETABLE語句),或者在表創(chuàng)建之后規(guī)定(通過

ALTERTABLE語句)。

?約束類型

?NOTNULL-指示某歹!J不能存儲NULL值。

?UNIQUE-保證某列的每行必須有唯一的值。

?PRIMARYKEY-NOTNULL和UNIQUE的結(jié)合。確保某列(或兩個(gè)列多個(gè)列的結(jié)合)

有唯一標(biāo)識,有助于更容易更快速地找到表中的一個(gè)特定的記錄。

?FOREIGNKEY-保證一個(gè)表中的數(shù)據(jù)匹配另一個(gè)表中的值的參照完整性。

?CHECK-保證列中的值符合指定的條件。

?DEFAULT-規(guī)定沒有給列賦值時(shí)的默認(rèn)值。

?創(chuàng)建表時(shí)使用約束條件:

?CREATETABLEUsers(

?IdINT(IO)UNSIGNEDNOTNULLAUTOJNCREMENTCOMMENT'自增Id',

?UsernameVARCHAR(64)NOTNULLUNIQUEDEFAULT'default'COMMENT'用戶名

?PasswordVARCHAR(64)NOTNULLDEFAULT'default'COMMENT'密碼

?EmailVARCHAR(64)NOTNULLDEFAULT'default'COMMENT'郵箱地址',

?EnabledTINYINT(4)DEFAULTNULLCOMMENT'是否有效

?PRIMARYKEY(Id)

?)ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8mb4

COMMENT=,用戶表';

?(以下為TCL語句用法)

?八、事務(wù)處理

?概述

?不能回退SELECT語句,回退SELECT語句也沒意義;也不能回退CREATE和DROP語句。

?MySQL默認(rèn)是隱式提交,每執(zhí)行一條語句就把這條語句當(dāng)成一個(gè)事務(wù)然后進(jìn)行提交。當(dāng)出現(xiàn)

STARTTRANSACTION語句時(shí),會關(guān)閉隱式提交;當(dāng)COMMIT或ROLLBACK語句執(zhí)行后,

事務(wù)會自動(dòng)關(guān)閉,重新恢復(fù)隱式提交。

?通過setautocommit=0可以取消自動(dòng)提交,直到setautocommit=1才會提交;

autocommit標(biāo)記是針對每個(gè)連接而不是針對服務(wù)器的。

?指令

?STARTTRANSACTION-指令用于標(biāo)記事務(wù)的起始點(diǎn)。

?SAVEPOINT-指令用于創(chuàng)建保留點(diǎn)。

?ROLLBACKTO-指令用于回滾到指定的保留點(diǎn);如果沒有設(shè)置保留點(diǎn),則回退到START

TRANSACTION語句處。

?COMMIT-提交事務(wù)。

?-開始事務(wù)

?STARTTRANSACTION;

?-插入操作

?AINSERTINTOuser'

?VALUES(1,'rootl;,rootl','xxxx@163.com');

?-創(chuàng)建保留點(diǎn)updateA

?SAVEPOINTupdateA;

?-插入操作B

?INSERTINTO'user'VALUES(2,70012','root2\'xxxx@163.com');

?-回滾到保留點(diǎn)updateA

?ROLLBACKTOupdateA;

?提交事務(wù),只有操作A生效

?COMMIT;

?(以下為DCL語句用法)

?九、權(quán)限控制

?概述

?GRANT和REVOKE可在幾個(gè)層次上控制訪問權(quán)限:

?整個(gè)服務(wù)器,使用GRANTALL和REVOKEALL;

?整個(gè)數(shù)據(jù)庫,使用ONdatabase.*;

?特定的表,使用ONdatabase.table;

?特定的列;

?特定的存儲過程。

?新創(chuàng)建的賬戶沒有任何權(quán)限。

?賬戶用username@host的形式定義,username@%使用的是默認(rèn)主機(jī)名。

?MySQL的賬戶信息保存在mysql這個(gè)數(shù)據(jù)庫中。

?USEmysql;SELECTuserFROMuser;復(fù)制代碼

?創(chuàng)建賬戶

?CREATEUSERmyuserIDENTIFIEDBY'mypassword';

?修改賬戶名

?UPDATEuserSETuser='newuser'WHEREuser="myuser,;

?FLUSHPRIVILEGES;

■刪除賬戶

?DROPUSERmyuser;

?查看權(quán)限

?SHOWGRANTSFORmyuser;

?授予權(quán)限

?GRANTSELECT,INSERTON*.*TOmyuser;

?刪除權(quán)限

?REVOKESELECT,INSERTON*.*FROMmyuser;

?更改密碼

?SETPASSWORDFORmyuser='mypass,;

?十、存儲過程

?概述

?存儲過程可以看成是對一系列SQL操作的批處理;

?使用存儲過程的好處

?代碼封裝,保證了一定的安全性;

?代碼復(fù)用;

?由于是預(yù)先編譯,因此具有很高的性能。

?創(chuàng)建存儲過程

?命令行中創(chuàng)建存儲過程需要自定義分隔符,因?yàn)槊钚惺且?;為結(jié)束符,而存儲過程中也包

含了分號,因此會錯(cuò)誤把這部分分號當(dāng)成是結(jié)束符,造成語法錯(cuò)誤。

?包含in、out和inout三和參數(shù)。

?給變量賦值都需要用selectinto語句。

?每次只能給一個(gè)變量賦值,不支持集合的操作。

?創(chuàng)建存儲過程

?DROPPROCEDUREIFEXISTSproc.adder';

?DELIMITER;;

?CREATEDEFINER='root'@'lpcalhost'PROCEDURE'proc_adder'(INaint,INbint,OUT

sumint)

?BEGIN

?DECLAREcint;

?ifaisnullthenseta=0;

?endif;

?ifbisnullthensetb=0;

?endif;

?setsum=a+b;

?END

?;;

?DELIMITER;

?使用存儲過程

?set@b=5;

?callproc_adder(2,@b,@s);

?select@sassum;

?H-、淵示

*Mi*

?游標(biāo)(cursor)是一個(gè)存儲在DBMS服務(wù)器上的數(shù)據(jù)庫查詢,它不是一條SELECT語句,而是

被該語句檢索出來的結(jié)果集。

?在存儲過程中使用游標(biāo)可以對一個(gè)結(jié)果集進(jìn)行移動(dòng)遍歷。

?游標(biāo)主要用于交互式應(yīng)用,其中用戶需要對數(shù)據(jù)集中的任意行進(jìn)行瀏覽和修改。

?使用游標(biāo)的四個(gè)步驟:

?聲明游標(biāo),這個(gè)過程沒有實(shí)際檢索出數(shù)據(jù);

?打開游標(biāo);

?取出數(shù)據(jù);

?關(guān)閉游標(biāo);

?SQL語句示例:

?DELIMITER$

?CREATEPROCEDUREgetTotal()

?BEGIN

?DECLAREtotalINT;

?-創(chuàng)建接收游標(biāo)數(shù)據(jù)的變量

?DECLAREsidINT;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論