學習數據庫筆記八

數據庫------------------------
exists型子查詢,其它的硬性查詢是可以替代它的,並且它稍微不好理解






新手1+N模式查詢




這兩個沒多大用,而且繁瑣
—————————————————————




連接查詢練習


1.取出所有商品的商品名,欄目名,價格
select goods_name,cat_name,shop_price from   #容易犯錯的地方是,如果你這裏要列出


cat_id,一定要寫明是哪張表的cat_id,不然sql會報錯,認爲你的條件模糊
goods left join category          #這是決定兩張表以什麼方式連接
on 
goods.cat_id = category.cat_id;   #這是兩張表連接的橋樑,是兩張表共有的字段(名字也


許不一樣,但描述的內容要一致)!




2.查詢第4個欄目下的商品的商品名,欄目名,價格
select goods_name,goods.cat_name,shop_price 
from 
goods left join category
on
goods.cat_id = category.cat_id
where
goods.cat_id = 4;






union查詢
union查詢就是把2條或多條sql的查詢結果,合併成一個結果集


sql1返回N行
sql2返回M行


sql1 union sql2 返回N+M行


場景:2條語句,各自的where條件非常複雜,可以簡化成簡單條件,再Union




求得的是一個並集,如下
select goods_id,cat_id,goods_name from goods where cat_id = 4 
union
select goods_id,cat_id,goods_name from goods where cat_id = 2;


這樣得出了4號欄目和2號欄目的結果集


以上是一張表,如果兩張表呢?接着如下
假如user是已經註冊的用戶表,temp是還未激活的用戶表,想要用union查看一共多少用戶
SELECT id,name from tmp
UNION
select uid,name from `user`












union的語句必須滿足1個條件,各語句取出的列數相同,不然怎麼合併顯示,三輪車和汽車怎


麼拼接,少一個輪。。列名稱不一定要一致,但個數一定要一致。


使用union時,完全相等的行將會被合併。
兩個表都有id=c  name=張三,那union後,這兩條數據只會顯示一條。
合併是比較耗時的操作,因爲它會進行比較,一般不讓union進行合併,使用"union all"可避


免合併,
也就是說我們平時用union時,要用union all。




union的子句中不用寫order by
sql合併後得到的總結果,可以order by ,子句order by失去意義,
現在排序了,合併後還需要排序,所以失去意義

select id,name from user order by id   #這就是在子句中排序,完全沒意義,也不會起作



union all
select uid,uname from temp    




如果真想排序,可以這樣寫
select * from a
union all
select * from b
order by num desc


【union就是把兩個sql語句用union (union all) 連接,想排序要在兩個結果合併後再排序
想要不把重複的合併掉,就用union all】


union面試題
兩張表,把ID相同的num加起來
表如下
A表:
+------+------+
| id   | num  |
+------+------+
| a    |    5 |
| b    |   10 |
| c    |   15 |
| d    |   10 |
+------+------+


B表:
+------+------+
| id   | num  |
+------+------+
| b    |    5 |
| c    |   15 |
| d    |   20 |
| e    |   99 |
+------+------+




要求查詢出以下效果:
+------+----------+
| id   |    num   |
+------+----------+
| a    |        5 |
| b    |       15 |
| c    |       30 |
| d    |       30 |
| e    |       99 |
+------+----------+



SELECT id,sum(num)
FROM


(SELECT * FROM a
union ALL
SELECT * FROM b)as temp


GROUP BY id;








索引概念
索引是一種高效組織的數據結構,能夠加速你的查詢


索引是數據的目錄,能快速定位行數據在哪。增加了一行數據,同時也需要改索引


索引提高了查詢速度,降低了增刪改的速度,並非加的越多越好(有的情況會是一張表的索引


文件比那張表的大小還大,成了目錄比書還厚)


一般在查詢頻繁的列上才加索引,而且要加在重複度低的字段加效果好
你給性別加索引意義不大,給身份證號加索引,身份證號不重複,這樣就能迅速定義一個人
是給你想要迅速定位的字段加索引!!!性別加索引,一定位也只能定位50%




它的原理是各種查找方法,如二叉數


二叉樹
每個節點最多有兩個子樹的結構,一個稱作左子樹,一個稱作右子樹


先從父節點比較,比父節點大的,去右子樹找,比父節點小的到左子樹找,到了下一層接着這


樣比較下去,最終找到你要的數








索引類型


key普通索引,只提高查詢速度
unique key唯一索引,不但提高速度,還約束數據,此數據是唯一的
primary key 主鍵索引
fulltext 全文索引




建表時建立索引
create table ttt(
name char(10),
email char(20),
key name(name),
unique key email(email)
);


desc可查看你的表的索引
KEY列MUL代表普通索引,UNI代表唯一索引




這個時候email被定義爲唯一索引,此列下的內容也就被約束了,不可以重複
原來約束在數據庫中就可以實現





insert into ttt values ('lisi','[email protected]');這條可以正常插入到ttt表中


你再寫一條同樣的
insert into ttt values ('lisi','[email protected]');這時再插入就會報錯,因爲唯一索引 
約束了email字段,不能重複。




在項目中一些字段不可重複,如用戶名,email,你就可以給它們加止unique key
既能提高查詢速度,也能避免重複






現在來說說主鍵primary key ,就是我們平時的主鍵,一張表只能有一個主鍵索引
原來我們的主鍵是索引。。。
寫法:
create table ttt(
id int,
name char(10),
email char(20),
primary key(id),   #這不用另外聲明名字,因爲一張表就一個主鍵
key name(name),
unique key email(email)
);






fulltext全文索引(中文環境下全文索引無效,要分詞+索引,一般用第三方解決方案,如


sphinx)
全文索引在中文環境下是無效的,因爲是靠英文來檢索的
 






查看一張表的索引:show index from 表名 或create table表名也能看到
刪除索引:alter table 表名 drop index 索引名;或 drop index from 表名








SQL裏面有基本查詢、分組+統計函數查詢、排序+limit、子查詢(where\from\exists)、連接


查詢(左連、右連)




啓動數據庫服務:右擊我的電腦--管理--服務--找到MySQL,啓動它


解決DOS命令窗口亂碼:先看DOS用的什麼編碼,然後告訴服務器你的DOS數據庫客戶端用的什麼


編碼,set names gbk;




清除表的全部內容truncate+表名


給表改名字rename table 舊錶名 to 新表名







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