十一級資訊學實踐(CBSE)/簡單查詢
以下 SQL 命令提供有關當前伺服器上的資料庫的資訊。包含此資訊的 INFORMATION_SCHEMA 表是 SCHEMATA。
mysqlshow 命令列工具可以用來代替。
如果伺服器使用 —skip-all-databases 選項啟動,則無法顯示資料庫。
如果您沒有“SHOW DATABASES”許可權,您將只能看到您擁有某些許可權的資料庫。
顯示所有資料庫
SHOW DATABASES;
SCHEMA 關鍵字可以用來代替 DATABASES。MySQL 不支援標準 SQL SCHEMAs,因此 SCHEMA 是資料庫的同義詞。它已新增以與其他 DBMS 相容。
SHOW DATABASES LIKE 'pattern';
此處的 LIKE 運算子與普通 SELECT 或 DML 語句中的工作方式相同。因此您可以列出所有名稱以“my”開頭的資料庫
SHOW DATABASES LIKE'MY%';
您可以使用 WHERE 子句新增更復雜的過濾器
SHOW DATABASES WHERE (conditions);
WHERE 子句允許您使用正則表示式、“<” 和 “>” 運算子、字串函式或其他有用的表示式來過濾 SHOW DATABASES 返回的記錄。
以下 SQL 命令提供有關資料庫中包含的表和檢視的資訊。包含此資訊的 INFORMATION_SCHEMA 表是 `TABLES` 和 `VIEWS`。
由於以下語句關於檢視提供了很少的資訊,如果您需要獲取有關它們的元資料,您可能更願意查詢 VIEWS 表。
mysqlshow 命令列工具可以用來代替。
USE database; SHOW TABLES;
SHOW TABLES FROM database;
上面顯示的兩種形式是等效的。
您可以對錶名應用過濾器,以僅顯示名稱與模式匹配的表。您可以使用 LIKE 運算子,就像您在 SELECT 或 DML 語句中一樣
SHOW TABLES LIKE `pattern`;
此外,您可以使用 WHERE 子句對 SHOW TABLES 命令返回的任何列應用更復雜的過濾器。
SHOW TABLES WHERE condition;
(見下文)
預設情況下,SHOW TABLES 僅返回包含表名的單列。您可以使用 FULL 關鍵字獲取更多資訊。
SHOW FULL TABLES;
這將新增一個名為 `Table_type` 的列。它可以有 3 個值:`BASE TABLE` 用於表,`VIEW` 用於檢視,`SYSTEM VIEW` 用於伺服器建立的特殊表(通常僅用於 INFORMATION_SCHEMA 表)。
所以你只能列出表
SHOW FULL TABLES WHERE `Table_type`='BASE TABLE';
或者,您只能列出檢視
SHOW FULL TABLES WHERE `Table_type`='VIEW';
您可以獲取快取中開啟的非臨時表(非檢視)的列表。
SHOW OPEN TABLES;
此命令與 SHOW TABLES 具有相同的引數,除了 FULL(在這種情況下無用)。您無法從 INFORMATION_SCHEMA 獲取此資訊。
以下 SQL 命令提供有關表或檢視中列的資訊。包含此資訊的 INFORMATION_SCHEMA 表是 COLUMNS。
mysqlshow 命令列工具可以用來代替。
DESCRIBE `table`; DESCRIBE `database`.`table`; DESCRIBE `table` 'filter';
DESC 可用作 DESCRIBE 的快捷方式。
`filter` 可以是列名。如果指定了列名,則僅顯示該列。如果 `filter` 包含 `%` 或 `_` 字元,它將被評估為 LIKE 條件。例如,您可以列出所有以 `my` 開頭的欄位。
DESC `table` 'my%';
EXPLAIN `table`; --synonym SHOW [FULL] FIELDS FROM `table`; -- synonym SHOW COLUMNS FROM `table`; --synonym SHOW COLUMNS FROM `table` FROM `database`; SHOW COLUMNS FROM `table` LIKE 'pattern'; SHOW COLUMNS FROM `table` WHERE condition;
FIELDS 和 COLUMNS 是同義詞。EXPLAIN 也是 SHOW COLUMNS / FIELDS 的同義詞,但它不支援所有子句。
資料庫名稱可以在兩種形式中指定
SHOW COLUMNS FROM `table` FROM `database`;
兩者
SHOW COLUMNS FROM `database`.`table`;
使用 FULL 關鍵字,可以重試額外資訊:列的排序規則、您對列擁有的許可權以及註釋。
以下 SQL 命令提供有關表中索引的資訊。有關鍵的資訊包含在 INFORMATION_SCHEMA 的 `COLUMNS` 表中。
可以使用 mysqlshow -k 命令列工具代替。
SHOW INDEX FROM `TABLE`; SHOW INDEX FROM `TABLE` FROM `databases`;
KEYS 保留字可用作 INDEX 的同義詞。不提供其他子句。
information_schema 是 MySQL 5 及更高版本提供的虛擬資料庫,其中包含有關伺服器和資料庫的元資料。
在本書中,我們將使用反引號 (`) 引用 MySQL 識別符號(表名、欄位、資料庫等)。
反引號是 ASCII 96。它可以透過按 ALT+' 在 GNU/Linux 系統上鍵入。
大多數情況下,這是可選的。但是,這允許 MySQL 提供更好的錯誤訊息。例如,此錯誤不太有用
mysql> SELECT user_id, group_id FROM user,group LIMIT 1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group LIMIT 1' at line 1
但這個更好
mysql> SELECT user_id, group_id FROM `user`,`group` LIMIT 1; ERROR 1146 (42S02): Table 'savannah.group' doesn't exist
好的,它只是一個缺失的 s
mysql> SELECT user_id, group_id FROM `user`,`groups` LIMIT 1; +---------+----------+ | user_id | group_id | +---------+----------+ | 100 | 2 | +---------+----------+ 1 row in set (0.02 sec)
此語法允許使用者在物件名稱中使用保留字和一些非法字元。甚至可以透過兩次鍵入它來使用反引號。
RENAME TABLE `user` TO ````
但是,這不是可移植的語法。SQL 標準建議使用雙引號 (")。如果您想編寫可移植的 SQL 引號,請不要引用識別符號。但真的有像可移植 SQL 這樣的東西嗎?;)
| 一位維基百科人建議將本書或本章合併到 SQL。 請在討論頁面上討論是否應該進行此合併。 |
- DDL(資料定義語言)是指 CREATE、ALTER 和 DROP 語句
- DML(資料操作語言)是指 INSERT、UPDATE 和 DELETE 語句
- DQL(資料查詢語言)是指 SELECT、SHOW 和 HELP 語句(查詢)
- DCL(資料控制語言)是指 GRANT 和 REVOKE 語句
- 使用 := 賦值運算子在語句中設定變數的能力
- 例如,(@total)用於在示例中計算總計,您必須先擁有 total 列,因為它必須在個別百分比計算之前計算
- 會話變數在整個執行緒持續時間內設定。
- 在絕大多數情況下,您會使用程式語言來做這種事情。
- Mysql 變數在使用 Mysql 命令列時很有用。
- 如果未返回任何記錄,則使用者變數將不會為該語句設定。
- 在欄位列表中設定的使用者變數不能用作條件。
select @test := 2; select @test + 1
- 變數的值使用 SET 語句或帶有 := 的 SELECT 語句設定
set @startdate='some_start_date', @enddate='some_end_date'
SELECT @toremember:=count(*) FROM membros;
select @numzero := count(*) from table1 where field=0; select @numdistinct := count(distinct field) from table1 where field <> 0 ; select @numzero @numdistinct;
- 您可以將 SELECT 檢索到的值複製到一個或多個變數中
SELECT INTO
全域性變數對所有使用者可見。
可以使用 AS 為表示式和列指定別名。別名用作表示式的列名,可用於 order by 或 having 子句。例如
SELECT
CONCAT(last_name,' ', first_name) AS full_name,
nickname AS nick
FROM
mytable
ORDER BY
full_name
這些別名可以在 ORDER BY、GROUP BY 和 HAVING 子句中使用。它們不應在 WHERE 子句中使用。
表名可以使用 AS 為引用提供更短的名稱。您可以省略 AS 字詞並仍然使用別名。例如
SELECT
COUNT(B.Booking_ID), U.User_Location
FROM
Users U
LEFT OUTER JOIN
Bookings AS B
ON
U.User_ID = B.Rep_ID AND
B.Project_ID = '10'
GROUP BY
(U.User_Location)
別名在您使用自連線時起著至關重要的作用。例如,people 表已稱為 p 和 c 別名!
SELECT
p.name AS parent,
c.name AS child,
MIN((TO_DAYS(NOW())-TO_DAYS(c.dob))/365) AS minage
FROM
people AS p
LEFT JOIN
people AS c
ON
p.name=c.parent WHERE c.name IS NOT NULL
GROUP BY
parent HAVING minage > 50 ORDER BY p.dob;
SELECT
[edit | edit source]select 語法如下
SELECT * FROM table WHERE condition GROUP BY grouping field HAVING group condition ORDER BY order LIMIT limit, offset
欄位列表
[edit | edit source]您必須在 SELECT 子句中指定要檢索的資料
SELECT DATABASE() -- returns the current db's name SELECT CURRENT_USER() -- returns your username SELECT 1+1 -- returns 2
這裡允許使用任何 SQL 表示式。
您還可以從表中檢索所有欄位
SELECT * FROM `stats`
如果您只選擇必要的欄位,查詢將更快。
表的名稱
[edit | edit source]如果您要從表或檢視中檢索結果,通常您會在 FORM 子句中指定表的名稱
SELECT id FROM `stats`—retrieve a field called id from a table called stats
或者
SELECT MAX(id) FROM `stats` SELECT id*2 FROM `stats`
您也可以使用 `db_name`.`table_name` 語法
SELECT id FROM `sitedb`.`stats`
但是您也可以在 SELECT 子句中指定表的名稱
SELECT `stats`.`id`—retrieve a field called id from a table SELECT `sitedb`.`stats`.`id`
WHERE
[edit | edit source]您可以設定一個過濾器來決定要檢索哪些記錄。
例如,您可以只檢索 id 為 42 的記錄
SELECT * FROM `stats` WHERE `id`=42
或者您可以讀取多條記錄
SELECT * FROM `antiques` WHERE buyerid IS NOT NULL
GROUP BY
[edit | edit source]您可以按一個或多個欄位對所有記錄進行分組。對於在該欄位具有相同值的記錄,將被分組到一個計算記錄中。您只能選擇分組記錄和一些聚合函式的結果,這些函式將在每個組的所有記錄上計算。
例如,以下將對錶 `users` 中的所有記錄按欄位 `city` 進行分組。對於居住在同一城市的每組使用者,將返回最大年齡、最小年齡和平均年齡
SELECT city, MAX(age), MIN(age), AVG(age) GROUP BY `city`,
在以下示例中,使用者按城市和性別分組,這樣我們就可以知道每個城市中男性/女性使用者的最大、最小和平均年齡
SELECT city, sex, MAX(age), MIN(age), AVG(age) GROUP BY `city`, `sex`
HAVING
[edit | edit source]HAVING 子句宣告對由 GROUP BY 子句計算的記錄的過濾器。它不同於 WHERE 子句,WHERE 子句在 GROUP BY 之前操作。以下是發生的事情
- 與 WHERE 子句匹配的記錄將被檢索
- 這些記錄用於根據 GROUP BY 子句中定義的計算新記錄
- 與 HAVING 條件匹配的新記錄將被返回
這意味著 WHERE 決定什麼記錄用於組成新的計算記錄。
HAVING 決定返回哪些計算記錄,因此它可以對聚合函式的結果進行操作。HAVING 沒有最佳化,不能使用索引。
HAVING 的錯誤使用
SELECT city, sex, MAX(age), MIN(age), AVG(age) GROUP BY `city` HAVING sex='m'
這可能會導致錯誤的結果。MAX(age) 和其他聚合計算使用所有值進行,即使記錄的 sex 值為 'f'。這不太可能是預期結果。
HAVING 的錯誤使用
SELECT city, sex, MAX(age), MIN(age), AVG(age) GROUP BY `city`, `sex` HAVING sex='m'
這是正確的,並返回預期結果,但此查詢的執行沒有最佳化。WHERE 子句可以也應該使用,因為這樣 MySQL 就不會計算以後被排除的記錄。
HAVING 的正確使用
SELECT city, sex, MAX(age), MIN(age), AVG(age) GROUP BY `city` HAVING MAX(age) > 80
它必須對所有記錄進行分組,因為它在執行 GROUP BY 子句之前無法確定每個城市的最高年齡。之後,它只返回 MAX(age)>80 的記錄。
ORDER BY
[edit | edit source]您可以為檢索的記錄設定任意順序。順序可以是字母順序或數字順序。
SELECT * FROM `stats` ORDER BY `id`
預設情況下,順序是 ASCENDING。您還可以指定順序必須是 DESCENDING
SELECT * FROM `stats` ORDER BY `id` ASC—default SELECT * FROM `stats` ORDER BY `id` DESC—inverted
NULL 值被視為小於任何其他值。
您也可以指定欄位位置,而不是欄位名稱
SELECT `name`, `buyerid` FROM `antiques` ORDER BY 1 -- name SELECT `name`, `buyerid` FROM `antiques` ORDER BY 2 -- buyerid SELECT `name`, `buyerid` FROM `antiques` ORDER BY 1 DESC
允許使用 SQL 表示式
SELECT `name` FROM `antiques` ORDER BY REVERSE(`name`)
您可以以隨機順序檢索記錄
SELECT `name` FROM `antiques` ORDER BY RAND()
如果指定了 GROUP BY 子句,則結果將按 GROUP BY 中命名的欄位排序,除非存在 ORDER BY 子句。您甚至可以在 GROUP BY 子句中指定順序是升序還是降序
SELECT city, sex, MAX(age) GROUP BY `city` ASC, `sex` DESC
如果您有 GROUP BY,但您不希望記錄排序,可以使用 ORDER BY NULL
SELECT city, sex, MAX(age) GROUP BY `city`, `sex` ORDER BY NULL
LIMIT
[edit | edit source]您可以指定要讀取的最大行數
SELECT * FROM `antiques` ORDER BY id LIMIT 10
此語句最多返回 10 行。如果不存在 10 行,則返回找到的行數。limit 子句通常與 ORDER BY 一起使用。
您可以獲取給定數量的隨機記錄
SELECT * FROM `antiques` ORDER BY rand() LIMIT 1 -- one random record SELECT * FROM `antiques` ORDER BY rand() LIMIT 3
您可以指定在開始返回找到的記錄之前應該跳過多少行。第一條記錄是 0,而不是 1
SELECT * FROM `antiques` ORDER BY id LIMIT 10 SELECT * FROM `antiques` ORDER BY id LIMIT 0, 10—synonym
您可以使用 LIMIT 子句來獲取結果的分頁
SELECT * FROM `antiques` ORDER BY id LIMIT 0, 10—first page SELECT * FROM `antiques` ORDER BY id LIMIT 10, 10—second page SELECT * FROM `antiques` ORDER BY id LIMIT 20, 10—third page
此外,還接受以下語法
SELECT * FROM `antiques` ORDER BY id LIMIT 10 OFFSET 10
您可以使用 LIMIT 來檢查查詢的語法,而無需等待它返回結果
SELECT ... LIMIT 0
最佳化技巧
- SQL_CALC_FOUND_ROWS 可以加快 LIMIT 的速度。
- LIMIT 特別適用於使用 ORDER BY、DISTINCT 和 GROUP BY 的 SELECT,因為它們的計算不必涉及所有行。
- 如果查詢透過伺服器將結果內部複製到臨時表中來解決,則 LIMIT 有助於 MySQL 計算表所需的記憶體量。
DISTINCT
[edit | edit source]DISTINCT 關鍵字可用於從結果集中刪除所有重複行
SELECT DISTINCT * FROM `stats`—no duplicate rows SELECT DISTINCTROW * FROM `stats`—synonym SELECT ALL * FROM `stats`—duplicate rows returned (default)
您可以使用它來獲取包含在一個欄位中的所有值的列表
SELECT DISTINCT `type` FROM `antiques` ORDER BY `type`
或者您可以使用它來獲取一些值的現有組合
SELECT DISTINCT `type`, `age` FROM `antiques` ORDER BY `type`
如果要 SELECT 的欄位之一是 PRIMARY KEY 或具有 UNIQUE 索引,則 DISTINCT 無用。此外,在與 GROUP BY 子句結合使用時,使用 DISTINCT 也是無用的。
IN 和 NOT IN
[edit | edit source]SELECT id
FROM stats
WHERE position IN ('Manager', 'Staff')
SELECT ownerid, 'is in both orders & antiques' FROM orders, antiques WHERE ownerid = buyerid UNION SELECT buyerid, 'is in antiques only' FROM antiques WHERE buyerid NOT IN (SELECT ownerid FROM orders)
EXISTS 和 ALL
[edit | edit source](相容:Mysql 4+)
SELECT ownerfirstname, ownerlastname FROM owner WHERE EXISTS (SELECT * FROM antiques WHERE item = 'chair')
SELECT buyerid, item FROM antiques WHERE price = ALL (SELECT price FROM antiques)
最佳化提示
[edit | edit source]有一些提示您可能希望提供給伺服器以更好地最佳化 SELECT。如果您提供多個提示,關鍵字的順序很重要
SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT | SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] ...
HIGH_PRIORITY
通常,DML 命令 (INSERT、DELETE、UPDATE) 優先順序高於 SELECT。如果您指定 HIGH_PRIORITY,則 SELECT 的優先順序將高於 DML 語句。
STRAIGHT_JOIN 強制 MySQL 按命名順序評估 JOIN 的表,從最左邊開始。
SQL_SMALL_RESULT 僅在使用 DISTINCT 或 GROUP BY 時有用。告訴最佳化器查詢將返回少量行。
SQL_BIG_RESULT 僅在使用 DISTINCT 或 GROUP BY 時有用。告訴最佳化器查詢將返回許多行。
SQL_BUFFER_RESULT 強制 MySQL 將結果複製到臨時表中。這有助於儘快移除 LOCK。
SQL_CACHE 強制 MySQL 將結果複製到查詢快取中。僅在 query_cache_type 的值為 DEMAND 或 2 時才有效。
SQL_NO_CACHE 告訴 MySQL 不要快取結果。如果查詢很少發生或結果經常更改,這將很有用。
SQL_CALC_FOUND_ROWS 如果您使用 LIMIT 子句,這將很有用。告訴伺服器計算如果沒有 LIMIT 將返回多少行。您可以使用另一個查詢檢索該數字
SELECT SQL_CALC_FOUND_ROWS * FROM `stats` LIMIT 10 OFFSET 100; SELECT FOUND_ROWS();
UNION 和 UNION All
[edit | edit source](相容:Mysql 4+)
以下查詢將返回兩個表中的所有記錄。
SELECT * FROM English UNION ALL SELECT * FROM Hindi
UNION與UNION DISTINCT.
相同。如果您只鍵入 UNION,則表示您正在請求不同的記錄。如果您想要所有記錄,您必須使用UNION ALL.
SELECT word FROM word_table WHERE id = 1 UNION SELECT word FROM word_table WHERE id = 2
(SELECT magazine FROM pages) UNION DISTINCT (SELECT magazine FROM pdflog) ORDER BY magazine
(SELECT ID_ENTRY FROM table WHERE ID_AGE = 1) UNION DISTINCT (SELECT ID_ENTRY FROM table WHERE ID_AGE=2)
資料操作
[edit | edit source]INSERT
[edit | edit source]語法如下
將 value1 插入 Column1,將 value2 插入 Column2,將 value3 插入 Column3
INSERT INTO TableName (Column1, Column2, Column3) VALUES (value1, value2, value3)
插入一條記錄(值按列在資料庫中出現的順序插入)
INSERT INTO TableName VALUES (value1, value2, value3)
插入兩條記錄
INSERT INTO TableName VALUES (value1, value2, value3), (value4, value5, value6)
INSERT INTO antiques VALUES (21, 01, 'Ottoman', 200.00); INSERT INTO antiques (buyerid, sellerid, item) VALUES (01, 21, 'Ottoman');
您也可以插入來自其他表的“選定”記錄。
INSERT INTO table1(field1, field2) SELECT field1, field2 FROM table2
INSERT INTO World_Events SELECT * FROM National_Events
效能提示
- 要插入多行,請考慮使用 LOAD DATA INFILE。
- 如果批次 INSERT 太慢,並且它們對索引的非空表進行操作,也許您應該增加 bulk_insert_buffer_size 的值。
- 在執行批次插入之前,您可能需要停用 keys。
- 鎖定表也可以加快 INERT 速度。
語法是
UPDATE table SET field = newvalue WHERE criteria ORDER BY field LIMIT n
示例如下:
UPDATE owner SET ownerfirstname = 'John' WHERE ownerid = (SELECT buyerid FROM antiques WHERE item = 'Bookcase'); UPDATE antiques SET price = 500.00 WHERE item = 'Chair'; UPDATE order SET discount=discount * 1.05 UPDATE tbl1 JOIN tbl2 ON tbl1.ID = tbl2.ID SET tbl1.col1 = tbl1.col1 + 1 WHERE tbl2.status='Active' UPDATE tbl SET names = REPLACE(names, 'aaa', 'zzz') UPDATE products_categories AS pc INNER JOIN products AS p ON pc.prod_id = p.id SET pc.prod_sequential_id = p.sequential_id UPDATE table_name SET col_name = REPLACE(col_name, 'host.domain.com', 'host2.domain.com')
UPDATE posts SET deleted=True ORDER BY date LIMIT 1
使用 ORDER BY,您可以在更新行之前對它們進行排序,並且只更新給定數量的行 (LIMIT)。
目前無法在對同一表執行子查詢時更新表。例如,如果我想重置我在 SPIP 中忘記的密碼
mysql> UPDATE spip_auteurs SET pass = (SELECT pass FROM spip_auteurs WHERE login='paul') where login='admin'; ERROR 1093 (HY000): You can't specify target table 'spip_auteurs' for update in FROM clause
待辦事項:[1] 描述了一種我無法在 MySQL 4.1 中使用的解決方法。目前,解決方法是不使用 2 個子查詢,可能需要使用事務。
效能提示
- UPDATE 的速度取決於更新了多少索引。
- 如果您更新使用動態格式的 MyISAM 表,如果您使行變大,它們可能會被拆分為多個部分。這會導致讀取開銷。因此,如果您的應用程式經常執行此操作,您可能需要定期執行 OPTIMIZE TABLE 語句。
- 在 LOCKed 表上一起執行許多 UPDATE 比單獨執行它們要快。
REPLACE 的工作原理與 INSERT 完全相同,區別在於,如果表中的一條舊記錄對於 PRIMARY KEY 或 UNIQUE 索引具有與新記錄相同的值,則在插入新記錄之前會刪除舊記錄。
使用 IGNORE,無效值將調整為最接近的值並插入;會生成警告,但語句不會中止。
在 MySQL 4.0.1 之前,INSERT ... SELECT 隱式地以 IGNORE 模式執行。從 MySQL 4.0.1 開始,請顯式指定 IGNORE 以忽略會導致重複鍵衝突的記錄。
DELETE [QUICK] FROM table1 TRUNCATE table1
- 如果您不使用 WHERE 子句與 DELETE 一起使用,所有記錄都將被刪除。
- 它在大型表中可能非常慢,尤其是在表具有許多索引的情況下。
- 如果表具有許多索引,您可以增加快取的大小以嘗試使 DELETE 速度更快 (key_buffer_size 變數)。
- 對於索引的 MyISAM 表,在某些情況下,如果您指定 QUICK 關鍵字 (DELETE QUICK FROM ...),則 DELETE 速度更快。這僅適用於 DELETEed 索引值將被重複使用的情況。
- TRUNCATE 會透過 DROP 和重新 CREATE 表來快速刪除所有行(並非所有儲存引擎都支援此操作)。
- TRUNCATE 不是事務安全的,也不是鎖安全的。
- DELETE 會告訴您刪除了多少行,但 TRUNCATE 不會。
- 在刪除了許多行(約 30%)之後,OPTIMIZE TABLE 命令應該會使下一個語句更快。
DELETE FROM `antiques` WHERE item = 'Ottoman' ORDER BY `id` LIMIT 1
您可以在刪除行之前對它們進行排序,然後只刪除給定數量的行。
建立表的語法是:Create table tablename (FieldName1 DataType,
FieldName2 DataType)
"select" 查詢返回的行可以儲存為一個新表。資料型別將與舊錶相同。例如,CREATE TABLE LearnHindi
select english.tag, english.Inenglish as English, hindi.Inhindi as Hindi
FROM English, Hindi
WHERE english.tag = hindi.tag
ALTER TABLE 命令可用於在您想要新增/刪除/修改列和/或索引時使用;或者,它可用於更改其他表屬性。
新增列
ALTER TABLE awards ADD COLUMN AwardCode int(2)
修改列
ALTER TABLE awards CHANGE COLUMN AwardCode VARCHAR(2) NOT NULL
ALTER TABLE awards MODIFY COLUMN AwardCode VARCHAR(2) NOT NULL
刪除列
ALTER TABLE awards DROP COLUMN AwardCode
重新排序表中的記錄
ALTER TABLE awards ORDER BY id
(此操作僅受某些儲存引擎支援;它可能會使某些查詢更快)
要重命名錶,您必須對舊錶名(或所有表)具有 ALTER 和 DROP 許可權,以及對新表名(或所有表)具有 CREATE 和 INSERT 許可權。
您可以使用 ALTER TABLE 來重命名錶
RENAME TABLE `old_name` TO `new_name`
您可以使用單個命令重新命名多個表
RENAME TABLE `old1` TO `new1`, `old2` TO `new2`, ...
RENAME 是一個快捷方式。您也可以使用 ALTER TABLE 語句
ALTER TABLE `old` RENAME `new`
使用 ALTER TABLE,您每個語句只能重新命名一個表,但它是重新命名臨時表的唯一方法。
DROP TABLE `awards`
將完全刪除表及其包含的所有記錄。
您也可以使用單個語句刪除多個表
DROP TABLE `table1`, `table2`, ...
有一些可選的關鍵字
DROP TEMPORARY TABLE `table`; DROP TABLE `table` IF EXISTS;
必須指定 TEMPORARY,才能刪除臨時表。IF EXISTS 告訴伺服器,如果表不存在,則不應引發錯誤。
Null 是 SQL 中的一種特殊邏輯值。大多數程式語言具有 2 個邏輯值:True 和 False。SQL 也具有 NULL,表示“未知”。可以設定 NULL 值。
NULL 是一個非值,因此它可以分配給 TEXT 列、INTEGER 列或任何其他資料型別。只有在列被宣告為 NOT NULL 時,它才不能包含 NULL(請參見 ALTER TABLE)。
INSERT into Singer
(F_Name, L_Name, Birth_place, Language)
values
("", "Homer", NULL, "Greek"),
("", "Sting", NULL, "English"),
("Jonny", "Five", NULL, "Binary");
不要引用 NULL。如果您引用 Null,那麼您就是命名為 NULL 的人。由於某種奇怪的原因,NULL 在 Varchar 欄位中的 Windows XP 上不會在視覺上顯示,但在 Fedora 版本中會顯示,因此 mysql 的版本可能會產生不同的輸出。在這裡,我們將 Sting 和 Homer 的名字設定為零長度字串“”,因為我們知道他們沒有名字,但我們知道我們不知道他們的出生地的位置。要檢查 NULL,請使用
SELECT * from Singer WHERE Birth_place IS NULL; or SELECT * from Singer WHERE Birth_place IS NOT NULL; or SELECT * from Singer WHERE isNull(Birth_place)
請記住,COUNT 從不計算 NULL。
select count(Birth_place) from Singer; 0 and sum(NULL) gives a NULL answer.
如果至少有一個比較項是 NULL,則正常操作(比較、表示式等)將返回 NULL
SELECT (NULL=NULL) OR (NULL<>NULL) OR (NOT NULL) OR (1<NULL) OR (1>NULL) OR (1 + NULL) OR (1 LIKE NULL)
因為括號中的所有表示式都返回 NULL。這絕對合乎邏輯:如果您不知道 NULL 所表示的值,那麼您不知道它是否 =1 或 <>1。請注意,即使 (NULL=NULL and (NOT NULL) 返回 NULL。
函式 'COALESCE' 可以簡化對空值的處理。例如,要透過將空值視為零來避免顯示空值,您可以鍵入
SELECT COALESCE(colname,0) from table where COALESCE(colname,0) > 1;
在日期欄位中,將 NULL 視為當前日期
ORDER BY (COALESCE(TO_DAYS(date),TO_DAYS(CURDATE()))-TO_DAYS(CURDATE()))
EXP(SUM(LOG(COALESCE(*the field you want to multiply*,1)))
coalesce() 函式是為了防止嘗試計算空值的對數,它可能是可選的,具體取決於您的情況。
SELECT t4.gene_name, COALESCE(g2d.score,0), COALESCE(dgp.score,0), COALESCE(pocus.score,0) FROM t4 LEFT JOIN g2d ON t4.gene_name=g2d.gene_name LEFT JOIN dgp ON t4.gene_name=dgp.gene_name LEFT JOIN pocus ON t4.gene_name=pocus.gene_name;
在您的 SELECT 語句中使用 IFNULL() 是為了將 NULL 設為任何您想要的 value。
IFNULL(expr1,expr2)
如果 expr1 不是 NULL,IFNULL() 將返回 expr1,否則返回 expr2。
IFNULL() 返回一個數字或字串值,具體取決於它使用的上下文。
mysql> SELECT IFNULL(1,0); -> 1 mysql> SELECT IFNULL(NULL,10); -> 10 mysql> SELECT IFNULL(1/0,10); -> 10 mysql> SELECT IFNULL(1/0,'yes'); -> 'yes'
NULL 處理可能非常反直覺,如果您的 delete 語句中有一個錯誤的函式返回 null,則可能會導致問題。例如,以下查詢將刪除所有條目。
DELETE FROM my_table WHERE field > NULL (or function returning NULL)
如果您希望在進行 ORDER BY 時將 NULL 值顯示在最後,請嘗試以下操作
SELECT * FROM my_table ORDER BY ISNULL(field), field [ ASC | DESC ]
困難的列名,例如 `DATE`—使用反引號。如果使用“date”作為列名,請將其用反引號 ` 括起來,如下所示
CREATE TABLE IF NOT EXISTS stocks ( pkey int NOT NULL auto_increment, `date` date, ticker varchar(5), open decimal (9,2), high decimal (9,2), low decimal (9,2), close decimal (9,2), volume int, timeEnter timestamp(14), PRIMARY KEY (pkey) );
VARCHAR 是 CHARACTER VARYING 的簡寫。'n' 表示最大列長度(最多 255 個字元)char(n) 與 varchar(n) 類似,唯一的區別是 char 將在資料庫中佔用固定長度的空間,而 varchar 將需要空間來儲存實際文字。例如,VARCHAR(10) 列可以儲存最大長度為 10 個字元的字串。實際所需的儲存空間是字串的長度 (L),加上 1 個位元組來記錄字串的長度。對於字串 'abcd',L 是 4,儲存需求是 5 個位元組。
一個 BLOB 或 TEXT 列,最大長度為 65,535 個字元。
指定 n 值沒有任何效果。無論為 n 提供什麼值,儲存的最大(無符號)值為 429 crores。如果要新增負數,請在旁邊新增 "signed" 關鍵字。
decimal(n,m) decimal(4,2) 表示最多可以儲存 99.99(而不是您可能期望的 9999.99)的數字。四位數字,最後兩位保留為小數。
在三種類型 DATETIME、DATE 和 TIMESTAMP 中,當您只需要日期值,而不需要時間部分時,使用 DATE 型別。MySQL 以 'YYYY-MM-DD' 格式檢索和顯示 DATE 值。當您需要包含日期和時間資訊的價值時,使用 DATETIME 型別。DATETIME 和 TIMESTAMP 之間的區別在於 TIMESTAMP 範圍限制在 1970-2037 年(見下文)。
TIME 可用於僅儲存一天中的時間(HH:MM:SS),而無需日期。它也可以用於表示時間間隔(例如:-02:00:00 表示“過去兩小時”)。範圍:'-838:59:59' => '838:59:59'。
YEAR 可用於僅儲存年份數字。
如果操縱日期,則必須指定實際日期,而不僅僅是時間 - 也就是說,MySQL 不會自動使用今天作為當前日期。相反,MySQL 甚至會將 HH:MM:SS 時間解釋為 YY:MM:DD 值,這可能是無效的。
以下示例顯示了基於 Unix 的時間戳的精確日期範圍,該時間戳從 Unix 紀元開始,並在 通常的限制(2038)之前的第一個新年之前結束。
mysql> SET time_zone = '+00:00'; -- GMT Query OK, 0 rows affected (0.00 sec)
mysql> SELECT FROM_UNIXTIME(-1); +-------------------+ | FROM_UNIXTIME(-1) | +-------------------+ | NULL | +-------------------+ 1 row in set (0.00 sec) mysql> SELECT FROM_UNIXTIME(0); -- "Epoch" +---------------------+ | FROM_UNIXTIME(0) | +---------------------+ | 1970-01-01 00:00:00 | +---------------------+ 1 row in set (0.00 sec) mysql> SELECT FROM_UNIXTIME(2145916799); +---------------------------+ | FROM_UNIXTIME(2145916799) | +---------------------------+ | 2037-12-31 23:59:59 | +---------------------------+ 1 row in set (0.00 sec) mysql> SELECT FROM_UNIXTIME(2145916800); +---------------------------+ | FROM_UNIXTIME(2145916800) | +---------------------------+ | NULL | +---------------------------+ 1 row in set (0.00 sec)
SET 資料型別可以儲存來自建立表時指定的預定義字串列表的任意數量的字串。SET 資料型別類似於 ENUM 資料型別,因為它們都使用預定義的字串集,但 ENUM 資料型別限制您使用預定義字串集中單個成員,而 SET 資料型別允許您將預定義字串集中所有成員中的任何成員一起儲存,從沒有到全部。
MySQL 使用一些標準 SQL 運算子和一些非標準運算子。它們可以用於編寫涉及常量值、變數、欄位中包含的值和/或其他表示式的表示式。
運算子優先順序表
INTERVAL BINARY, COLLATE ! - (unary minus), ~ (unary bit inversion) ^ *, /, DIV, %, MOD -, + <<, >> & | =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN BETWEEN, CASE, WHEN, THEN, ELSE NOT &&, AND XOR ||, OR :=
修飾符
- PIPES_AS_CONCAT - 如果啟用了此 SQL 模式,則 || 優先於 ^,但 - 和 ~ 優先於 ||。
- HIGH_NOT_PRECEDENCE - 如果啟用了此 SQL 模式,則 NOT 與 ! 具有相同的優先順序。
可以使用括號強制 MySQL 在不依賴運算子優先順序的情況下,先評估一個子表示式,然後再評估另一個子表示式。
SELECT (1 + 1) * 5 -- returns 10
即使括號不會影響優先順序,也可以使用括號使表示式對人類更易讀。
SELECT 1 + (2 * 5) -- the same as 1 + 2 * 5
可以使用 = 運算子將值賦給列。
UPDATE `myTable` SET `uselessField`=0
當您要將值賦給變數時,必須使用 := 運算子,因為使用 = 會造成歧義(是賦值還是比較?)。
SELECT @myvar := 1
也可以使用 SELECT INTO 將值賦給一個或多個變數。
如果要檢查兩個值是否相等,必須使用 = 運算子。
SELECT True = True—returns 1 SELECT True = False—returns 0
如果要檢查兩個值是否不同,可以使用<> 或 != 運算子,它們的含義相同。
SELECT True <> False—returns 1 SELECT True != True—returns 0
<> 在 = 返回 0 的地方返回 1,反之亦然。
當將 NULL 值與非 NULL 值進行比較時,您將獲得 NULL。如果要檢查某個值是否為 null,可以使用 IS。
SELECT (NULL IS NULL) -- returns 1 SELECT (1 IS NULL) -- returns 0 SELECT (True IS True) -- returns an error!
可以檢查某個值是否為非 NULL。
SELECT (True IS NOT NULL) -- returns 1
還有一個相等運算子,它將 NULL 視為正常值,因此如果兩個值都為 NULL,則返回 1(非 NULL),如果其中一個值為 NULL,則返回 0(非 NULL)。
SELECT col1 <=> col2 FROM myTable
沒有 NULL 安全的不等運算子,但可以鍵入以下內容。
SELECT NOT (col1 <=> col2) FROM myTable
IS 和 IS NOT 也可用於布林比較。可以將它們與保留字 TRUE、FALSE 和 UNKNOWN(它只是 NULL 的同義詞)一起使用。
SELECT 1 IS TRUE—returns 1 SELECT 1 IS NOT TRUE—returns 0 SELECT 1 IS FALSE—returns 0 SELECT (NULL IS NOT FALSE) -- returns 1: unknown is not false SELECT (NULL IS UNKNOWN) -- returns 1 SELECT (NULL IS NOT UNKNOWN) -- returns 0
可以檢查某個值是否大於另一個值。
SELECT 100 > 0 -- returns 1 SELECT 4 > 5 -- return 0
也可以檢查某個值是否小於另一個值。
SELECT 1 < 2 -- returns 1 SELECT 2 < 2 -- returns 0
這種比較也適用於 TEXT 值。
SELECT 'a' < 'b' -- returns 1
通常,TEXT 比較使用字母順序。但是,確切規則由所使用的校對定義。校對定義了給定字元集的排序規則。例如,一個校對可能區分大小寫,而另一個校對可能不區分大小寫。
可以檢查某個值是否等於或大於另一個值。例如,以下查詢含義相同。
SELECT `a` >= `b` FROM `myTable` SELECT NOT (`a` < `b`) FROM `myTable`
類似地,可以檢查某個值是否小於或等於另一個值。
SELECT `a` <= `b` FROM `myTable`
如果要檢查某個值是否包含在給定範圍內,可以使用 BETWEEN ... AND ... 運算子。AND 沒有其通常的含義。示例。
SELECT 20 BETWEEN 10 AND 100—returns 1
BETWEEN 後的值和 AND 後的值都包含在範圍內。
也可以使用 NOT BETWEEN 檢查某個值是否不包含在範圍內。
SELECT 8 NOT BETWEEN 5 AND 10—returns 0
可以使用 IN 運算子檢查某個值是否包含在值列表中。
SELECT 5 IN (5, 6, 7) -- returns 1 SELECT 1 IN (5, 6, 7) -- returns 0
不應在列表中同時包含數字和字串,否則結果可能不可預測。如果存在數字,則應將它們引用。
SELECT 4 IN ('a', 'z', '5')
IN 運算子中包含的值數量沒有理論限制。
也可以使用 NOT IN。
SELECT 1 NOT IN (1, 2, 3) -- returns 0
邏輯運算子
[edit | edit source]MySQL 布林邏輯
[edit | edit source]MySQL 沒有真正的 BOOLEAN 資料型別。
FALSE 是 0 的同義詞。在布林上下文中,空字串被視為 FALSE。
TRUE 是 1 的同義詞。在布林上下文中,所有非 NULL 和非 FALSE 資料都被視為 TRUE。
UNKNOWN 是 NULL 的同義詞。特殊日期 0/0/0 是 NULL。
NOT
[edit | edit source]NOT 是唯一一個只有一個運算元的運算子。如果運算元為 TRUE,它返回 0;如果運算元為 FALSE,它返回 1;如果運算元為 NULL,它返回 NULL。
SELECT NOT 1 -- returns 0 SELECT NOT FALSE—returns 1 SELECT NOT NULL—returns NULL SELECT NOT UNKNOWN—returns NULL
! 是 NOT 的同義詞。
SELECT !1
AND
[edit | edit source]如果兩個運算元都為 TRUE,AND 返回 1,否則返回 0;如果其中一個運算元為 NULL,則返回 NULL。
SELECT 1 AND 1 -- returns 1 SELECT 1 AND -- return 0 SELECT AND NULL—returns NULL
&& 是 AND 的同義詞。
SELECT 1 && 1
OR
[edit | edit source]如果至少一個運算元為 TRUE,OR 返回 TRUE,否則返回 FALSE;如果其中一個運算元為 NULL,則返回 NULL。
SELECT TRUE OR FALSE—returns 1 SELECT 1 OR 1 -- returns 1 SELECT FALSE OR FALSE—returns 0 SELECT NULL OR TRUE—returns NULL
|| 是 OR 的同義詞。
SELECT 1 || 0
XOR
[edit | edit source]XOR(異或)如果只有一個運算元為 TRUE 而另一個運算元為 FALSE,則返回 1;如果兩個運算元都為 TRUE 或都為 FALSE,則返回 0;如果其中一個運算元為 NULL,則返回 NULL。
SELECT 1 XOR 0 -- returns 1 SELECT FALSE XOR TRUE—returns 1 SELECT 1 XOR TRUE—returns 0 SELECT 0 XOR FALSE—returns 0 SELECT NULL XOR 1 -- returns NULL
同義詞
[edit | edit source]AND 可以寫成 &&
OR 可以寫成 ||
NOT 可以寫成 !
只有 NOT(通常)與它的同義詞具有不同的優先順序。有關詳細資訊,請參閱運算子優先順序。
算術運算子
[edit | edit source]MySQL 支援執行所有基本算術運算的運算元。
如果需要,可以使用 '+' 鍵入正值。
SELECT +1 -- return 1
可以使用 '-' 鍵入負值。- 是一個反轉運算子。
SELECT -1 -- returns -1 SELECT -+1 -- returns -1 SELECT—1 -- returns 1
可以使用 '+' 進行求和。
SELECT 1 + 1 -- returns 2
可以使用 '-' 進行減法。
SELECT True - 1 -- returns 0
可以使用 '*' 乘以一個數字。
SELECT 1 * 1 -- returns 1
可以使用 '/' 進行除法。返回一個 FLOAT 數字。
SELECT 10 / 2 -- returns 5.0000 SELECT 1 / 1 -- returns 1.0000 SELECT 1 / 0 -- returns NULL (not an error)
可以使用 DIV 進行整數除法。結果數字為 INTEGER。沒有餘數。這在 MySQL 4.1 中新增。
SELECT 10 DIV 3 -- returns 3
可以使用 '%' 或 MOD 獲取除法的餘數。
SELECT 10 MOD 3 -- returns 1
使用 + 轉換資料
[edit | edit source]可以透過以下方式將 INTEGER 轉換為 FLOAT。
SELECT 1 + 0.0 -- returns 1.0 SELECT 1 + 0.000—returns 1.000 SELECT TRUE + 0.000—returns 1.000
不能透過新增 0.0 來將字串轉換為 FLOAT 值,但可以將其轉換為 INTEGER。
SELECT '1' + 0 -- returns 1 SELECT '1' + FALSE—returns 1 SELECT '' + ''—returns 0
文字運算子
[edit | edit source]MySQL 中沒有連線運算子。
算術運算子將值轉換為數字,然後執行算術運算,因此不能使用 + 連線字串。
可以使用 CONCAT() 函式代替。
LIKE
[edit | edit source]LIKE 運算子可用於檢查字串是否與模式匹配。一個簡單的例子
SELECT * FROM articles WHERE title LIKE 'hello world'
模式匹配通常不區分大小寫。有兩個例外:
- 當對已使用 BINARY 標誌(參見 CREATE TABLE)宣告的列執行 LIKE 比較時;
- 當表示式包含 BINARY 子句時。
SELECT * 'test' LIKE BINARY 'TEST' -- returns 0
對於 LIKE 比較,可以使用兩個特殊字元:
- _ 表示“任何字元”(但必須是 1 個字元,不能是 0 個或 2 個)。
- % 表示“任何字元序列”(甚至是 0 個字元或 1000 個字元)。
請注意,“\” 也會轉義引號('),這種行為無法透過 ESCAPE 子句更改。此外,跳脫字元不會轉義自身。
LIKE 的常見用法
- 查詢以“hello”一詞開頭的標題
SELECT * FROM articles WHERE title LIKE 'hello%'
- 查詢以“world”一詞結尾的標題
SELECT * FROM articles WHERE title LIKE '%world'
- 查詢包含“gnu”一詞的標題
SELECT * FROM articles WHERE title LIKE '%gnu%'
這些特殊字元可能包含在模式本身中:例如,您可能需要搜尋“_”字元。在這種情況下,您需要“轉義”該字元。
SELECT * FROM articles WHERE title LIKE '\_%' -- titles starting with _ SELECT * FROM articles WHERE title LIKE '\%%' -- titles starting with %
有時,您可能希望使用與“\”不同的跳脫字元。例如,您可以使用“/”。
SELECT * FROM articles WHERE title LIKE '/_%' ESCAPE '/'
使用 = 運算子時,會忽略尾隨空格。使用 LIKE 時,會考慮尾隨空格。
SELECT 'word' = 'word ' -- returns 1 SELECT 'word' LIKE 'word ' -- returns 0
LIKE 也適用於數字。
SELECT 123 LIKE '%2%' -- returns 1
如果要檢查模式是否不匹配,可以使用 NOT LIKE。
SELECT 'a' NOT LIKE 'b' -- returns 1
SOUNDS LIKE
[edit | edit source]可以使用 SOUNDS LIKE 檢查兩個文字值的發音是否相同。SOUNDS LIKE 使用 SOUNDEX 演算法,該演算法基於英語規則,非常近似(但簡單且因此速度很快)。
SELECT `word1` SOUNDS LIKE `word2` FROM `wordList`—short form SELECT SOUNDEX(`word1`) = SOUNDEX(`word2`) FROM `wordList`—long form
SOUNDS LIKE 是 MySQL 對 SQL 的特定擴充套件。它是在 MySQL 4.1 中新增的。
正則表示式
[edit | edit source]可以使用 REGEXP 使用正則表示式檢查字串是否與模式匹配。
SELECT 'string' REGEXP 'pattern'
可以使用 RLIKE 作為 REGEXP 的同義詞。
位運算子
[edit | edit source]位非
SELECT ~0 -- returns 18446744073709551615 SELECT ~1 -- returns 18446744073709551614
位與
SELECT 1 & 1 -- returns 1 SELECT 1 & 3 -- returns 1 SELECT 2 & 3 -- returns 2
位或
SELECT 1 | 0 -- returns 1 SELECT 3 | 0 -- returns 3 SELECT 4 | 2 -- returns 6
位異或
SELECT 1 ^ 0 -- returns 1 SELECT 1 ^ 1 -- returns 0 SELECT 3 ^ 1 -- returns 2
左移
SELECT 1 << 2 -- returns 4
右移
SELECT 1 >> 2 -- 0
匯入/匯出
[edit | edit source]除了 mysqldump(參見 MySQL/Administration)之外,還可以使用以下命令匯出原始資料:
SELECT ... FROM table INTO OUTFILE 'path' LOAD DATA INFILE 'path' INTO TABLE table
示例
SELECT * FROM destinataire INTO OUTFILE '/tmp/test' WHERE id IN (41, 141, 260, 317, 735, 888, 1207, 2211); # in another database/computer/etc.: LOAD DATA INFILE '/tmp/test' INTO TABLE destinataire;
請注意,MySQL 守護程序本身會寫入檔案,而不是您執行 MySQL 客戶端的使用者。該檔案將儲存在伺服器上,而不是您的主機上。此外,伺服器將需要對您指定的路徑具有寫入訪問許可權(通常,伺服器_不能_寫入您的主目錄,例如)。因此,我們在示例中(不安全地)使用了 /tmp。
練習
[edit | edit source]練習 SELECT
[edit | edit source]表 `list`
[edit | edit source]| ID | Name | Surname | FlatHave | FlatWant |
| 1 | Shantanu | Oak | Goregaon | |
| 2 | Shantanu | Oak | Andheri | |
| 3 | Shantanu | Oak | Dadar | |
| 4 | Ram | Joshi | Goregaon | |
| 5 | Shyam | Sharma | Andheri | |
| 6 | Ram | 奈克 | 西翁 | |
| 7 | 薩米爾 | 沙阿 | 帕爾勒 | |
| 8 | Ram | Joshi | Dadar | |
| 9 | Shyam | Sharma | Dadar |
- 誰在“戈雷岡”有一套公寓,誰想買一套?
- 誰在“帕爾勒”有一套公寓,誰想買一套?
- “尚塔努·奧克”在哪擁有公寓,他想去哪裡買一套?
- 迄今為止記錄了多少條目?
- 有多少公寓出售?
- 我們的客戶姓名是什麼?
- 我們有多少客戶?
- 列出姓名以“S”開頭的客戶?
- 按字母順序重新排列列表。
- select * from list where FlatHave = "Goregaon" and FlatWant = "Goregaon"
- select * from list where FlatHave = "Parle" and FlatWant = "Parle"
- select FlatHave,FlatWant from list where Name = "Shantanu" and Surname = "Oak"
- select count(*) from list
- select count(FlatHave) from list where FlatHave is not null
- select distinct Name, Surname from list
- select count(distinct Name, surname) from list
- select * from list where Name like "S%"
- select Surname, Name, FlatHave, FlatWant from list order by Name
| ID | Name | 數學 | 物理 | 文學 |
| 1 | 約翰 | 68 | 37 | 54 |
| 2 | 吉姆 | 96 | 89 | 92 |
| 3 | 比爾 | 65 | 12 | 57 |
| 4 | 傑裡 | 69 | 25 | 82 |
- 所有數學成績超過 90 分的學生列表
?
- 所有科目成績都超過 85 分的學生列表?
- 宣告結果:列印所有學生的成績,帶有結果列。
- 找出所有學生的總分。
- 每個科目的班級平均分是多少?
- 數學最低分是多少?
- 數學最高分是多少?
- 誰的數學成績最高?
注意:許多問題有多個正確答案。
- SELECT * FROM grades WHERE math > 90
- SELECT name FROM grades WHERE math > 85 AND physics > 85 AND literature > 85
- SELECT *, IF( (math <= 35 OR physics <= 35 OR literature <= 35), 'fail', 'pass') AS result FROM grades ORDER BY result DESC
- SELECT name, math+physics+literature FROM grades
- SELECT AVG(math), AVG(physics), AVG(literature) FROM grades
- SELECT MIN(math) FROM grades
- SELECT MAX(math) FROM grades
- SELECT * FROM students ORDER BY math DESC LIMIT 1
SELECT Vendor, ID, Count(1) as dupes FROM table_name GROUP BY Vendor, ID HAVING Count(1) >1
SELECT txt, COUNT(*) FROM dupes GROUP BY txt HAVING COUNT(*) > 1;
SELECT id, COUNT( id ) AS cnt, FROM myTable GROUP BY id HAVING cnt > 1
假設以下表格和資料。
CREATE TABLE IF NOT EXISTS dupTest
(pkey int(11) NOT NULL auto_increment,
an int, b int, c int, timeEnter timestamp(14),
PRIMARY KEY (pkey));
insert into dupTest (a,b,c) values (1,2,3),(1,2,3),
(1,5,4),(1,6,4);
注意,前兩行在列 a 和 b 中包含重複項。它包含其他重複項;但是,保留其他重複項。
ALTER IGNORE TABLE dupTest ADD UNIQUE INDEX(a,b);