SELECT * FROM tablename
SELECT columnname FROM tablename
SELECT column1, column2 FROM tablename
[]
,MySQL使用重音符`,Oracle使用雙引號SELECT QuantityPurchased * PricePerItem FROM Orders
+
,MySQL使用CONCAT()
函數鏈接字符串,Oracle使用雙豎線||
SELECT f_n AS 'first_name' from customers
SELECE something from someshittablename AS another_table_name
LEFT/RIGHT (string, numberOfCharactors)
:從左/右取字符串數據的指定位數,在Oracle中以SUBSTR替代SUBSTRING (string, start, end)
:取得字符串數據的子字符串,在Oracle中以SUBSTR替代LTRIM/RTRIM (string)
:刪除字符串數據左側/右側的空格CONCAT (string1, string2, string3 ...)
:拼接多個字符串,Oracle中只容許拼接兩個字符串UPPER/LOWER (string)
:返回字符串的大/小寫RIGHT(RTRIM(something)) AS 'something'
GETDATE/NOW/CURRENT_DATE ()
:三個函數都用於獲取當前時間,對應Microsoft SQL Server/MySql/Oracle三家數據庫的實現DATEPART (date_part, date_value)
:單獨返回某個部分的時間,date_part
爲須要返回的時間部分,date_value
爲原始時間,MySQL的實現爲DATE_FORMAT(date_value, date_format)
,date_value
爲原始時間,date_format
爲相似於%d
這樣的格式用於告訴函數須要返回哪部分時間,date_part
的有效值爲:year/quarter/month/dayofyear/day/month/hour/minute/secondDATEDIFF (date_part, start_date, end_date)
:用於計算任意兩個不一樣日期間相差的時間,在MySQL中該函數之容許計算天數差別,因此date_part
參數不可用,僅須要傳入兩個日期便可ROUND (NumbericValue, DecimalPlaces)
:對任意數進行四捨五入,NumbericValue
表示要四捨五入的數,DecimalPlaces
表示從第幾位開始四捨五入(即須要保留到第幾位),以十分位爲0,向左爲負數,向右爲正數RAND ([seed])
:產生一個隨機數 ,可選的seed
參數爲一個整數,用於每次返回相同的值PI ()
:返回數學運算中的pi值CAST (expression AS data_type)
:將數據從一種類型轉換爲另外一種類型,expression
表示數據或函數表達式,data_type
表示須要轉換到的數據類型,通常狀況下SQL在作計算時會進行自動的類型轉換,因此不多用到這個函數,它的典型使用場景是當一個日期被保存成了字符串,須要轉換爲真正的日期數據:CAST('2017-5-1', AS DATETIME)
,Oracle中該函數的參數形式會不同ISNULL/IFNULL/NVL (column_data_maybe_null, if_null_will_use_this_data )
:將NULL值轉換爲一個有意義的值,對應Microsoft SQL Server/MySql/Oracle三家數據庫的實現排序數據的語法以下:sql
SELECT
column1,
column2
FROM table1, table2
ORDER BY column3, column2 DESC
複製代碼
ORDER BY
句子老是在FROM
子句以後,FROM
子句老是在SELECT
關鍵字以後SELECT
和ORDER BY
後面指定的列,多是徹底不一樣的一些列ASC
和DESC
來升序/降序排列ORDER BY
後指定了多列,則首先按照第一列排序,如遇相同則相同的行按第二列排序,以此類推SELECT
關鍵字後,則只須要在ORDER BY
子句中指定計算字段的別名便可(經測試在MySQL中若是計算字段別名帶有空格則暫時沒法在此引用,由於不能使用引號),若是計算字段沒有出如今SELECT
關鍵字後,則可直接在ORDER BY
子句中指定一個計算字段,例如:SELECT
title,
rental_duration,
rental_rate
FROM film
ORDER BY rental_duration * rental_rate DESC
複製代碼
NULL
(Oracle中排在最後,可以使用NULLS FIRST
關鍵字來強制最早)-數字-字符(字符中首先顯示數字字符,再顯示普通字符,除Oracle外不區分大小寫)來進行排序,反之亦然。SELECT column1, column2
CASE column3
WHEN value1 THEN result1
WHEN value2 THEN value2
(repeat WHEN-THEN any number of times)
[ELSE defaul_result]
END
column4
FROM tablename
複製代碼
SELECT
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
(repeat WHEN-THEN any number of times)
[ELSE defaul_result]
END AS custom_column_name,
FROM tablename
# 最新版的MySQL語法與書中的語法有細微差異:
# ELSE子句最後不須要逗號
SELECT
title,
CASE
WHEN rental_duration = 3 THEN 'Three Day Left'
WHEN rental_rate = 0.99 THEN 'Cheapest'
ELSE 'Normal'
END AS 'Rental Status'
FROM film
複製代碼
WHERE
子句開始WHERE
子句老是在FROM
和ORDER BY
子句之間,實際上任何「子句」都必須按照這個順序來SELECT columnList
FROM tableList
WHERE condition
ORDER BY columnList
複製代碼
WHERE
子句操做符,如下這些操做符均可以在基於列的邏輯CASE WHEN condition
語句中使用
=
<>
>
<
>=
<=
SELECT
first_name,
last_name
FROM actor
WHERE age > 18
複製代碼
TOP/LIMIT/ROWNUM
(對應Microsoft SQL Server、MySQL和Oracle)限制行數(關鍵字TOP返回的行,並非真的隨機樣本,而是根據數據庫中的物理存儲方式限定了前幾行數據而已)# Microsoft SQL Server
SELECT
TOP number
columnList
FROM table
# MySQL
SELECT
columnList
FROM table
LIMIT number
# Oracle
SELECT
columnList
FROM table
WHERE ROWNUM <= number
複製代碼
SORT BY
子句作「Top N」查詢(基於特定分類,獲得帶有最大/小值的必定數量的行)# 本月賣得最好的莎士比亞的三本書
# MySQL
SELECT
title AS 'Book Title',
current_month_sale AS 'Quantity Sold'
FROM books
WHERE author = 'Shakespear'
LIMIT 3
ORDER BY current_month_sale DESC
# Oracle中的TOP N查詢須要用到子查詢,後文會細講
SELECT * FROM
(SELECT
title AS 'Book Title',
current_month_sale AS 'Quantity Sold'
FROM books
ORDER BY current_month_sale)
WHERE ROWNUM <= 3
複製代碼
AND
、或OR
、非NOT
三個關鍵字在WHERE
子句中表示布爾邏輯。與其它語言的計算順序同樣,AND
的優先級最高,OR
其次,NOT
優先級最低,也可使用()
來改變三者的計算順序# 這個例子僅爲展現布爾邏輯,實際使用不該該這麼繞
SELECT
first_name,
last_name,
age
FROM actors
WHERE
NOT(
(age < 18 OR age > 60)
AND last_name = 'Jhon'
)
複製代碼
BETWEEN
和IN
,用於替代column >= range_bottom AND column <= range_top
和column = value1 OR column = value2
這樣的特例,簡化SQL語句的編寫# BETWEEN,等價於 age >= 18 AND age <= 60
SELECT
first_name,
last_name,
age
FROM actors
WHERE
age BETWEEN 18 AND 60
# IN,等價於 state = 'IL' AND state = 'NY'
SELECT
customer_name,
state
FROM orders
WHERE state IN ('IL', 'NY')
複製代碼
IS NULL
在WHERE
子句中判斷一個列是否爲空,也能夠與函數ISNULL(column, value)
結合使用# 選取重量爲0或者沒有填寫重量的產品
SELECT
product_description,
weight
FROM products
WHERE weight = 0
OR weight IS NULL
# 使用ISNULL等價的寫法
SELECE
product_description,
weight
FROM products
WHERE ISNULL(weight, 0) = 0
# IS NULL和ISNULL
SELECT
product_description,
ISNULL(weight, 0) AS 'weight'
FROM products
WHERE weight = 0
OR weight IS NULL
複製代碼
WHERE
子句可使用LIKE
操做符來查找針對列值的某部分匹配
SELECT
title
FROM
film
WHERE
title LIKE '%love%'
複製代碼
SELECT
title
FROM
film
WHERE
title LIKE 'love%'
複製代碼
SELECT
title
FROM
film
WHERE
title LIKE '%love'
複製代碼
SELECT
title
FROM
film
WHERE
title LIKE '% love %'
複製代碼
符號 | 含義 |
---|---|
% | 任意個任意字符 |
_ | 一個任意字符 |
[characterlist] | 一個指定字符列表中的字符(在MySQL和Oracle中沒有) |
[^charactorlist] | 一個非指定字符列表中的字符(在MySQL和Oracle中沒有) |
NOT
操做符能夠和LIKE
操做符組合使用,例如SELECT
first_name,
last_name
FROM actor
WHERE first_name LIKE '%ARY%'
AND last_name NOT LIKE '[MG]ARY'
複製代碼
SOUNDEX
函數:可以輸出一個表示字符讀音的四字代碼(以首字母開頭,而後刪去剩餘字符中全部元音和字母y,最後轉換爲一個三位數的數字用於表示讀音,最後輸出相似S530
)DIFFERENCE
函數:能夠和SOUNDEX
函數一塊兒使用(僅Microsoft SQL Server支持),檢查兩個字符的SOUNDEX
類似度並返回一個表示讀音相近度的數字,(兩個字符的SOUNDEX
值共有四個字符,每有一個位置的字符相等,則結果自增1,因此DIFFERENCE
函數的返回值只有0到4五個可能的數字,越大越相近,越小越不一樣DISTINCT
關鍵字來刪除輸出重複的行# 查看全部藝術家(沒有顯示相同藝術家的行)
SELECT
DISTINCT
artist
FROM songs
ORDER BY artist
# 查看全部藝術家和專輯的惟一組合(沒有顯示同一藝術家和同一專輯的行,每一行中藝術家和專輯的組合是惟一的)
SELECT
DISTINCT
artist,
album
FROM songs
ORDER BY artist, album
複製代碼
函數 | 解釋 |
---|---|
SUM |
合計、加總 |
AVG |
平均值 |
MIN |
最小值 |
MAX |
最大值 |
COUNT |
數量 |
# 總值、均值、最大值、最小值
SELECT
SUN(fee) AS 'Total Gym Fees'
AVG(grade) AS 'Average Quiz Score'
MIN(grade) AS 'Minimum Quiz Score'
MAX(grade) AS 'Maximum Quiz Score'
FROM grades
WHERE grade_type = 'quiz'
# 返回全部選中行的數目
SELECT
COUNT(*) AS 'Count of Homework Rows'
FROM grades
WHERE grade_type = 'homework'
# 返回指定列中存在值的行的數目
SELECT
COUNT(grade) AS 'Count of Homework Rows'
FROM grades
WHERE grade_type = 'homework'
# 與DISTINCT配合返回指定列中惟一值的行數
SELECT
COUNT(DISTINCT fee_type) AS 'Number of Fee Types'
FROM Fees
複製代碼
# 統計每一個分級下的電影數量
SELECT
rating, COUNT(rating) AS 'Rating Count'
FROM
film
GROUP BY rating
複製代碼
GROUP BY
子句中的列,要麼是在聚合函數中使用的列,由於全部內容都在組中出現,不在組中的內容沒有辦法處理,這種狀況下MySQL與其它兩種數據庫不一樣,它只會得出錯誤的結果,而不會報錯# 統計不一樣租金率下的不一樣分級電影的數量
SELECT
rating,
rental_rate,
COUNT(rating) AS 'Rating Count'
FROM film
GROUP BY rating, rental_rate
複製代碼
SUM
、AVG
、MIN
、MAX
、COUNT
)統計的是全部行的數據,在有分組的狀況下,這些聚合函數則僅會統計組內的數據,固然實際上也是最終顯示的表的每一行的聚合GROUP BY
子句中的columnlist順序沒有意義,但ORDER BY
子句中的順序是有意義的,通常按照排序的優先順序來列出這些列會頗有幫助(也即SELECT
中的columnlist與ORDER BY
中的columnlist保持一致)WHERE
子句中的查詢條件是針對單獨的行來應用的,若是存在GROUP BY
分組,就須要使用HAVING
關鍵字了# 查看分級中全部電影平均時長大於100分鐘的分級中電影的數量
SELECT
rating AS '分級',
COUNT(title) AS '電影數量',
AVG(length) AS '平均時長'
FROM
film
GROUP BY rating
HAVING AVG(length) > 100
ORDER BY 電影數量 DESC
複製代碼
SELECT
語句的通常格式以下:SELECT
columnlist
FROM
tablelist
WHERE
condition
GROUP BY
columnlist
HAVING
condition
ORDER BY
COLUMNLIST
複製代碼
INNER JOIN
來指定想要鏈接的第二個表,使用ON
來指定兩個表的共同列因爲共同列名稱是同樣的,因此須要在列名前面使用表名做爲命名空間來區分兩個表中獨立的列# 簡單地依據customer_id將顧客表和訂單表拼接到一個表中
SELECT *
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id
複製代碼
FROM
和INNER JOIN
之間的順序僅會影響哪一個表的列先顯示,不會影響行的順序FROM
和WHERE
也能夠指定表的內鏈接,這是內鏈接的另外一種範式,但因其沒有顯示地表示出鏈接的邏輯,因此不推薦使用(因此其實INNER JOIN ON
的惟一做用僅僅是表達語義而已)SELECT *
FROM customers, orders
WHERE customers.customer_id = orders.customer_id
複製代碼
SELECT
c.customer_id AS 'Customer Id',
c.first_name AS 'First Name',
c.last_name AS 'Last Name',
o.order_id AS 'Order Id',
o.quantity AS 'Quantity',
o.price_per_item AS 'Price'
FROM customers AS 'c',
INNER JOIN
複製代碼
JOIN
來指定一個內鏈接LEFT OUTER JOIN
,右鏈接RIGHT OUTER JOIN
,全鏈接FULL OUTER JOIN
,其中關鍵字OUTER
並非必須的。鏈接類型 | 全稱 | 簡寫 | 用途 |
---|---|---|---|
內鏈接 | INNER JOIN |
JOIN |
兩個表都是主表(primary table),共同列中全部的行都必須同時在這兩個表中才會被選中 |
左鏈接 | LEFT OUTER JOIN |
LEFT JOIN |
左表爲主表,右表爲從表(secondary table),選中共同列中全部在主表中的行,無論它是否出如今從表 |
右鏈接 | RIGHT OUTER JOIN |
RIGHT JOIN |
左表爲從表,右表爲主表,規則同左鏈接 |
全鏈接 | FULL OUTER JOIN |
FULL JOIN |
兩個表都是從表,共同列中的行只要出如今任意一個表中都會被選中 |
IS NOT NULL
和IS NULL
來過濾空行或顯示空行# 過濾了沒有訂單的客戶和有退貨的訂單
SELECT
customers.first_name AS 'First Name',
customers.last_name AS 'Last Name',
orders.order_date AS 'Order Date',
orders.order_amount AS 'Order Amt'
FROM customers
LEFT JOIN orders
ON orders.customer_id = customers.customre_id
LEFT JOIN refunds
ON orders.order_id = refunds.order_id
WHERE orders.order_id IS NOT NULL
AND refunds.refund_id IS NULL
ORDER BY customers.customer_id, orders.order_id
複製代碼
FROM
子句時,建議僅使用關鍵字LEFT JOIN
而且避免使用圓括號ON
子句中,非自鏈接的共同列來自兩個表,自鏈接的共同列來自同一個表,因此這時候須要在FROM
關鍵字和JOIN
關鍵字後爲該表各自建立一個別名用以在ON
子句中進行區分# 列出personnel表中全部員工的經理名字
SELECT
employees.employee_name AS 'Employee Name',
managers.employee_name AS 'Maneger Name'
FROM personnel AS 'employees'
LEFT JOIN personnel AS 'managers'
ON employees.manager_id = managers._employee_id
ORDER BY employee.employee_id
複製代碼
SELECT
語句,它不包含任何數據。ORDER BY
子句# 建立視圖的語法:
CREATE VIEW view_name AS
select_statement
# 一個建立視圖的例子,注意不能有ORDER BY子句
CREATE VIEW customers_orders_refunds AS
SELECT
customers.first_name AS 'First Name',
customers.last_name AS 'Last Name',
orders.order_date AS 'Order Date',
orders.order_amount AS 'Order Amt'
FROM customers
LEFT JOIN orders
ON orders.customer_id = customers.customre_id
LEFT JOIN refunds
ON orders.order_id = refunds.order_id
WHERE orders.order_id IS NOT NULL
AND refunds.refund_id IS NULL
複製代碼
# 建立視圖
CREATE VIEW view_name AS
select_statement
# 引用視圖
SELECT * from view_name
複製代碼
# 建立視圖
CREATE VIEW customers_view AS
SELECT
first_name AS 'First Name',
last_name AS 'Last Name'
FROM customers
# 引用視圖中的列
SELECT
`First Name`,
`Last Name`,
FROM customers_view
WHERE `Last Name` = 'Lopez'
複製代碼
SELECT
語句封裝爲一個視圖ALTER
關鍵字修改一個已經建立的視圖,從新指定被封裝到其中的SELECT
語句# 整個被封裝到視圖的select語句都須要從新指定
ALTER VIEW view_name AS
new_select_statement
# 與Microsoft SQL Server和MySQL不一樣,Oracle在修改視圖以前,須要使用DROP VIEW view_name先刪除視圖
複製代碼
DROP VIEW view_name
來刪除視圖SELECT
、INSERT
、UPDATE
、DELETE
語句SELECT
語句中子查詢能夠有三種用法:
SELECT
語句格式以下:SELECT column_list
FROM table_list
WHERE condition
GROUP BY column_list
HAVING condition
ORDER BY column_list
複製代碼
table_list
的一部分時,它指定了一個數據源condition
的一部分時,它成爲查詢條件的一部分column_list
的一部分時,它建立了一個單個的計算的列FROM
子句的一部分時,它當即建立了一個新的數據源,並被當作一個獨立的表或視圖來引用,與視圖的區別是視圖是永久保存在數據庫中的,而子查詢只是臨時的# 使用子查詢指定數據源的通常格式
SELECT column_list
FROM [table_list]
[JOIN] subquery
AS custom_subquery_name
# 從address表,city表和country表中列出五個地址對應的城市和國家
SELECT
address AS 'Address',
city AS 'City',
country AS 'Country'
FROM address
LEFT JOIN(
SELECT
city.city,
city.city_id,
country.country,
country.country_id
FROM city
LEFT JOIN country
ON city.country_id = country.country_id
) AS city_and_country ON address.city_id = city_and_country.city_id
ORDER BY address
LIMIT 5
複製代碼
WHERE
子句中IN
操做符的右值,能夠以更復雜的邏輯來爲IN
操做符建立一個可選列表;注意,當子查詢用於指定查詢條件時,僅能返回單一的列# 使用子查詢指定查詢條件的通常格式
SELECT column_list
FROM table_list
WHERE column IN subquery
SELECT column_list
FROM table_list
WHERE subquery match_some_comdition
# 列出全部使用現金支付的客戶名稱
SEELCT customer_name AS 'Customer Name'
FROM costomers
WHERE customer_id IN
(
SELECT customer_id
FROM orders
WHERE order_type = 'cash'
)
# 列出訂單金額少於20美圓的客戶列表
SELECT customer_name AS 'Customer Name'
FROM customers
WHERE
(
SELECT SUM(orderAmount)
FROM orders
WHERE customers.customer_id = orders.customer_id
) < 20
複製代碼
# 使用子查詢做爲計算列的通常格式
SELECT column_list,
subquery_result AS 'Result Alia'
FROM table_list
# 查詢客戶及其訂單數量
SELECT
customer_name AS 'Customer Name',
(
SELECT COUNT(order_id)
FROM orders
WHERE customers.customer_id = orders.customer_id
) AS 'Number of Orders'
FROM customers
ORDER BY customers.customer_id
複製代碼
customers
表EXISTS
操做符:用於肯定一個關聯子查詢中是否存在數據# 查詢下過訂單的用戶
SELECT
customer_name AS 'Customer'
FROM customers
WHERE EXISTS
(
SELECT * FROM orders
WHERE customers.customer_id = orders.customer_id
)
複製代碼
在前文中,鏈接JOIN
能夠未來自兩個表的列組合到一個表中,子查詢則是將一條SELECT
語句的結果提供給第另外一條SELECT
語句使用。然而有時候咱們但願未來自兩個表的行組合到一個表中,這時候就須要使用SQL中的集合邏輯UNION
,來作合併查詢。數據庫
UNION
-合併兩條SELECT
語句,選取在A或B中的數據,若是同時存在在A或B中,僅顯示一條SELECT
order_date AS 'Date',
'order' AS 'Type',
order_amount AS 'amount'
FROM orders
WHERE custom_id = 2
UNION
SELECT
return_date AS 'Date',
'return' AS 'type',
return_amount AS 'amount'
FROM returns
WHERE custom_id = 2
ORDER BY date
複製代碼
使用UNION
須要遵照3個規則(實際就一條規則:相同列):
SELECT
語句中的列的數量必須相等SELECT
語句中的列排列順序必須相同SELECT
語句中的列數據類型必須相同UNION ALL
-合併兩條SELECT
語句,選取在A或B中的數據,即便同時存在在A或B中,都將顯示在結果中SELECT
DISTINCT
order_date AS 'Date'
FROM orders
UNION ALL
SELECT
DISTINCT
return_date AS 'Date'
FROM returns
ORDER BY Date
# UNION 確保來自兩個表的行沒有重複數據,但 UNION ALL 容許來自兩個表的行能夠有相同數據
# DISTINCT 確保來自同一個表(或者說同一個SELECT語句)的行沒有重複數據
# 因此上面的語句選取的數據可能會存在重複數據,但重複的數據並不來自兩個表而是來自同一個表,而且僅會重複一次
複製代碼
INTERSECT
-合併兩條SELECT
語句,選取同時出如今A和B中的行(MySql不支持該操做符)SELECT order_date AS 'Date'
FROM orders
INTERSECT
SELECT return_date As 'Date'
FROM returns
ORDER BY Date
複製代碼
EXCEPT
-合併兩條SELECT
語句,選取僅出如今A或僅出如今B中的的數據(MySql和Oracle不支持該操做符,但Oracle提供了等價的MINUS
操做符)SELECT order_date AS 'Date' FROM orders
EXCEPT
SELECT return_date AS 'Date' FROM returns
ORDER BY Date
複製代碼
到目前爲止,前文全部的SQL語句都是單獨使用,然而不少時候,你會但願SQL語句可以像函數同樣,定義一次,而後重複調用,而且可使用參數來增長靈活性。這時,你就可使用存儲過程來實現這一目的。express
-- Microsoft SQL Server
CREATE PROCEDURE ProcedureName (OptionalPrameterDeclarations)
AS
BEGIN
SQLStatements
END
-- MySQL
DELIMITER $$ -- 規定END語句使用的分隔符,默認爲分號
CREATE PROCEDURE ProcedureName (OptionalPrameterDeclarations)
BEGIN
SQLStatements; -- 每一條SQL語句都必須使用分號分隔,即便只有一條
END$$
DELIMITER ; -- 將分隔符改回分號
複製代碼
-- Microsoft SQL Server
CREATE PROCUDURE CustomerProcudure (@custId INT)
AS
BEGIN
SELECT * FROM customers
WHERE customer_id = @custId
END
-- MySQL
DELIMITER $$
CREATE PROCEDURE CustomerProcudure (custId INT)
BEGIN
SELECT * FROM customers
WHERE CUSTOMER_ID = custId;
END
DELEMITER ;
複製代碼
-- Microsoft SQL Server
EXEC CustomerProcudure @custId = 2
-- MySQL
CALL CustomerProcudure (2)
複製代碼
CREATE
關鍵字替換爲ALTER
關鍵字便可;然而在MySQL中,雖然也存在ALTER
命令,但它的功能十分簡單,因此通常咱們選擇先刪除存儲過程而後再從新建立-- 刪除存儲過程
DROP PROCEDURE ProcedureName
複製代碼
INSERT
命令來插入指定數據,注意不須要爲自增型的列指定數據,數據庫會自動處理它;另外,Oracle不容許一次插入多行數據,須要分開書寫
INSERT
語句中指定的具體數據-- 向customer表插入兩條新數據
INSERT INTO customers
(first_name, last_name, state) -- 只要列名是正確的,它們的順序無所謂
-- 當這裏的列名順序與數據庫中的物理順序一致時可省略它們,但強烈不建議這麼作
VALUES
('Virginia', 'Jones', 'OH'), -- VALUES關鍵字後的數據列,要與INSERT INTO後的列相對應
('Clark', 'Woodland', 'CA')
複製代碼
SELECT
語句指定的數據-- 將customer_transaction中的RI州的用戶插入到customer表中
INSERT INTO customer
(first_name, last_name, state)
SELECT
fn, ln, state -- 這裏選中列的順序須要與INSERT INTO 語句中的順序一致
FROM customer_transactions
WHERE state = 'RI'
複製代碼
DELETE
命令來刪除一條數據,一般是一整行(刪除某行中的列沒有意義,那屬於修改數據的範疇)-- 刪除數據的通常寫法
DELETE
FROM table_name
WHERE conditions
-- 可使用SELECT語句來驗證刪除結果
SELECT
COUNT (*) -- 使用聚合函數COUNT來統計被刪除數據的數量以確認是否所有都被刪除了
FROM table_name
WHERE conditions
-- 清空一個表中的全部數據,可使用TRUNCATE TABLE語句
TRUNCATE TABLE customers
-- 上面的語句與下面的DELETE語句效果基本相同
DELETE FROM customers
-- 惟一不一樣在於,TRUNCATE TABLE語句重置了自增列,而DELETE語句沒有
複製代碼
-- 更新數據的通常格式
UPDATE table
SET
column1 = expression1,
column2 = expression2
-- repeat any number of time
WHERE conditions -- 若是沒有指定行,該句會把全部行的指定列都更新一次
複製代碼
-- 通常格式
UPDATE table -- 指定要更新的表
SET table.column_1 = -- 指定須要更新的列1
(
SELECT another_table.column_1 -- 子查詢從另外一表中獲取數據,並經過主鍵(也但是其它)來進行匹配
FROM another_table
WHERE another_table.auto_increment_primary_key = table.auto_increment_primary_key
)
SET table.column_2 = -- 指定須要更新的列2
(
SELECT another_table.column_2
FROM another_table
WHERE another_table.auto_increment_primary_key = auto_increment_primary_key.column_2
)
WHERE EXISTS -- 指定須要更新的行,使用子查詢指定只更新table中存在於another_table中的行
(
SELECT *
FROM another_table
WHERE another_table.auto_increment_primary_key = table.auto_increment_primary_key
)
複製代碼
VIEW
、過程PROCEDURE
須要用到的都是DDLNULL
值);實際上主鍵能夠跨越多個列,叫作複合主鍵(當但願使用電影名稱列來做爲主鍵時可能會存在重複名稱, 這時可使用電影名稱+年份兩個列做爲複合主鍵來惟一地定義每部電影)NULL
CREATE TABLE
語句來建立表及其屬性(列),不一樣數據庫之間存在差別:-- Microsoft SQL Server
CREATE TABLE my_table
(
column_1 INT IDENTITY (1, 1) PRIMARY KEY NOT NULL, -- 列名column_1,INT類型,自增型,主鍵,不能爲NULL
column_2 NOT NULL REFERENCES related_table (first_column), -- 列名column_2,INT類型,不能爲NULL,外鍵,關聯到related_table表的first_column列
column_3 VARCHAR (25) NULL, -- 列名column_3,VARCHART類型,能夠是NULL
column_4 FLOAT NULL DEFAULT (10) -- 列名column_4,FLOAT類型,能夠是NULL
)
-- My SQL
CRAET TABLE my_table
column_1 INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
column_2 INT NOT NULL,
column_3 VARCHAR (25) NULL,
column_4 FLOAT NULL DEFAULT 10 NULL,
CONSTRAINT FOREIGN KEY (column_2) REFERENCE 'related_table' (first_column) -- 指定外鍵
-- Oracle
CREATE TABLE my_table
(
column_1 INT PRIMARY KEY NOT NULL, -- Oracle不容許有自增型的列
column_2 INT NOT NULL,
column_3 VARCHAR2 (25) null,
column_4 FLOAT DEFAULT 10 NULL
CONSTRAINT "foreign_key" FOREIGN KEY (column_2) REFERENCES related_table (first_column)
)
複製代碼
使用ALTER TABLE
語句修改表的具體屬性,該語句的複雜性及數據庫差別巨大,這裏再也不展開;使用DROP TABLE table_name
語句來刪除一個表-- 修改表
ALTER TABLE my_table
DROP COLUMN column_3
-- 刪除表
DROP TABLE my_table
複製代碼
CREATE INDEX
語句,用來在建立表以後建立索引,使用ALTER INDEX
語句來添加和修改索引-- 建立索引
CREATE INDEX index_2
ON my_table (column_4)
-- 刪除索引
DROP INDEX index_2
ON my_table
複製代碼