MySQL學(xué)習(xí)筆記---基礎(chǔ)概念和一些基礎(chǔ)SQL語句(一)
作者:zhangjunqiang
MySQL學(xué)習(xí)筆記,以防遺忘
數(shù)據(jù)庫基本概念
數(shù)據(jù)庫:保存有組織的數(shù)據(jù)的容器(通常是一個文件或一組文件)。
表:某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單,數(shù)據(jù)庫中的表都有一個唯一的名字用來標(biāo)識自己。
模式:關(guān)于數(shù)據(jù)庫和表的布局及特性的信息。
列:表中的一個字段。所有表都是由一個或多個列組成,每個列都有對應(yīng)的數(shù)據(jù)類型。
行:表中的一個記錄。
主鍵:一列(或一組列),其值能夠唯一區(qū)分表中每個行(每條記錄)。
任意兩行都不具有相同的主鍵值,每個行都必須具有一個主鍵值(主鍵值列不允許NULL值)。
SQL:一種專門用來與數(shù)據(jù)庫通信的語言,SQL不依賴DBMS的存在而存在。
MySQL命令
mysql -user(u) username -password(p) password or none ?MySQL登錄
USE databasename; 使用數(shù)據(jù)庫
SHOW
SHOW DATABASES;(;可用\g代替):顯示當(dāng)前安裝的數(shù)據(jù)庫
SHOW TABLES; 查看當(dāng)前數(shù)據(jù)庫中的可用表的列表
SHOW COLUMNS FROM tablename; 查看某個表中的內(nèi)容,它對每個字段返回一行,行中包含字段名、數(shù)據(jù)類型、是否允許NULL、鍵信息、默認(rèn)值以及其他信息
DESCRIBE tablename; 和 SHOW COLUMNS FROM tablename; 具有相同的功能,前者是后者的縮寫版。
SHOW STATUS; 用來顯示廣泛的服務(wù)器狀態(tài)信息。
SHOW CREATE DATABASE databasename; 用來顯示創(chuàng)建特定數(shù)據(jù)庫的MySQL語句。
SHOW CREATE TABLE tablename; 用來顯示創(chuàng)建特定表的MySQL語句。
SHOW GRANTS; 用來顯示授權(quán)用戶(所有用戶或特定用戶)的安全權(quán)限。
SHOW ERRORS; 用來顯示服務(wù)器錯誤
SHOW WARNINGS; 用來顯示服務(wù)器的警告消息
SELECT
SELECT columnname FROM tablename; 用來檢索數(shù)據(jù)表中的coulumnname列中的內(nèi)容
SELECT row1,row2... FROM tablename; 用來檢索數(shù)據(jù)表中的row1,row2...行的內(nèi)容
SELECT * FROM tablename; *為通配符,用來檢索表中的所有列
SELECT DISTINCT key FROM tablename; 用來檢索表中不同值key的行
SELECT key FROM tablename LIMIT num; 返回key的前num行數(shù)據(jù)
SELECT key FROM tablename LIMIT num1,num2; 返回表中key的以num1為起點后num2行
SELECT tablename.colunname FROM tablename; 用來檢索數(shù)據(jù)表中的coulumnname列中的內(nèi)容,但是同時列出了表明和列名(完全限定)
SELECT coulumname FROM tablename ORDER BY key; 以key為導(dǎo)向排序(升序ASC,可省略)
SELECT coulumname FROM tablename ORDER BY key DESC; 以key為導(dǎo)向排序(降序,注:當(dāng)有多個key時DESC只作用于直接位于其前面的key)
SELECT coulumname FROM tablename WHERE condition; 按照條件condition從表中檢索指定列中的數(shù)據(jù)(WHERE子句在FROM子句后給出)
SELECT coulumname FROM tablename WHERE key BETWEEN c1 AND c2; 從表中檢索指定列中在條件c1和c2之間的數(shù)據(jù)(c1 <= c2)
SELECT coulumname FROM tablename WHERE key IS NULL; 從表中檢索key中為NULL的數(shù)據(jù)
操作符
用來聯(lián)結(jié)或改變WHERE子句中的子句的關(guān)鍵字。
AND操作符:
用在WHERE子句中的關(guān)鍵字,用來指示檢索滿足 所有 給定條件的行。
OR操作符:
用在WHERE子句中的關(guān)鍵字,用來表示檢索匹配 任一 給定條件的行。
IN操作符:
用在WHERE子句中的關(guān)鍵字,用來指定要匹配值的清單的關(guān)鍵字(取合法值的由逗號分割開的清單,全在圓括號中),功能與OR相當(dāng)。
NOT操作符:
用在WHERE子句中的關(guān)鍵字,用來否定它之后所跟的任何條件。
BETWEEN操作符:
用在WHERE子句中的關(guān)鍵字,用來檢查某個范圍的值。
通配符
用來匹配值的一部分的特殊字符。為在搜索子句中使用通配符,必須使用LIKE謂詞。LIKE指示MySQL后跟的搜索模式利用通配符匹配而不是直接相等匹配進(jìn)行比較。
%通配符:
表示任何字符出現(xiàn)的任一次數(shù)。
_通配符:
下劃線通配符 _ 用途與%一樣,但下劃線只匹配單個字符而不是多個字符。
通配符使用技巧
1、不要過度使用通配符。如果其他操作能達(dá)到相同的目的,應(yīng)該使用其他操作符。
2、在確實需要使用通配符時除非絕對有必要,否則不要把它們用在搜索模式的最開始處,因為這樣是最慢的。
3、仔細(xì)注意通配符的位置。如果放錯地方,可能不會返回想要的數(shù)據(jù)。
計算字段
1、Concat拼接字段:
把多個串鏈接起來形成一個較長的串,需要一個或多個指定的串,各個串之間用逗號隔開。
例如:SELECT Concat(vend_name,'(',vend_country,')') FROM vendors ORDER BY vend_name;
2、去掉返回的值中的空格:
(1)、RTrim()去掉右側(cè)多余的空格來整理數(shù)據(jù)。
(2)、LTrim()去掉左側(cè)多余的空格來整理數(shù)據(jù)。
(3)、Trim()去掉左右兩邊多余的空格來整理數(shù)據(jù)。
3、執(zhí)行算數(shù)運算(MySQL支持 加減乘除運算和圓括號改變運算優(yōu)先級):
計算字段另一個用途就是對檢索出的數(shù)據(jù)進(jìn)行算術(shù)計算。
例如:SELECT prod_id, quantity, item_price, quantity * item_price AS expanded_price FROM orderitems WHERE order_num = 20005;
事件處理函數(shù)
函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便。大多數(shù)SQL實現(xiàn)支持用于處理文本串的函數(shù)、用于在數(shù)值數(shù)據(jù)上進(jìn)行算術(shù)運算操作的函數(shù)、用于處理日期和時間并提取特定成分的日期和時間函數(shù)、返回DBMS正使用的特殊信息的函數(shù)
1、常見的文本處理函數(shù):
(1)、Upper(str):將文本str轉(zhuǎn)換為大寫。
例:SELECT Upper(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;
(2)、Left(str, len):返回串str左邊的len個字符。
例:SELECT Left(vend_name, 3) AS vend_name_upcase FROM vendors ORDER BY vend_name;
(3)、Length(str):返回串str的長度。
例:SELECT Length(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;
(4)、Locate(substr, str):返回串str的一個substr子串的第一個字符出現(xiàn)的位置,如果substr不再str中則返回0。該函數(shù)的另一個版本是Locate(substr,str,pos),表示從pos位置開始在str中尋找substr。
例:SELECT Locate('ACM', vend_name) FROM vendors ORDER BY vend_name;
注意:
1、ORDER BY子句必須位于FROM子句之后。
2、當(dāng)ORDER BY 子句和LIMIT子句同時使用時LIMIT子句必須位于ORDER BY子句之后。
3、同時使用WHERE子句和ORDER BY子句時應(yīng)將ORDER BY子句置于WHERE子句之后。
4、WHERE子句支持 =、>、<、!=、<>(不等于)、>=、<=、BETWEEN(指定的兩個值之間)過濾操作。
5、AND和OR操作符混合使用時要注意AND操作符的計算次序比OR操作符號的計算次序要高(操作符優(yōu)先級高),所以一般有多個操作符時要加上圓括號消除歧義(即使不這樣做也是正確的)
6、MySQL支持使用NOT對IN、BETWEEN和EXISTS子句取反(其他DBMS允許使用NOT對各種條件取反)。
7、尾空格可能會干擾通配符匹配,例如:'%anvil'如果anvil后有一個空格則不會被匹配出來??墒褂?%anvil%'或者使用函數(shù)解決此問題。
8、%通配符不會匹配到NULL。
9、SELECT語句的拼接完成的列是沒有名字的,它只是一個值,這種是無法在客戶機(jī)中直接使用的,所以可以用AS關(guān)鍵字賦予一個別名(也稱為導(dǎo)出列)。
例如:SELECT Concat(vend_name,'(',vend_country,')') AS vend_title FROM vendors ORDER BY vend_name;
聚集函數(shù):
運行在行組上,計算和返回單個值的函數(shù)(需要匯總數(shù)據(jù)而不需要檢索出來)
ACG(column):返回某列的平均值。
COUNT(column):返回某列的行數(shù)。COUNT(*):返回所有列的和。
MIN(column):返回某列的最小值。
MAX(column):返回某列的最大值。
SUM(column):返回某列的和。
DISTINCT:只包含不同值
分組:
分組允許把數(shù)據(jù)分為多個邏輯組,以便能對每個組進(jìn)行聚集計算。
創(chuàng)建分組:GROUP BY子句,GROUP BY子句必須出現(xiàn)在WHERE子句之后,ORDER BY子句之前。
WITH ROLLUP:可以得到每個分組匯總級別的值(和ORDER BY子句互斥)。
HAVING:HAVING過濾分組,WHERE過濾列,HAVING位于GROUP BY子句之前,HAVING位于GROUP BY子句之后。(WHERE在分組前進(jìn)行過濾,HAVING在分組后進(jìn)行過濾)
GROUP BY和ORDER BY子句的區(qū)別:
1、OEDER BY是排序后的輸出而GROUP BY是分組的順序(不一定是期望輸出的順序)
2、ORDER BY任意列都可以使用,而GROUP BY只可能使用選擇列或表達(dá)式列,而且必須使用每個選擇列表達(dá)式。
3、ORDER BY不是必須出現(xiàn)在SQL語句中,但是如果與聚集函數(shù)一起使用列(或表達(dá)式)GROUP BY子句必須存在于SQL語句中。
SELECT 子句順序:
子查詢:
嵌套在其他查詢中的查詢。如:
SELECT cust_name
FROM customers
WHERE cust_id IN
(
SELECT cust_id
FROM orders
WHERE order_num IN
(
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2'
)
);
一些概念
完全限定:表名.列名
相關(guān)子查詢:涉及外部查詢的子查詢
關(guān)系表:將不同數(shù)據(jù)分別存儲在不同數(shù)據(jù)表中,用相應(yīng)的關(guān)系進(jìn)行連接。
主鍵:每個表都有一個唯一的標(biāo)識。
外鍵:某個表的一列,包含另一個表的主鍵值。