SQL基礎

1.數據表創建和管理

SQL 關鍵字不區分大小寫,爲了可讀性高,一般寫成大寫。

創建表,下面語句定義了非空約束,默認值,主鍵和外鍵

CREATE TABLE Person(id INT, schoolid INT, name VARCHAR(20) NOT NULL, age INT DEFAULT 0, PRIMARY KEY(id), FOREIGN KEY(schoolid) REFERENCES School(id));

修改表

ALTER TABLE Person ADD 字段名 字段類型;
ALTER TABLE Person DROP 字段;
刪除數據表
DROP TABLE Person;

2.數據增刪改

插入數據
插入單行數據
INSERT INTO Person(id,name, age) values(1,"chen", 18);
插入多行數據
INSERT INTO Person SELECT * FROM Person;
更新數據
UPDATE Person SET name = "chen";數據表全部更新
UPDATE Person SET name = "chen" WHERE name="li";更新部分行
刪除數據
DELETE FROM Person;刪除數據表全部數據
DELETE FROM Person WHERE name="chen";//刪除部分數據

3.數據檢索

取出所有數據
SELECT * FROM Person;
取出部分列
SELECT name FROM Person;
列別名
SELECT name AS "姓名" FROM Person;AS可以省略
數據不重複
SELECT DISTINCT name FROM Person;
條件檢索
SELECT name FROM Person WHERE age>18 OR age < 60;
SQL聚合函數 MAX MIN AVG SUM COUNT
SELECT MAX(age) AS "最高年齡" FROM Person;
排序
默認排序是ASC升序,降序是DESC
SELECT name FROM Person ORDER BY age ASC,name DESC;
分組
SELECT * FROM Person GROUP BY age;有幾種年齡顯示幾行,name字段被掩蓋
SELECT * FROM Person GROUP BY age HAVING COUNT(*)>1;使用聚合函數和HAVING語句過濾
通配符過濾,單字符匹配'_',多字符匹配'%'
SELECT * FROM Person WHERE name LIKE '_h%';
空值檢測
沒有添加非空約束列可以爲空值(NULL),檢測字段是否爲空使用"IS NULL"和"IS NOT NULL"
SELECT * FROM Person WHERE age IS NOT NULL;
範圍值檢測
SELECT * FROM Person WHERE age IN(18,19,20,21);
SELECT * FROM Person WHERE age>=18 AND age<=21;
SELECT * FROM Person WHERE age BETWEEN 18 AND 21;
限制結果集行數,只顯示若干行
不同數據庫處理不同
MYSQL
SELECT * FROM Person ORDER BY age LIMIT 2,5;返回從第三行開始的最多5條數據,行號從0開始
ORACLE
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY age) row_num, name FROM Person)p where p.row_num >=3 AND p.row_num<=5;返回第三行到第五行的數據
ORACLE爲每個結果集都增加了默認表示行號的列
SELECT * FROM Person WHERE rownum<=6 ORDER BY age;//返回前六條數據,rownum從1開始
下列語句無法實現範圍取值的功能
SELECT * FROM Person WHERE rownum BETWEEN 3 AND 5 ORDER BY age;//返回空集
當進行檢索時,對於第一條數據,rownum爲1,不符合條件,沒有被放入檢索結果中,當檢索到第二條數據,因爲第一條數據不在結果集中,所以第二條數據的rownum依然爲1,以此類推,所有數據的rownum都爲1。因此要實現範圍取值必須使用ROW_NUMBER().
SQL SERVER
SQL SERVER2000提供關鍵字TOP
SELECT TOP 5 * FROM Person ORDER BY age;
TOP無法範圍取值,可以使用子查詢實現
SELECT TOP 5 * FROM Person WHERE name NOT IN(
 TOP 3 * FROM Person ORDER BY age;)ORDER BY age;
SQL SERVER2005 開始支持ROW_NUMBER()

3.表連接

內連接,基於兩張表的關聯關係連接它們,大多數數據庫系統中內連接是默認連接方法,所以INNER可以省略。連接條件可使用小於大於等於不等於等運算符,還可以使用LIKE,BETWEEN AND等,還可以使用函數。
SELECT number,price FROM Order JOIN Custom ON customId = Custom.id;
交叉連接,不存在ON字句,將涉及到的所有表的所有記錄都包含到結果集中,分爲隱式連接(多表查詢)和顯式連接(指定CROSS JOIN)。一般可以直接使用隱式連接。
自連接,表與其自身連接。比如檢索訂單表中訂單類型相同的訂到列表
SELECT o1.number,o1.price,o1.typeId,o2.number,o2.price,o2.typeId FROM Order o1 JOIN Order o2 ON o1.typeId = o2.typeId AND o1.id<o2.id;
外連接,內連接要求組成連接的兩個表必須具有匹配的記錄,對於NULL值內連接無法處理。外連接語法和內連接幾乎一樣,主要區別就是對NULL值的處理,外連接不需要兩個表具有匹配記錄,可以指定某個表的記錄總是放到結果集中,根據那個表的結果總是放到結果集中,外連接可以分爲右外連接,左外連接和全部外連接。

4.子查詢

SQL允許將一個查詢語句作爲一個結果集共其他SQL語句使用,就好像使用一個普通的表一樣,被當做結果集的查詢語句成爲子查詢。
單值子查詢,又稱標量子查詢,子查詢返回一行一列數據。
列值子查詢,子查詢返回多行多列的結果集,這種子查詢又稱爲表子查詢,可以將結果集視作簡單的表。列值子查詢可以使用集合運算符進行操作,包括IN,ANY,ALL以及EXISTS。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章