2018 / 7 / 5
《mysql必知必會》
1.基礎概念
(1)數據庫軟件:DBMS(數據庫管理系統)。 DBMS
(2)數據庫:保存有組織的數據的容器。 DATABASE
二者關係:通常我們口頭常說的mysql其實是指數據庫軟件。數據庫是通過數據庫軟件創建和操縱的容器,數據庫是文件還是別的什麼東西並不重要,因爲我們都是通過DBMS來操作數據庫的,我們下達的指令由DBMS接收,它替我們完成對數據庫的相應操作。
(3)表:某種特定類型的數據的結構化清單。 TABLE
這裏的特定類型的數據我理解爲每張表都應該是用來描述同一類型的事物,比如說A部門有一個用來描述訂單的表,B部門也要有一個這樣的表,A和B就是不屬於統一類型的,如果強行將這兩張表結合在同一個表中,會造成檢索困難,十分不方便。注意:同一個數據庫不能有兩張名字一樣的表,但是不同的數據庫的表可以有相同的名字。
(4)模式:關於數據庫和表的佈局及特性的信息。schema
表具有一些特性,這些特性定義了數據在表中如何存儲,比如可以存儲什麼樣的數據,各部分信息如何命名等。描述表的這組信息就是所謂的模式,模式可以用來描述數據庫中特定的表以及整個數據庫(和其中表的關係)。這裏描述很長,我也不是特別懂,這裏我暫且將這個所謂的模式定義爲每一個表的第一行,因爲建立一個表,首先要規定每一列是屬於什麼類型的(數據類型、是否是主鍵、是否是自動增長等等),這樣後面的數據就遵守這個規律填寫。
(5)列:表中的一個字段。所有的表都是由一個或者多個列組成。 column
(6)行:表中的一個記錄,也稱爲數據庫記錄。 row
我認爲數據庫就是利用一組數據來描述一個事物,有點類似於對象。列定義了該組數據的模式,行就是用來存儲這一事物的,列於行的結合就定義並且存儲了一個事物對象。而且一般對數據庫查詢操作時,列作爲操作條件,行作爲結果。
(7)主鍵:一列(或一組列),其值能夠唯一區分表中的每一行。 primary key
主鍵的關鍵定義就是該列裏面沒有相同的數據,只要滿足這個定義就可以在一個表中設置多個主鍵,比如如果你以人的名字列作爲主鍵,很可能會遇到兩個叫張偉的人,這樣對於查詢數據很不方便,但是你可以用員工編號列和身份證列作爲主鍵,因爲這兩個列都不可能存在相同的數據。
- 不更新主鍵列中的值;
- 不重用主鍵列的值;
- 不在主鍵列中使用可能會更改的值
(8)其它:
- 每條sql語句必須以分號( ; )結尾
- sql語句不區分大小寫
- 在處理sql語句時,其中所有的空格都被忽略,所以sql語句可以在一行或者多行給出,只要記住每一條後面要加結束符分號。
2.基礎操作
登陸MySQL服務:
mysql -u 你的用戶名 -p你的密碼 -h 你的主機名 -P 你的端口號;
尋求幫助:
help;
(1)選擇: use
use yourDatabas;
use yourTable;
(2)瞭解數據庫和表:show
show databases; --列出可用的數據庫
show tables; --列出可用的數據表
show columns from yourTable; --這就是顯示上面提到的模式信息
desc yourTable; --和上面一條命令相同
show errors; --列出錯誤
show warnings; --列出警告
show grants; --用來顯示授予用戶(所有用戶或者特定用戶)的安全權限
show status; --用於顯示廣泛的服務器信息
help show; --用於顯示show指令更多的信息
(3)檢索數據庫: select
select column1 from table1; --檢索單列
select distinct column1 from table1; --在列名前面加入關鍵字distinct(如果有多列就作用於後面的所有列),使返回結果過濾掉值相同的數據,只顯示不相同的數據。
select column1,column2,column3 from table1; --檢索多列
select * from table1; -- 使用通配符檢索所有列,及其不推薦,影響效率
限制結果:
select column1 from table1 limit 5; -- 只返回結果的前五行
select column1 from table1 limit 3,4 ;-- 返回從行3開始的4行
/*
表的第一行爲行0
指定檢索的最大行超過實際有的行數時,返回實際存在的行
爲了取消行0帶來的困擾,有新的語法 limit 4 offset 3 == limit 3,4
*/
select table1.column1 from database1.table1 ;
/*
如果你位於A數據庫,但是想查看B數據庫的C表D列就可以用這條語法:
select c.d from b.c;
好處就是不用跳轉數據庫
同理,如果你位於A數據庫的E表,想查看同數據庫下的F表G列:
select F.G from F
*/
排序檢索:
select column1 from table1 order by column2; --返回列1,排列順序是按照列2的字母從小到大。
select column1,column2 from table1 order by column2 desc; --加上關鍵字desc表示倒序,返回列1和列2,排列順序按照列2的從大到小。
/*
在mysql最近的版本里面以及取消了大小寫的不同即a==A,如果你要
設置順序a-z-A-Z可以讓管理員修改相應的配置。
*/
select column1 from table1 order by column2 desc ,column3; --desc只作用於直接位於其前面的列。
select column from table1 order by column limit 1 ; --limit關鍵字應該位於order關鍵字後面。
(4)過濾數據:
- where 子句
select column1,column2 from table1 where column1 = 'xxx'; --返回列1和列2,條件是列1的某行=字符串xxx
select column1,column2 from table1 where column1 = 2.5; --注意這裏沒有單引號了,因爲這裏條件是數字類型不是字符串類型。
/*
如果你使用腳本語言,可能會習慣從服務器的數據庫裏面模糊的獲取大量數據,然後再下載到
客戶端,再在腳本里面過濾掉你不需要的值,這種做法不適合,因爲這樣不僅會降低腳本的效率
而且服務器傳輸了不必要的數據,使得網絡帶寬浪費。
*/
操作符 | 說明 |
---|---|
= | 等於 |
<> | 不等於 |
!= | 不等於 |
< | 小於 |
<= | 小於等於 |
> | 大於 |
>= | 大於等於 |
between | 在兩個指定值之間 |
不匹配檢查:
select column from table where column2 <> 2.5;
--列出所有不等於2.5的列
範圍值檢查:
select column1 from table1 where column2 between 2 and 5;
--列出行1,條件是行2的值只能在2到5之間
空值檢查:
select column1 from table1 where column1 is NULL;
--列出行是空值null(一個列不包含值)的行
/*
在搜索時候,如果該列有空值null,也不會返回,因爲null具有不確定性,因此在過濾數據時,
一定要驗證返回數據中確實給出了被過濾列具有null的行,最好是使用上面一條命令。
操作符:and / or / in / not
select column1 from table1 where column2 !=2 and column3 = 3;
select column1 from table1 where column2 !=2 or column3 = 3;
select column1 from table1 where column2 !=2 or column3 = 3 and column >3;
/*
這裏同時具有and和or,但sql語句裏面計算次序是優先and而後是or,所以這裏等同於
select column1 from table1 where column2 !=2 or (column3 = 3 and column >3);
*/
--爲了消除計算次序的歧義,強烈建議使用圓括號進行分組計算。
select column1 from table1 where column2 in ('xxx',2,3);
--in操作符會作用於後面的集合,只要滿足集合的列都會被列出來。這裏列出column2='xxx',column2=2,column2=3的列
--效果等同於or操作符,但是它的處理效率高於or操作符
--not和in組合一起使用
like操作符
% :匹配0或多個
select column1 from table1 where column2 like 'js%' order by column3;
--匹配列1的值以js開頭的列2的值,比如 Js123 , jshhh ,Jsx5 ,js 並且按列3的大小進行排序
--(如果不進行設置。默認是不區分大小寫的)
select column1 from table1 where column2 like '%js%';
--匹配 12js25 ,axJsk,kjs,jsk
select column1 from table1 where column2 like '%js';
--注意 % 匹配不到null,但是可以匹配到空格
_ : 下劃線匹配一個字符,不能多也不少
select column1 from table1 where column2 like '_js';
--匹配 1js , ajs ,3Js 等
正則表達式 regexp