DESC table_name; 顯示資料表的格式
NULL是不能互相比較的,它只代表未定義的值
DEFAULT a(預設值,型態要與欄位相同)
字串內若有單引號要加上跳脫字元\,SQL才能辨認單引號的起始與結束,亦可在單引號前面再加一個單引號,效果相同
SELECT drink_name FROM drink_info WHERE drink_name>='L' AND drink_name<'M';
/*尋找drink_name為L字母開頭的*/
SELECT drink_name FROM drink_info WHERE drink_name BETWEEN 'L' AND 'M';
/*尋找drink_name為L到M字母開頭的*/
欄位沒有=NULL,必須使用IS NULL關鍵字,例如WHERE calories IS NULL
萬用字元(wildcard)
%表示任意數量的未知字元
_表示1個未知字元
萬用字元(wildcard)搭配LIKE可用於比對部分字串,例如WHERE location LIKE '%CA'
/*尋找location欄以CA為結尾的*/
IN (a,b,c,...)只要符合期中ㄧ個值,避免使用OR的冗長,例如WHERE rating IN ('A','B','D');
NOT IN (a,b,c,...)不在a,b,c...之中
NOTㄧ定接在WHERE後面,除了NOT IN,IS NOT NULL等變形例外
DELETE不能刪除單ㄧ欄位裡的值,或是資料表裡某ㄧ欄的所有值
UPDATE drink_info SET cost=cost+1
WHERE drink_name='Blue Moon'
OR WHERE drink_name='Oh My Gosh'
OR WHERE drink_name='Lime Fizz';
/*這三種飲料的價錢都加1元*/
下圖說明WHERE子句中的字串比對要全相符才OK......
單元性資料表是正規化(Normalization)的第一步驟,加上主鍵後又稱1NF狀態(first normal form,第一正規化)。
單元性資料表兩特色:
(i)資料欄內不會有多個同類型的值
(ii)不會有多個同類型的資料欄
SHOW CREATE TABLE table_name; 顯示當初CREATE的語法
SHOW CREATE DATABASE database_name;
SHOW COLUMNS FROM table_name;
SHOW INDEX FROM table_name;
SHOW WARNINGS;
ALTER TABLE drink_info
ADD COLUMN drink_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY(drink_id);
/*為資料表加入遞增主鍵並放在第一欄*/
(ALTER)修改資料表,常搭配下列使用......
CHANGE 可同時改變現存資料欄的名稱與型別。
MODIFY 修改現存資料欄的型別或位置。
ADD 在目前的資料表裡新增一欄。
DROP 從資料表裡卸除某欄。
RENAME TO table_new_name 更改資料表名稱。
ALTER TABLE table_name
CHANGE COLUMN 舊欄名 新欄名 型別 NOT NULL etc......;
/*新欄名與型別都要定義,否則會報錯,如下圖......*/
ALTER TABLE table_name
MODIFY COLUMN 欄名 型別 NOT NULL etc...... AFTER column_xxx;
MODIFY只能用AFTER才能成功與RDBMS軟體有關,有些軟體甚至只有在插入新資料欄時才能改變順序。事實上,MODIFY的改變順序是軟體的幕後操作,如果欄位內已經有資料或是不確定軟體是否支持此功能,盡量不要對欄位的位置動手動腳。總而言之,最好於設計資料表時,就構思欄位的最佳順序。
RIGHT(col_name,2) 右邊算起的2個字元
LEFT(col_name,2) 左邊算起的2個字元
SUBSTRING_INDEX(col_name, ',' ,1) 第1個逗號之前的所有字元
SUBSTRING(your_string, start_position, length) 指定起始位置和長度的子字串
UPPER(your_string) 轉換成大寫
LOWER(your_string) 轉換成小寫
REVERSE(your_string) 將字串順序反轉
LTRIM(your_string) 消除左側空白
RTRIM(your_string) 消除右側空白
LENGTH(your_string) 取得字串長度,即字元數量
UPDATE movie_table
SET category=
CASE
WHEN drama='T' AND rating='R' THEN 'drama-r'
WHEN comedy='T' AND rating='R' THEN 'comedy-r'
WHEN action='T' AND rating='R' THEN 'action-r'
WHEN gore='T' AND rating='R' THEN 'horror-r'
WHEN gore='T' AND rating='R' THEN 'horror-r'
WHEN scifi='T' AND rating='R' THEN 'scifi-r'
WHEN category='misc' AND rating='G' THEN 'family'
(ELSE......沒有可不加)
END;
(ELSE......沒有可不加)
END;
ORDER的強大效果......(順序可能因RDBMS不同而異)
ORDER BY column_name1 ASC,column_name2 DESC;
ASC(升冪,ASCENDING) : SQL預設排序方式,可不寫。
DESC(降冪,DESCENDING) : 可以反轉查詢結果的順序。
須注意,這個DESC與查看資料表欄位資訊的DESC(DESCRIBE)不同,且不能使用完整的寫法。
DISTINCT關鍵字可以選出獨一無二的值。
SELECT DISTINCT sale_date FROM cookie_sales ORDER BY sale_date;
LIMIT可以限制查詢數量。
SELECT first_name,SUM(sales) FROM cookie_sales GROUP BY first_name ORDER BY SUM(sales) DESC LIMIT 2; 表示只選出頭兩筆。
LIMIT 1,2 則表示選出第二筆和第三筆,前表index(第一筆index為0)後表筆數。
schema(綱要),用於表達資料庫內的結構,包括資料表與資料欄,還有各種資料構造相互連接的方式。
foreign key(外鍵),是資料表裡的某一欄,它參照的另一個資料表的主鍵。
第二正規化(2NF)
規則ㄧ : 符合1NF
規則二 : 沒有部分功能相依性
第三正規化(3NF)
規則ㄧ : 符合2NF
規則二 : 沒有遞移功能相依性
某某某改變了而我也要跟著改變,這稱做我對某某某具有功能相依性......
非關聯性子查詢(noncorrelated subqueries)--子查詢可以獨立執行,且不會參照外層查詢的任何結果。
關聯性子查詢(correlated subqueries)--內層查詢的解譯,需依賴外層查詢的結果。
SQL說 : 交叉連結是件非常浪費時間的事,關聯性子查詢也會拖慢速度。連結比子查詢有效率。
當看到自我參照的外鍵時,通常是使用自我連結的時機(透過別名的使用......)。
UNION--真正意義上的聯集,只接受ㄧ個ORDER BY,且須位於敘述末端,因為UNION已經把許多個查詢的結果串連起來,並區分了群組。
UNION ALL--同UNION,但包括所有重複的值。
任何ㄧ種SELECT查詢都可用於建立新資料表(搭配CREATE TABLE table_name AS......)。
沒有留言:
張貼留言