數據庫基礎
數據庫:保存有組織的數據的容器
表:某種特定類型數據的結構化清單
模式:關於數據庫和表的佈局及特性的信息
行:表中的一個記錄
主鍵:唯一標識表中的一行 總是應該設立主鍵
檢索數據
檢索單個列:
SELECT prod_name
FROM Products;
如果沒有明確查詢的順序,返回的數據沒有特定的順序。而且通常需要應用程序自己格式化數據格式;
SQL語句不區分大小寫,經常以大寫表示關鍵字,所有空格都被忽略,換不換行都行;必須以‘;’結尾
多個列之間用,隔開,檢索所有列用*
SELECT prod_name,prod_id
FROM Products;
Distinct
不重複數據.distict關鍵字必須放在列名的前面
SELECT DISTINCT vend_id
FROM Products;
限制返回行數
SQL server 和access用 TOP 關鍵字 只檢索前5行
SELECT TOP 5 prod_name
FROM Products;
Mysql、 Maria DB、SQLite用 LIMIT關鍵字,比如不超過5行
SELECT prod_name
FROM Products
LIMIT 5;
要得到後面5行的,需要指定從哪裏開始以及檢索的行數
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
從第5行氣的5行數據(第一個被檢索的行是第0行,從0開始)
註釋
行內註釋 –
SELECT TOP 5 prod_name -- 這是條註釋
FROM Products;
多行:/**/
排序檢索 order by
按列名
SELECT prod_name
FROM Products
ORDER BY prod_name;
以prod_name字母順序排序
ORDER BY 子句要保證是select語句中最後一條語句
用非檢索列排序也是合法的
按多個列排序,指定列名,用,分開。 先按第一個,然後第一個相同時按第二個等
按列位置
SELECT prod_name, prod_price, prod_id
FROM Products
ORDER BY 2,3;
2,3指的是select後的第二個第三個列。不在select清單裏的列不能用,而且很容易發生修改了select清單但沒有修改order by子句的問題
降序 DESC
SELECT prod_name
FROM Products
ORDER BY prod_name DESC;
DESC只應用到直接位於它前面的列,要是想多個列上降序,每個列名後面都得加DESC
一般認爲A a在字母順序中一樣,要是修改的話可能需要聯繫數據庫管理員
過濾數據 where
SELECT prod_name,prod_price
FROM Products
WHERE prod_price = 3.49;
後面有多少個0是DBMS默認的,3.49和3.4900是一樣的
order by要位於where之後
<> 不等於 !<不小於 !>不大於 Between 兩者之間 is null 爲null值
SELECT prod_name,prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
BETWEEN必須指定低和高兩個,由AND連接,閉區間
檢查是否爲空要用is null
SELECT prod_name,prod_price
FROM Products
WHERE prod_price IS NULL;
在過濾數據時,不滿足某條件的返回結果裏並不會包含null,null必須單獨判斷
組合where 子句 邏輯操作符
and, or, in, NOT
SELECT prod_name,prod_price
FROM Products
WHERE prod_price <=4 AND vend_id = 'DLL01';
or的話,許多DBMS只看第一個滿足,後面就不看了,一併檢索出來
可以用括號()來明確多個and or之間的優先級
SELECT prod_name,prod_price
FROM Products
WHERE vend_id IN ( 'DLL01','BRS01');
IN後的選項必須在()裏,逗號隔開,其實就是完成了OR的操作。合法選項很多時,用IN更清楚,求值順序更容易管理,而且一般比or執行的快。IN的最大優點是可以包含其他select子句
通配符
用來匹配值的一部分的特殊字符
%
%表示任意字符出現任意次數
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
通配符可以在任意位置,使用任意多個
但是要注意,許多DBMS會用空格在後面填充,有時候’f%y’這樣可能匹配不到,最好是’f%y%’
另外,通配符匹配不到nuLL
WHERE prod_name LIKE '%';
是匹配不到NULL的
_
_只匹配單個字符
不能多也不能少
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
只匹配10-99 inch的
[]
[]用來指定一個字符集,必須匹配指定位置的一個字符。只有Access和Sql server支持
創建計算字段
存儲在表中的數據一般不是應用程序要用的,有時候需要從數據庫中檢索出轉換、計算或格式化後的數據。
只有數據庫知道select中哪些列是實際的表列,哪些是計算字段。客戶端看不出區別來。
拼接字段
多數DBMS使用+號
SELECT vend_name + '('+vend_country +')'
FROM Vendors
Order by vend_name;
Mysql 和mariaDB中使用的是concat
SELECT Concat(vend_name + '('+vend_country +')')
FROM Vendors
Order by vend_name;
可以用RTRIM(列名)來去掉多餘的空格
使用別名
一個字段或值的替換名
SELECT RTRIM(vend_name) + '('+RTRIM(vend_country) +')'
AS vend_title
FROM Vendors
Order by vend_name;
算術計算
可以在計算字段中+ -* /
SELECT prod_id, quantity, item_price,quantity*item_price as expanded_price
FROM OrderItems
where order_num = 20008;