一、SQL?DML? 和? DDL
可以把? SQL? 分為兩個部分:數據操作語言? (DML)? 和?數據定義語言? (DDL) 。 SQL?( 結構化查詢語言 ) 是用于執行查詢的語法。但是? SQL? 語言也包含用于更新、插入和刪除記錄的語法。
查詢和更新指令構成了? SQL? 的? DML? 部分:
- SELECT?-? 從數據庫表中獲取數據
- UPDATE?-? 更新數據庫表中的數據
- DELETE?-? 從數據庫表中刪除數據
- INSERT?INTO?-? 向數據庫表中插入數據
SQL? 的數據定義語言? (DDL)? 部分使我們有能力創建或刪除表格。我們也可以定義索引(鍵),規定表之間的鏈接,以及施加表間的約束。
SQL? 中最重要的? DDL? 語句 :
- CREATE?DATABASE?-? 創建新數據庫
- ALTER?DATABASE?-? 修改數據庫
- CREATE?TABLE?-? 創建新表
- ALTER?TABLE?-? 變更(改變)數據庫表
- DROP?TABLE?-? 刪除表
- CREATE?INDEX?-? 創建索引(搜索鍵)
- DROP?INDEX?-? 刪除索引
?
二、 select 語句
SELECT? 列名稱? FROM? 表名稱 ???????????????????????????--* 表示所有
SELECT?DISTINCT? 列名稱? FROM? 表名稱 ???????????????-- 去掉重復
?
三、 where 子句
SELECT? 列名稱? FROM? 表名稱? WHERE? 列?運算符?值
下面的運算符可在? WHERE? 子句中使用:
操作符 |
描述 |
= |
等于 |
<> |
不等于 |
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
BETWEEN |
在某個范圍內 |
LIKE |
搜索某種模式 |
注釋:在某些版本的? SQL? 中,操作符? <>? 可以寫為? != 。
?
四、 oderby? 子句
ORDER?BY? 語句用于對結果集進行排序。
DESC?降序??ASC? 升序
?
五、insert 語句
INSERT?INTO? 表名稱? VALUES?( 值 1,? 值 2,....)
?
六、update 語句
UPDATE? 表名稱? SET? 列名稱? =? 新值? WHERE? 列名稱? =? 某值
?
七、delete 語句
DELETE?FROM? 表名稱? WHERE? 列名稱? =? 值
?
八、Top 子句
SELECT?TOP?number|percent?column_name(s)
FROM?table_name
?
九、like 操作符
SELECT?column_name(s)
FROM?table_name
WHERE?column_name?LIKE?pattern
SQL? 通配符必須與? LIKE? 運算符一起使用。
在? SQL? 中,可使用以下通配符:
通配符 |
描述 |
% |
替代一個或多個字符 |
_ |
僅替代一個字符 |
[charlist] |
字符列中的任何單一字符 |
[^charlist] 或者 [!charlist] |
不在字符列中的任何單一字符 |
?
十、in? 操作符
SELECT?column_name(s)
FROM?table_name
WHERE?column_name?IN?(value1,value2,...)
?
十一、between? 操作符
SELECT?column_name(s)
FROM?table_name
WHERE?column_name
BETWEEN?value1?AND?value2
如需使用上面的例子顯示范圍之外的人,請使用? NOT? 操作符
?
十二、Join
- JOIN:? 如果表中有至少一個匹配,則返回行
- LEFT?JOIN:? 即使右表中沒有匹配,也從左表返回所有的行
- RIGHT?JOIN:? 即使左表中沒有匹配,也從右表返回所有的行
- FULL?JOIN:? 只要其中一個表中存在匹配,就返回行
SELECT?Persons.LastName,?Persons.FirstName,?Orders.OrderNo
FROM?Persons,?Orders
WHERE?Persons.Id_P?=?Orders.Id_P
?
十三、inner?join
SELECT?column_name(s)
FROM?table_name1
INNER?JOIN?table_name2?
ON?table_name1.column_name=table_name2.column_name
注釋:INNER?JOIN? 與? JOIN? 是相同的。
?
十四、 left?join
SELECT?column_name(s)
FROM?table_name1
LEFT?JOIN?table_name2?
ON?table_name1.column_name=table_name2.column_name
原始的表? ( 用在例子中的 ) :
"Persons"? 表:
Id_P |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
Oxford?Street |
London |
2 |
Bush |
George |
Fifth?Avenue |
New?York |
3 |
Carter |
Thomas |
Changan?Street |
Beijing |
?
"Orders"? 表:
Id_O |
OrderNo |
Id_P |
1 |
77895 |
3 |
2 |
44678 |
3 |
3 |
22456 |
1 |
4 |
24562 |
1 |
5 |
34764 |
65 |
左連接( LEFT?JOIN )實例
現在,我們希望列出所有的人,以及他們的定購? -? 如果有的話。
您可以使用下面的? SELECT? 語句:
SELECT?Persons.LastName,?Persons.FirstName,?Orders.OrderNo
FROM?Persons
LEFT?JOIN?Orders
ON?Persons.Id_P=Orders.Id_O
ORDER?BY?Persons.LastName
結果集:
LastName |
FirstName |
OrderNo |
Adams |
John |
22456 |
Adams |
John |
24562 |
Carter |
Thomas |
77895 |
Carter |
Thomas |
44678 |
Bush |
George |
? |
LEFT?JOIN? 關鍵字會從左表? (Persons)? 那里返回所有的行,即使在右表? (Orders)? 中沒有匹配的行。
?
十五、full?join
原始的表? ( 用在例子中的 ) :
"Persons"? 表:
Id_P |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
Oxford?Street |
London |
2 |
Bush |
George |
Fifth?Avenue |
New?York |
3 |
Carter |
Thomas |
Changan?Street |
Beijing |
"Orders"? 表:
Id_O |
OrderNo |
Id_P |
1 |
77895 |
3 |
2 |
44678 |
3 |
3 |
22456 |
1 |
4 |
24562 |
1 |
5 |
34764 |
65 |
全連接( FULL?JOIN )實例
現在,我們希望列出所有的人,以及他們的定單,以及所有的定單,以及定購它們的人。
您可以使用下面的? SELECT? 語句:
SELECT?Persons.LastName,?Persons.FirstName,?Orders.OrderNo
FROM?Persons
FULL?JOIN?Orders
ON?Persons.Id_P=Orders.Id_P
ORDER?BY?Persons.LastName
結果集:
LastName |
FirstName |
OrderNo |
Adams |
John |
22456 |
Adams |
John |
24562 |
Carter |
Thomas |
77895 |
Carter |
Thomas |
44678 |
Bush |
George |
? |
? |
? |
34764 |
FULL?JOIN? 關鍵字會從左表? (Persons)? 和右表? (Orders)? 那里返回所有的行。如果? "Persons"? 中的行在表? "Orders"? 中沒有匹配,或者如果? "Orders"? 中的行在表? "Persons"? 中沒有匹配,這些行同樣會列出。
十七、Union 操作符
SQL?UNION? 語法
SELECT?column_name(s)?FROM?table_name1
UNION
SELECT?column_name(s)?FROM?table_name2
注釋:默認地, UNION? 操作符選取不同的值。如果允許重復的值,請使用? UNION?ALL 。
SQL?UNION?ALL? 語法
SELECT?column_name(s)?FROM?table_name1
UNION?ALL
SELECT?column_name(s)?FROM?table_name2
另外, UNION? 結果集中的列名總是等于? UNION? 中第一個? SELECT? 語句中的列名。
下面的例子中使用的原始表:
Employees_China:
E_ID |
E_Name |
01 |
Zhang,?Hua |
02 |
Wang,?Wei |
03 |
Carter,?Thomas |
04 |
Yang,?Ming |
Employees_USA:
E_ID |
E_Name |
01 |
Adams,?John |
02 |
Bush,?George |
03 |
Carter,?Thomas |
04 |
Gates,?Bill |
使用? UNION? 命令
實例
列出所有在中國和美國的不同的雇員名:
SELECT?E_Name?FROM?Employees_China
UNION
SELECT?E_Name?FROM?Employees_USA
?
結果
E_Name |
Zhang,?Hua |
Wang,?Wei |
Carter,?Thomas |
Yang,?Ming |
Adams,?John |
Bush,?George |
Gates,?Bill |
注釋:這個命令無法列出在中國和美國的所有雇員。在上面的例子中,我們有兩個名字相同的雇員,他們當中只有一個人被列出來了。 UNION? 命令只會選取不同的值。
UNION?ALL? 命令和? UNION? 命令幾乎是等效的,不過? UNION?ALL? 命令會列出所有的值。
實例:
列出在中國和美國的所有的雇員:
SELECT?E_Name?FROM?Employees_China
UNION?ALL
SELECT?E_Name?FROM?Employees_USA
結果
E_Name |
Zhang,?Hua |
Wang,?Wei |
Carter,?Thomas |
Yang,?Ming |
Adams,?John |
Bush,?George |
Carter,?Thomas |
Gates,?Bill |
?
十八、select?into? 語句
SELECT?INTO? 語句從一個表中選取數據,然后把數據插入另一個表中。
SELECT?INTO? 語句常用于創建表的備份復件或者用于對記錄進行存檔。
您可以把所有的列插入新表:
SELECT?*
INTO?new_table_name?[IN?externaldatabase]?
FROM?old_tablename
?
或者只把希望的列插入新表:
SELECT?column_name(s)
INTO?new_table_name?[IN?externaldatabase]?
FROM?old_tablename
?
十九、create?table
數據類型( data_type )規定了列可容納何種數據類型。下面的表格包含了 SQL 中最常用的數據類型:
數據類型 |
描述 |
?integer(size) ?int(size) ?smallint(size) ?tinyint(size) ? |
僅容納整數。在括號內規定數字的最大位數。 |
?decimal(size,d) ?numeric(size,d) ? |
容納帶有小數的數字。 "size"? 規定數字的最大位數。 "d"? 規定小數點右側的最大位數。 |
char(size) |
容納固定長度的字符串(可容納字母、數字以及特殊字符)。 在括號中規定字符串的長度。 |
varchar(size) |
容納可變長度的字符串(可容納字母、數字以及特殊的字符)。 在括號中規定字符串的最大長度。 |
date(yyyymmdd) |
容納日期。 |
?
二十、 sql? 約束
- NOT?NULL
- UNIQUE
- PRIMARY?KEY
- FOREIGN?KEY
- CHECK
- DEFAULT
二十一、 foreign?key
FOREIGN?KEY? 約束用于預防破壞表之間連接的動作。
FOREIGN?KEY? 約束也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一
CREATE?TABLE?Orders
(
O_Id?int?NOT?NULL?PRIMARY?KEY,
OrderNo?int?NOT?NULL,
Id_P?int?FOREIGN?KEY?REFERENCES?Persons(Id_P)
)
二十二、 check? 約束
如果對單個列定義? CHECK? 約束,那么該列只允許特定的值。
如果對一個表定義? CHECK? 約束,那么此約束會在特定的列中對值進行限制。
二十三、 default? 約束
CREATE?TABLE?Persons
(
Id_P?int?NOT?NULL,
LastName?varchar(255)?NOT?NULL,
FirstName?varchar(255),
Address?varchar(255),
City?varchar(255)?DEFAULT?'Sandnes'
)
?
二十四、 create?index? 索引
您可以在表中創建索引,以便更加快速高效地查詢數據。
用戶無法看到索引,它們只能被用來加速搜索 / 查詢。
CREATE?INDEX?PersonIndex
ON?Person?(LastName?DESC)
?
二十五、 alter
ALTER?TABLE?table_name
ADD?column_name?datatype
ALTER?TABLE?table_name?
DROP?COLUMN?column_name
ALTER?TABLE?table_name
ALTER?COLUMN?column_name?datatype
?
二十六、AUTO?INCREMENT? 字段
默認地, AUTO_INCREMENT? 的開始值是? 1 ,每條新記錄遞增? 1 。
ALTER?TABLE?Persons?AUTO_INCREMENT=100
?
二十七、 create?view
CREATE?VIEW?view_name?AS
SELECT?column_name(s)
FROM?table_name
WHERE?condition
?
SQL? 更新視圖
您可以使用下面的語法來更新視圖:
SQL?CREATE?OR?REPLACE?VIEW?Syntax
CREATE?OR?REPLACE?VIEW?view_name?AS
SELECT?column_name(s)
FROM?table_name
WHERE?condition
SQL? 撤銷視圖
您可以通過? DROP?VIEW? 命令來刪除視圖。
SQL?DROP?VIEW?Syntax
DROP?VIEW?view_name
?
二十八、 sql? 日期
MySQL?Date? 函數
下面的表格列出了? MySQL? 中最重要的內建日期函數:
函數 |
描述 |
返回當前的日期和時間 |
|
返回當前的日期 |
|
返回當前的時間 |
|
提取日期或日期 / 時間表達式的日期部分 |
|
返回日期 / 時間按的單獨部分 |
|
給日期添加指定的時間間隔 |
|
從日期減去指定的時間間隔 |
|
返回兩個日期之間的天數 |
|
用不同的格式顯示日期 / 時間 |
?
SQL?Server?Date? 函數
下面的表格列出了? SQL?Server? 中最重要的內建日期函數:
函數 |
描述 |
返回當前日期和時間 |
|
返回日期 / 時間的單獨部分 |
|
在日期中添加或減去指定的時間間隔 |
|
返回兩個日期之間的時間 |
|
用不同的格式顯示日期 / 時間 |
SQL?Date? 數據類型
MySQL? 使用下列數據類型在數據庫中存儲日期或日期 / 時間值:
- DATE?-? 格式? YYYY-MM-DD
- DATETIME?-? 格式 :?YYYY-MM-DD?HH:MM:SS
- TIMESTAMP?-? 格式 :?YYYY-MM-DD?HH:MM:SS
- YEAR?-? 格式? YYYY? 或? YY
SQL?Server? 使用下列數據類型在數據庫中存儲日期或日期 / 時間值:
- DATE?-? 格式? YYYY-MM-DD
- DATETIME?-? 格式 :?YYYY-MM-DD?HH:MM:SS
- SMALLDATETIME?-? 格式 :?YYYY-MM-DD?HH:MM:SS
- TIMESTAMP?-? 格式 :? 唯一的數字
二十九、數據類型
不同數據的區別??( *********** 查 ************ )
?
三十、函數
在? SQL?Server? 中的合計函數
函數 |
描述 |
返回某列的平均值 |
|
BINARY_CHECKSUM |
? |
CHECKSUM |
? |
CHECKSUM_AGG |
? |
返回某列的行數(不包括 NULL 值) |
|
返回被選行數 |
|
返回相異結果的數目 |
|
返回在指定的域中第一個記錄的值( SQLServer2000? 不支持) |
|
返回在指定的域中最后一個記錄的值( SQLServer2000? 不支持) |
|
返回某列的最高值 |
|
返回某列的最低值 |
|
STDEV(column) |
? |
STDEVP(column) |
? |
返回某列的總和 |
|
VAR(column) |
? |
VARP(column) |
? |
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
