數據庫基本操作
登錄:mysql -u root -p
查看數據庫:SHOW DATABASES;
刪除數據庫:drop database 數據庫名;
使用數據庫:USE 數據庫名;
顯示目前的數據庫:SELECT DATABASE();
表的基本操作
顯示當前數據庫的數據表:SHOW TABLES;
建表:create table 表名 ( 屬性名 屬性類型,......);
建表舉例
我在這裡沒有指定主鍵 主鍵只需要在相應的後面加上 primary key
查看數據表的字段:SHOW COLUMNS FROM 表名;
插入記錄:INSERT 表名 VALUES(A,B,C);
查詢行記錄:SELECT * FROM 表名;
查詢特定的列:SELECT 列名 FROM 表名 WHERE 條件;
刪除表記錄:DELETE FROM 表名 WHERE 表達式;
例如刪除編號為1的記錄: DELETE FROM tb1 WHERE id=1;
修改表中的數據:UPDATE 表名 SET 字段=新值,...WHERE 條件
例如: UPDATE tb1 SET USERNAME="JHON" WHERE id=1;
增加字段:ALTER TABLE 表名 ADD 字段 類型...;
刪除字段:ALTER TABLE 表名 DROP 字段名;
2. 實用進階
我會根據實際問題,來引出我們要學習的進階知識。
合併多個表
首先大家先看兩個表:
表1 用戶登錄
表2 用戶信息
一個表叫signon
(用於用戶登錄時候驗證用戶名和密碼),一個叫info
(用於查看用戶的信息)
我們可能面臨上面的情況,會便於查找某些信息將信息分開存儲,而用主鍵與外鍵進行兩個表的約束(這裡通過
username
可以把兩個表的記錄一一對應)。我們有時候需要將兩個表合併為一個,然後得到所需的數據(在編程的時候,雖然可以通過username
這個主鍵來查詢兩個表,然後保存所需的數據,但是還是比較麻煩,特別是表很多的時候,需要查許多次表)。
這裡我們可以用這樣的語句,在from
後面跟上多個表名即可:
表的連接
這樣就一步得到了兩個表了!
咦,為什麼好像多了一些記錄!!!這是因為連接表的時候會進行笛卡爾積運算,所以記錄的行數是兩個表的記錄行數相乘。所以我們要通過條件選擇來排除無效的記錄!
去除無效記錄
這裡我進行了更名操作as,可以把表名替換成短一點的,並沒有其他影響。
where
條件是兩個記錄的username
相等才留下,其他的是無效的!模糊查詢
模糊查詢你可能想要進行一些相似的結果,那麼這個辦法能夠基本滿足你的需要!看個例子就懂了:
模糊查詢%
我們把平時使用的=號換成了
like
關鍵字,所以後面我們就可以進行特殊的處理,我使用了%
,這個符號可以看成是任意的字符串!所以"icelee"被匹配出來了。還有一種:
模糊查詢 _
下劃線_可以匹配一個字符。所以模糊查詢的時候,我們通常都會使用%,匹配的更廣。
結果排序
我給info
表增加了一個字段:
增加age字段
對於年齡字段,所以我想排序該怎麼辦呢?我們這裡本來就是升序的,所以我們來降序輸出一下:
對age降序排列
所以排序的語法就是order by 列名 asc/desc
分別可以對屬性進行升序和降序排列輸出
對記錄進行分組
我們又添加了一個字段(怎麼老是添加字段啊),現在表結構如下:
添加sex字段
我們想把sex進行分組,那麼就要用到group by了:
對sex進行分組
這裡有些地方要注意,如果要分組,我們不能直接select *
,我們能直接使用的是用於分組的屬性,如上面的sex
,age
,而不能用username
,否則會報錯。如果想通過
sex
的分組查看username
的話該腫麼辦呢?別急,有辦法的:查看分組數據
我們通過group_concat(屬性)
來得到分組後的結果,這個可以將多個值合併到一起。可以看到icelee
,和b已經歸到一組了。
我們還可以通過一些聚集函數來查看結果:
看年齡平均值
這裡的avg(age)
是平均值函數。類似的還有:COUNT(屬性名)
返回記錄的數目(不論是否為NULL)、min(屬性名)
返回最小值、max(屬性名)
返回最大值,還有許多,大家可以自己查查看。
如果我們想選出性別人數多於1個的,那麼我們可以通過
count()
和group by`實現:having用法
這裡的having
只能和group by
搭配,和where
的作用是一樣的!
集合並、交、差運算
我們新建了下面兩個表:
這個是借款人的表:
借款人 borrower
這個是存款人的表:
存款人 depositor
我們想查出有存款或者有借款的人該咋辦呢???
簡單,我們可以用集合的並運算!學的數學總算派上用場了吧~(^__^) 嘻嘻……
mysql16.png
使用union
會自動去重,若想保留重複項,那麼可以使用union all
我們想找出既有存款,又有借款的用戶:
交運算(intersect),很遺憾,mysql並沒有提供這個運算。
但是我們可以自己實現呀:
思路:首先把兩個表並起來(union),然後找出重複的name(我們假定name是主鍵)就可以了:
mysql17.png
注意上面有個temp,如果去掉temp,那麼會報Every derived table must have its own alias錯誤,意思是說要給合併之後的表加上一個別名,隨便命名都可。
差運算:找出只有存款、沒有借款的用戶。
我們可以先通過兩個表進行並運算,然後分組 count(name) =1
,就可以找出只存在一項的用戶了,但是這一項我們並不知道只有存款還是隻有借款。所以我們可以把這些特定的用戶和存款表裡的客戶進行交運算就可以得出結果了。但是這個代碼嵌套比較多,就不貼出來了。
SQL查詢相關小技巧
·使用AND時,將不為真的條件放在前面
數據庫系統遵循運算符的優先級,並且運算過程是從左至右的,將條件不為真的放在前面,則能夠省去and後面的相關運算,以達到減少數據庫系統運算工作量的目的,提高工作效率。
·使用OR運算符時,則將最可能為真的條件放在前面
和上面and的原理類似,and運算符要求兩邊條件都為真,整個條件才為真,而or只需要一邊為真,將條件為真的放在前面可使or運算符不需要檢查右邊的條件,從而節約時間,提高工作效率。
·distinct比group by更快
distinct和group by通常起限制結果為唯一的記錄行的作用,處理此類問題時distinct往往比group by更加迅速。
·限制聯合的結果
從數據庫中提取的信息量越少,速度也就越快,而加適當的限制條件除了滿足自身的需求之外,另外一個原因就是為了加快處理查詢速度。e.g:
select var1, var2 from table1 inner join table2 on table1.id=table2.id where condition;
·對子查詢使用in運算符
在子查詢過程中,運用select語句往往會使數據庫系統考慮更多的東西,從而降低工作效率,相比較而言,運用in運算符則可以有效的解決這個問題。e.g:下面的子查詢中第1句將比第2句更加有效
select var1, var2 from table1 where var1 in (select var1 from table2 where condition);
select var1, var2 from table1 where var1=(select var1 from table2 where condition) ;
·儘量避免使用select * from
指定確定的列可以讓你清楚的瞭解你所需要採集的變量,利用select * from不只是效率低下,更不利於你的後續分析,所以對於select * from則是能避免則儘量避免。
·對整數類型列進行搜索
這類問題主要針對字符變量的查詢而言,對應的字符變量如果有相應的編碼對應,直接將編碼設置為查詢條件將比直接查詢字符變量來得更加迅速。
閱讀更多 產品GEEK 的文章