SQL基礎語言mysql
一.概述:sql
SQL是英文Structured Query Language的縮寫,意思爲結構化查詢語言。SQL有兩個特色:全部數據存儲在表中;從SQL的角度來講,表中的記錄沒有順序。數據庫
絕大多數流行的關係型數據庫管理系統,採用了SQL語言標準。express
二.數據定義:服務器
1.建立表;ide
create table語句的使用格式以下:函數
create table tablenameui
(column1 data type [constraint],spa
column2 data type [constraint],線程
column3 data type [constraint]);
例子:
create table employee
(employee_id, IDENTITY //每一個表能夠有一個也只能有一個標識字段;
firstname varchar(15) NULL, //容許空值;
lastname varchar(20),
age number(3),
address varchar(30),
city varchar(20) DEFAULT‘USA’); //city缺省值被設置爲美國;
簡單來講,建立新表格時,在關鍵詞create table後面加入所要創建的表格的名稱,而後在括號內順次設定各列的名稱,數據類型,以及可選的限制條件等。注意,全部的SQL語句在結尾處都要使用「;」符號。
2.建立索引:
索引在表數據量大的地方增長方有效,有索引地方查詢快,插入更新則慢些。索引有兩種類型:聚簇索引和非聚簇索引。
(1).非聚簇索引:
CREATE INDEX mycolumn_index ON mytable (myclumn)
這個語句創建了一個名爲mycolumn_index的索引。你能夠給一個索引發任何名字,但你應該在索引名中包含所索引的字段名,這對你未來弄清楚創建該索引的意圖是有幫助的。索引mycolumn_index對錶mytable的mycolumn字段進行。這是個非聚簇索引,也是個非惟一索引。
若是你須要改變一個索引的類型,你必須刪除原來的索引並重建一個。創建了一個索引後,你能夠用下面的SQL語句刪除它:
DROP INDEX mytable.mycolumn_index
(2).一個聚簇索引:
可使用關鍵字CLUSTERED。)記住一個表只能有一個聚簇索引。(這裏有一個如何對一個表創建聚簇索引的例子:
CREATE CLUSTERED INDEX mycolumn_clust_index ON mytable(mycolumn)
若是表中有重複的記錄,當你試圖用這個語句創建索引時,會出現錯誤。可是有重複記錄的表也能夠創建索引;你只要使用關鍵字ALLOW_DUP_ROW把這一點告訴SQL Sever便可:
CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)
WITH ALLOW_DUP_ROW
這個語句創建了一個容許重複記錄的聚簇索引。你應該儘可能避免在一個表中出現重複記錄,可是,若是已經出現了,你可使用這種方法。
要對一個表創建惟一索引,可使用關鍵字UNIQUE。對聚簇索引和非聚簇索引均可以使用這個關鍵字。這裏有一個例子:
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
3.數據類型:
序號 |
數據類型名稱 |
定義標識 |
備註 |
1 |
日期時間型 |
datetime(8B)/smalldatetime(4B) |
二者存儲長度,時間範圍,精度不一樣 |
2 |
整數型 |
bigint(8B)/int(4B)/smallint(2B)/tinyint(1B) |
|
3 |
精確數值型 |
decimal(numeric)/ |
decimal(p[,s]);p精度,s小數位數 |
4 |
近似數值型 |
float(8B)/real(4B) |
|
5 |
貨幣型 |
money(8B)/smallmoney(4B)/ |
符號:¥、$、£等 |
6 |
位型 |
bit |
只有0和1,輸入0覺得的其餘值均當1看待 |
7 |
字符型 |
char(固定長度)、varchar(可變長度)、text |
均爲非Unicode型 |
8 |
Unicode型 |
nchar(固定長度)、nvarchar(可變長度)、ntext |
均爲Unicode型 |
9 |
二進制數據型 |
binary/varbinary/images |
經常使用於存儲圖像 |
10 |
特殊數據型 |
cursor、uniqueidentifier、timestamp、table、sql_variant |
|
用戶自定義數據類型:建立:sp_addtype;查看:sp_help;命名:sp_rename'old','new';刪除:sp_droptype |
4.刪除數據庫表、刪除索引:
要刪除數據庫表(包括該表存儲的全部記錄),使用 DROP TABLE 命令:
DROP TABLE table_name;
要刪除 SUPPLIER 表,使用下面語句:
DROP TABLE SUPPLIER;
DROP INDEX 命令用於刪除一個索引:
DROP INDEX index_name;
三.數據操做
1.添加新記錄
一旦表建立完成(參閱 建立表),就能夠用命令 INSERT INTO 向裏面填充元組。
Insert語句的使用格式以下:
insert into tablename (first_column,...last_column) values (first_value,...last_value);
例如:
insert into employee (firstname, lastname, age, address, city) values (‘Li’, ‘Ming’, 45, ‘No.77 Changan Road’, ‘Beijing」);
你也許已經注意到,INSERT 語句與DELETE語句和UPDATE語句有一點不一樣,它一次只操做一個記錄。然而,有一個方法可使INSERT 語句一次添加多個記錄。要做到這一點,你須要把INSERT 語句與SELECT 語句結合起來,象這樣:
使用 INSERT ... SELECT 語句,你能夠從一個或多個表中讀取多個記錄行,並將其快速地插入到一個表中。
INSERT INTO tblTemp2 (fldID)
SELECT tblTemp1.fldOrder_ID
FROM tblTemp1
WHERE tblTemp1.fldOrder_ID > 100;
INSERT mytable (first_column,second_column)
SELECT another_first,another_second
FROM anothertable
WHERE another_first=’Copy Me!’
當爲一個表中的記錄創建備份時,這種形式的INSERT 語句是很是有用的。若是你須要拷貝整個表,你可使用SELECT INTO語句
SELECT * INTO newtable FROM mytable
2.更新記錄
update語句的格式爲:
update tablename
set columnname = newvalue [, nextcolumn = newvalue2...]
where columnname OPERATOR value [and|or column OPERATOR value];
例如:
update employee set age = age+1
where first_name= ‘Mary’and last_name= ‘Williams’;
使用update語句時,關鍵一點就是要設定好用於進行判斷的where條件從句。
3.刪除記錄:
Delete語句的格式爲:
delete from tablename
where columnname OPERATOR value [and|or column OPERATOR value];
例如:
delete from employee
where lastname = May;
在delete from關鍵詞以後輸入表格名稱,而後在where從句中設定刪除記錄的判斷條件。注意,若是用戶在使用delete語句時不設定where從句,則表格中的全部記錄將所有被刪除。
四.數據查詢
Select語句的完整語法格式以下:
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ AS output_name ] [, ...]
[ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ { UNION | INTERSECT | EXCEPT [ ALL ] } select ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
[ FOR UPDATE [ OF class_name [, ...] ] ]
[ LIMIT { count | ALL } [ { OFFSET | , } start ]]
說明:用中括號([])括起來的部分表示是可選的,用大括號({})括起來的部分是表示必須從中選擇其中的一個。
舉例以下:
select firstname, lastname, city
from employee
where firstname LIKE ‘E%’;
上述SQL語句將會查詢全部名稱以E開頭的姓名。
select * from employee
where firstname = ‘May’;
上述SQL語句將會查詢全部名稱爲May的行。
在 SELECT語句裏使用 "*" 將檢索出表中的全部屬性。
1. ALL、DISTINCT、DISTINCTROW、TOP謂詞
(1) ALL 返回知足SQL語句條件的全部記錄。若是沒有指明這個謂詞,默認爲ALL。
例:SELECT ALL FirstName,LastName
FROM Employees
(2) DISTINCT若是有多個記錄的選擇字段的數據相同,只返回一個。取出互不相同的記錄,若要在如下的表格,Store_Info,找出全部不一樣的店名時:
SELECT DISTINCT store_name FROM Store_Info
(3) DISTINCTROW 若是有重複的記錄,只返回一個
(4) TOP顯示查詢頭尾若干記錄。也可返回記錄的百分比,這是要用 TOP N PERCENT子句(其中N 表示百分比)
例:返回5%訂貨額最大的定單
SELECT TOP 5 PERCENT*
FROM [ Order Details]
ORDER BY UnitPrice*Quantity*(1-Discount) DESC
2. 爲字段取別名方法
方法一:stuid as '編號'
方法二:stuid 編號 , stuid '編號' 都是正確的寫法。
方法三:'編號' = stuid 一樣單引號’也是能夠省略的。
3.運算符(WH ERE子句)
查詢功能 |
操做符 |
比較查詢 |
=、<、>、>=、<=、<>、!=、!<、!> |
範圍查詢 |
BETWEEN……AND、NOT BETWEEN……AND |
列表查詢 |
IN、NOT IN |
字符串匹配查詢 |
LIKE、NOT LIKE |
空值判斷查詢 |
IS NULL、IS NOT NULL |
邏輯判斷查詢 |
AND、OR、NOT |
(1)操做運算用例:
你可使用大多數標準的數學運算符來操做字段值,如加(+),減(-),乘(*)和除(/)。你也能夠一次對多個字段進行運算,
SELECT price "Original price", price*2 "New price" FROM titles
(2)BETWEEN用例:
若我們要由 Store_Information 表格中找出全部介於 January 6, 1999 及 January 10, 1999 中的資料,
SELECT *
FROM Store_Information
WHERE Date BETWEEN 'Jan-06-1999' AND 'Jan-10-1999'
(3) IN用例:
IN 運算符用來匹配列表中的任何一個值。IN子句能夠代替用OR子句鏈接的一連串的條件。
若我們要在 Store_Information 表格中找出全部含蓋 Los Angeles 或 San Diego 的資料,
SELECT *FROM Store_Information
WHERE store_name IN ('Los Angeles', 'San Diego')
(4)LIKE用法:
A、表明多個字符
‘* ’
c*c :表明cc,cBc,cbc,cabdfec等,它同於DOS命令中的通配符,表明多個字符;
張* :表明查詢以「張」字開頭的記錄;
*張 :表明查詢以「張」字結尾的記錄;
‘%’
%c%:表明agdcagd等;
張% :表明查詢以「張」字開頭的記錄;
%張 :表明查詢以「張」字結尾的記錄;
通配符「*」與「%」的區別?
select * from table1 where name like '*明*'
select * from table1 where name like '%明%'
你們會看到,前一條語句列出來的是全部的記錄,然後一條記錄列出來的是name字段中含有「明」的記錄,因此說,當咱們做字符型字段包含一個子串的查詢時最好採用「%」而不用「*」,用「*」的時候只在開頭或者只在結尾時,而不能兩端全由「*」代替任意字符的狀況下。
B、表明單個字符
‘?’
b?b表明brb,bFb等;同於DOS命令中的?通配符,表明單個字符
‘#’
k#k表明k1k,k8k,k0k ;大體同上,不一樣的是代只能表明單個數字
‘-’:表明一個字符
[a-z]表明a到z的26個字母中任意一個;指定一個範圍中任意一個
‘[!字符]’
[!a-z]表明9,0,%,*等;它只表明單個字符
‘[!數字]’
[!0-9]表明A,b,C,d等;它只表明單個字符
(5)空值:
空值實際是指一種未知的、不存在或不可應用的資料,一般用NULL表示,NULL僅僅是一個符號,它不等於0也不等於空字符。
(6)OR或AND用例:
舉例來說,我們若要在 Store_Information 表格中選出全部 Sales 高於 $1,000 或是 Sales 在 $500 及 $275 之間的資料的話
SELECT store_name
FROM Store_Information
WHERE Sales > 1000
OR (Sales < 500 AND Sales > 275)
4. ORDER BY查詢結果排序:
若我們要依照 Sales 欄位的由大往小列出 Store_Information 表格中的資料,
SELECT store_name, Sales, Date
FROM Store_Information
ORDER BY Sales,Date DESC
ASC:指定遞增順序;
DESC:指定遞減順序;
5.聚合函數用例:MAX、SUM、AVG、MIN、COUNT等
聚合函數是對錶種的一組行的某個列進行計算並返回單個值的函數。聚合函數不能用在SELECT語句的WHERE子句中;聚合函數忽略空值;一個彙集對整個 SELECT 語句計算的結果是生成一個結果.但若是在一個查詢裏面聲明瞭分組(GROUP BY),要讓一個使用 GROUP BY 和彙集操做符的查詢的結果有意義, 那麼用於分組的屬性也必須出如今目標列表中;數據庫將對每一個組進行一次獨立的計算,而且 彙集結果是按照各個組出現的。還要注意的是在彙集上彙集是沒有意義的,好比,AVG(MAX(sno))。
SUM 和 AVG 只能對數字列使用,例如 int、smallint、tinyint、decimal、numeric、float、real、money 和 smallmoney 數據類型;相反的, Min和Max就沒有這麼嚴格的限定, 它們能夠操做那些實現了Icomparable的元素, 例如string,但不能對 bit 數據類型使用。除 COUNT(*) 外,其它聚合函數均不能對 text 和 image 數據類型使用。
Sum和Average操做必需是關於數值類型(int, long, float, double以及nullable版本),此外, Average老是返回decimal或者double二者之一:
1.若是選擇器類型是decimal,則返回類型也是decimal
2.若是選擇器類型是int, long, float, double, 則返回類型是double
這意味着下面的查詢沒法編譯(由於double不能爲自動轉換爲int)
1: int avg = new int[] { 3, 4 }.Average();
SELECT "函數名"("列名")
FROM "表格名"
例如:SELECT SUM(Sales) FROM Store_Information
SELECT COUNT(au_lname) FROM authors WHERE au_lname=’Ringer’名字可重複
SELECT COUNT(DISTINCT au_lname) FROM authors 名字不重複,假如你投幾票,也只記錄到一票;
6. GROUP BY用例:
若是咱們的需求變成是要算出每一間店 (store_name) 的營業額 (sales),
SELECT store_name, SUM(Sales)
FROM Store_Information
GROUP BY store_name
GROUP BY與ORDER BY區別?
答:在sql命令格式使用的前後順序上,group by先於order by。
order by是按字段排序:order by 從英文裏理解就是行的排序方式,默認的爲升序。 order by 後面必須列出排序的字段名,能夠是多個字段名。order by是按指定的列的升序或降序來給查詢結果排序, 它不須要查詢結果中出現order by的欄位。更改Order by裏的欄位只影響查詢結果的順序,而不影響查詢出的記錄總數,和每條記錄的內容。
group by是按字段分類:group by 從英文裏理解就是分組。必須有「聚合函數」來配合才能使用,使用時至少須要一個分組標誌字段。使用group by 的目的就是要將數據分類彙總。group by是按指定的列對知足Where條件的全部記錄分組,並對組內的一些數值型欄位計算出每組的一個統計指標,如求和、求個數、求平均值、求最大值、求最小值等等;它對查詢結果有個要求:查詢結果中的出現的欄位必須是Group by中欄位的子集。更改Group by裏欄位的順序不會對查詢結果有任何影響;可是更改Group by的欄位,會對查詢獲得的記錄數量,以及各個彙總函數的結果形成影響。
通常如: select 單位名稱,count(職工id),sum(職工工資) form [某表]
group by 單位名稱
這樣的運行結果就是以「單位名稱」爲分類標誌統計各單位的職工人數和工資總額。
6. HAVING用例:
若我們要找出 Sales 大於 $1,500 的 store_name,我們就鍵入,
SELECT store_name, SUM(sales)
FROM Store_Information
GROUP BY store_name
HAVING SUM(sales) > 1500
HAVING與WHERE區別?
答:HAVING只能與SELECT語句一塊兒使用,一般在GROUP BY 子句中使用它,若是不使用GROUP BY子句,則HAVING的做用與WHERE子句同樣。HAVING子句中不能使用text、image和ntext數據類型列項。與WHERE子句不一樣的是,在HAVING子句中可使用聚合函數。
若是咱們想知道那些銷售超過一個部件的供應商,使用下面查詢:
SELECT S.SNO, S.SNAME, COUNT(SE.PNO)
FROM SUPPLIER S, SELLS SE
WHERE S.SNO = SE.SNO
GROUP BY S.SNO, S.SNAME
HAVING COUNT(SE.PNO) > 1;
在 WHERE 和 HAVING 子句裏,容許在任何要產生數值的地方使用子查詢 (子選擇)。 這種狀況下,該值必須首先來自對子查詢的計算,HAVING的做用將變成第二次篩選結果集。
若是咱們想知道全部比名爲 'Screw' 的部件貴的部件,咱們能夠用下面的查詢:
SELECT * FROM PART
WHERE PRICE > (SELECT PRICE FROM PART
WHERE PNAME='Screw');
當咱們檢查上面的查詢時會發現出現了兩次 SELECT 關鍵字。 第一個在查詢的開頭 - 咱們將稱之爲外層 SELECT - 而另外一個在 WHERE 子句裏面,成爲一個嵌入的查詢 - 咱們將稱之爲內層 SELECT。 對外層 SELECT 的每條記錄都必須先計算內層 SELECT。在完成全部計算以後, 咱們得知名爲 'Screw' 部件的記錄的價格, 而後咱們就能夠檢查那些價格更貴的記錄了。
7. 操做多個表用例:
方法一:同時從表authors和表titles中取出數據:
SELECT au_lname ,title FROM authors, titles
看一下查詢結果。你會發現一些奇怪的出乎意料的狀況:做者的名字並無和它們所著的書相匹配,而是出現了做者名字和書名的全部可能的組合,這也許不是你所但願見到的。
出了什麼差錯?問題在於你沒有指明這兩個表之間的關係。你沒有經過任何方式告訴SQL如何把表和表關聯在一塊兒。因爲不知道如何關聯兩個表,服務器只能簡單地返回取自兩個表中的記錄的全部可能組合。
要從兩個表中選出有意義的記錄組合,你須要經過創建兩表中字段的關係來關聯兩個表。要作到這一點的途徑之一是建立第三個表,專門用來描述另外兩個表的字段之間的關係。
表authors有一個名爲au_id的字段,包含有每一個做者的惟一標識。表titles有一個名爲title_id的字段,包含每一個書名的惟一標識。若是你能在字段au_id和字段title_id 之間創建一個關係,你就能夠關聯這兩個表。數據庫pubs中有一個名爲titleauthor的表,正是用來完成這個工做。
SELECT au_name,title FROM authors,titles,titleauthor
WHERE authors.au_id=titleauthor.au_id
AND titles.title_id=titleauthor.title_id
方法二:SQL的內聯接和外聯接
表Table1 記錄以下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115
表Table2 記錄以下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408
內聯接:兩個表存在主外鍵關係時經常使用內聯接查詢。內鏈接只鏈接匹配的行;
SELECT * FROM Table1 INNER JOIN Table2 ON No1=No2
結果以下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
(所影響的行數爲 4 行)
左外聯接:結果包括左表的全部行,若是左表的行在右表中沒有匹配的行,則爲空值 以左表記錄爲基準
包含左邊表的所有行(無論右邊的表中是否存在與它們匹配的行),以及右邊表中所有匹配的行
SELECT * FROM Table1 LEFT (OUTER可省) JOIN Table2 ON No1=No2
結果以下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
(所影響的行數爲 5 行)
右外聯接:和左外聯接相反 以右表記錄爲基準
包含右邊表的所有行(無論左邊的表中是否存在與它們匹配的行),以及左邊表中所有匹配的行
SELECT * FROM Table1 RIGHT JOIN Table2 ON No1=No2
結果以下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
(所影響的行數爲 5 行)
徹底外聯接:返回左表和右表中的全部行(FULL JOIN)
包含左、右兩個表的所有行,無論另一邊的表中是否存在與它們匹配的行。其相互之間無匹配關係的字段所有顯示爲null.
SELECT * FROM Table1 FULL JOIN Table2 ON No1=No2
結果以下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
5 a20050115 NULL NULL
(所影響的行數爲 6行)
交叉聯接:返回的行數是左表與右錶行數的乘積(CROSS JOIN)
SELECT *FROM table1 CROSS JOIN table2;
8.聯合查詢
Union, Intersect, Except(聯合,相交,相異)三者用法同樣。
UNION
用於將多個 SELECT
語句的結果聯合到一個結果集中。例如:
(SELECT a FROM table_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM table_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10)
ORDER BY a;
下面是相交( INTERSECT)的例子:
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 1
INTERSECT
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO < 3;
最後是一個 EXCEPT 的例子:
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 1
EXCEPT
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 3;
9. CUBE和ROLLUP區別
CUBE運算符:在GROUP BY子句中包含CUBE選項時,查詢結果不只包含由GROUP BY提供的正常行,還包含對查詢結果進行彙總統計;CUBE和ROLLUP之間的區別在於:
CUBE 生成的結果集顯示了所選列中值的全部組合的聚合。
ROLLUP生成的結果集顯示了所選列中值的某一層次結構的聚合
ROLLUP就是將GROUP BY後面的第一列名稱求總和,而其餘列並不要求
而CUBE則會將每個列名稱都求總和
例如:首先用ROLLUP
查詢語句:
Select cust_id,product_code,sum(qty) as quantity
From invoices Where cust_id IN (4,5)
Group Bycust_id, product_code
WITH Rollup
Order By cust_id
查詢結果:
cust_id product_code quantity
------- -------------- -------
NULL NULL 10
4 5 3
4 6 3
4 NULL 6
5 5 4
5 NULL 4
第一行是4,5買的全部產品的數量
第二行是4買5產品的數量
第三行是4買6產品的數量
第四行是4買全部產品的數量
第五行是5買5產品的數量
第六行是5買全部產品的數量
若是查詢語句中的ROLLUP關鍵字更改成CUBE,就會多出有關產品的信息
查詢結果:
cust_id product_code quantity
------- -------------- -------
NULL NULL 10
NULL 5 7
NULL 6 3
4 5 3
4 6 3
4 NULL 6
5 5 4
5 NULL 4
第2行是全部顧客買5產品的數量
第3行是全部顧客買6產品的數量
ROLLUP操做的結果集具備相似 COMPUTE BY所返回結果集的功能;然而ROLLUP 具備下列優勢:
ROLLUP返回單個結果集;COMPUTE BY返回多個結果集,而多個結果集會增長應用程序代碼的複雜性。
ROLLUP能夠在服務器遊標中使用;COMPUTE BY不能夠。
使用COMPUTE子句和聚合函數也能夠實現對數據庫的統計操做,它與GROUP BY子句統計方法的區別是:它不只顯示統計結果,並且還顯示各統計項目的明細資料,但它所返回的資料由多個結果集合組成。
五.其餘
1.大小寫問題:
注意:儘管在 Windows 中數據庫與表名是忽略大小寫的,你不該該在同一個查詢中使用不一樣的大小寫來引用一個給定的數據庫和表。下面的查詢將不能工做,由於它以 my_table 和 MY_TABLE 引用一個表:
SELECT * FROM my_table WHERE MY_TABLE.col=1;
列名與列的別名在全部的狀況下均是忽略大小寫的。
表的別名是區分大小寫的。下面的查詢將不能工做,由於它用 a 和 A 引用別名:
SELECT col_name FROM tbl_name AS a
WHERE a.col_name = 1 OR A.col_name = 2;
若是記憶數據庫和表名的字母大小寫有困難,建議採用一個一致一約定,例如老是以小寫字母建立數據庫和表。
2.關於主鍵、外鍵及標識
主鍵是創建在一個表內的a、主鍵不容許空值。b、一個表只能有一個主鍵,其他能夠設置爲候選鍵。c、表中能夠無主鍵。d、表中設置主鍵的表中數據行不能重複。e、能夠將表中的兩行組合做爲一個主鍵。用於強制表的實體完整性。
外鍵是創建在兩個表之間關係的,具體操做爲:在設計表窗口中 「屬性」―― 「關係」―― 「新建」――在主鍵表中選擇「borrow」,在外鍵表中選擇「RID」所在表,而後在「主鍵表」下面的下拉列表中選擇「RID」,在「外鍵表」下面的下拉列表中選擇「RID」。
外鍵的好處就是在於 你企圖插入一個child的時候 他會自動檢測其parent是否存在 若是不存在 就不給你插入 保證數據中不會出現孤兒;
外鍵則是在其餘表中引用另外一個表的主鍵的字段叫外鍵,如人的銀行卡記錄可能有多條,每條都會有你的身份證號碼、銀行賬號。身份證號碼就能夠做爲我的信息表的外鍵
列標識能夠做爲主鍵,可是也能夠不做爲主鍵,可是它能夠判斷一行的惟一性;標識設置後,id會自動給一個值。
alter table tablename add id int identity(1,1)
有列標識才有標識種子,上面的1就是標識種子,標識就是由數字組成的一個序列,它的標識種子就是序列的開始值,標識遞增量就是它的步長。
標識:也具備惟一標誌的做用,但他能夠爲空。
3. HANDLER
句法
HANDLER
是一個稍微低級的語句。舉例來講,它不提供一致性約束。更確切地說,HANDLER ... OPEN
不 接受一個表的快照,而且 不 鎖定表。這就意味着在一個 HANDLER ... OPEN
被執行後,表數據仍會被 (這個或其它的線程) 修改,這些修改可能在 HANDLER ... NEXT
和 HANDLER ... PREV
掃描中才會部分地出現。
4.
修改表格結構:
ALTER TABLE
句法:
在已經存在的表中增長或者移除字段
在列 d
上增長一個索引,將列 a
設爲主鍵:
ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
移除列 c
:
ALTER TABLE t2 DROP COLUMN c;
添加一個名爲 c
的 AUTO_INCREMENT
整型列:
ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);
5.RENAME TABLE 句法
更名是從左到右執行的,這就意味着,若是你但願交換兩個表名,你不得不這樣作:
RENAME TABLE old_table TO backup_table,
new_table TO old_table,
backup_table TO new_table;
6.USE 句法
USE db_name 語句告訴 MySQL 使用 db_name 數據庫做爲之後查詢的缺省數據庫。數據庫保持爲當前數據庫,只到該會話結束或另外一個 USE 語句發出:
mysql> USE db1;
mysql> SELECT COUNT(*) FROM mytable; # 從 db1.mytable 中選擇
mysql> USE db2;
mysql> SELECT COUNT(*) FROM mytable; # 從 db2.mytable 中選擇
依靠 USE 語句將一個特定數據庫設爲當前數據庫,它並不阻止你訪問另外一個數據中的表。下面的示例訪問 db1 數據庫中的 author 表和 db2 數據庫中的 editor 表:
mysql> USE db1;
mysql> SELECT author_name,editor_name FROM author,db2.editor
-> WHERE author.editor_id = db2.editor.editor_id;
7.DESCRIBE 句法 (得到列的信息)
{DESCRIBE | DESC} tbl_name [col_name | wild]
DESCRIBE 提供有關一個表的列信息。col_name 能夠是一個列名或是一個包含 SQL 通配符字符 「%」 和 「_」 的字符串。
8.轉換數據用例:
假設你想從一個MONEY型字段中取出全部的值,並在結果後面加上字符串「US Dollars」。你須要使用函數CONVERT(),以下例所示:
SELECT CONVERT(CHAR(8),price)+’US Dollars’ FROM orders
9.匹配發音用例:
Microsoft SQL 有兩個容許你按照發音來匹配字符串的函數。函數SOUNDEX()給一個字符串分配一個音標碼,函數DIFFERENCE()按照發音比較兩個字符串。當你不知道一個名字的確切拼寫,但多少知道一點它的發音時,使用這兩個函數將有助於你取出該記錄。
例如,若是你創建一個Internet目錄,你也許想增長一個選項,容許訪問者按照站點名的發音來搜索站點,而不是按名字的拼寫。考慮以下的語句:
SELECT site_name FROM site_directory
WHERE DIFFERENCE(site_name , ‘Microsoft’>3
函數DIFFERENCE()返回一個0到4之間的數字。若是該函數返回4,表示發音很是相近;若是該函數返回0,說明這兩個字符串的發音相差很大。
10.刪除空格用例:
有兩個函數,TTRIM()和LTRIM(),能夠用來從字符串中剪掉空格。函數LTRIM()去除應該字符串前面的全部空格;函數RTRIM()去除一個字符串尾部的全部空格。這裏有一個任何使用函數RTRIM()的例子:
SELECT RTRIM(site_name) FROM site_directory
在這個例子中,若是任何一個站點的名字尾部有多餘的空格,多餘的空格將從查詢結果中刪去。
你能夠嵌套使用這兩個函數,把一個字符串先後的空格同時刪去:
SELECT LTRIM(RTRIM(site_name) FROM site_directory
11.賦值問題:
在語句中除了 SET 以外還能夠直接爲一個變量賦值。然而在這各狀況下,賦值操做符爲 := 而不是 =,由於 = 在非 SET 語句中是用於比較的:
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
12.返回當前日期:
經過函數GETDATE(),你能夠得到當前的日期和時間。例如,語句SELECT GETDATE()返回以下的結果:
……………………………..
NOV 30 1997 3:29AM
(1 row(s) affected)
要獲得不一樣格式的日期和時間,你須要使用函數CONVERT()。例如,當下面的這個語句執行時,顯示的時間將包括毫秒:
SELECT CONVERT(VARCHAR(30),GETDATE(),9)
注意例子中數字9的使用。這個數字指明瞭在顯示日期和時間時使用哪一種日期和時間格式。當這個語句執行時,將顯示以下的日期和時間:
…………………………………..
Nov 30 1997 3:29:55:170AM
(1 row(s) affected)
表11.1 日期和時間的類型
類型值 標準 輸出
0 Default mon dd yyyy hh:miAM
1 USA mm/dd/yy
2 ANSI yy.mm.dd
3 British/French dd/mm/yy
4 German dd.mm.yy
5 Italian dd-mm-yy
6 - dd mon yy
7 - mon dd,yy
8 - hh:mi:ss
9 Default + milliseconds--mon dd yyyy
hh:mi:ss:mmmAM(or )
10 USA mm-dd-yy
11 JAPAN yy/mm/dd
12 ISO yymmdd
13 Europe Default + milliseconds--dd mon yyyy
hh:mi:ss:mmm(24h)
14 - hh:mi:ss:mmm(24h)
類型0,9,和13老是返回四位的年。對其它類型,要顯示世紀,把style值加上100。類型13和14返回24小時時鐘的時間。類型0,7,和13返回的月份用三位字符表示(用Nov表明November).
抽取日期:假設你想列出你的站點目錄中每一個站點被查詢的月份。這時你不但願完整的日期和時間把網頁弄亂。爲了抽取日期的特定部分,你可使用函數DATEPART(),象這樣:
SELECT site_name ‘Site Name’,
DATEPART(mm,site_entrydate) ‘Month Posted’ FROM site_directory
函數DATEPART()的參數是兩個變量。第一個變量指定要抽取日期的哪一部分;第二個變量是實際的數據。在這個例子中,函數DATEPART()抽取月份,由於mm表明月份。下面是這個SELECT 語句的輸出結果:
Site Name Month Posted
………………………………………………………………
Yahoo 2
Microsoft 5
Magicw3 5
(3 row(s) affected)
表11.2 日期的各部分及其簡寫
日期部分 簡寫 值
year yy 1753--9999
quarter qq 1--4
month mm 1--12
day of year dy 1--366
day dd 1--31
week wk 1--53
weekday dw 1--7(Sunday--Saturday)
hour hh 0--23
minute mi 0--59
second ss 0--59
milisecond ms 0--999