MySQL數據庫學習(二)

上篇地址:MySQL數據庫學習(一)

12、子查詢
子查詢實際上嵌套在其他查詢中的查詢,例如兩張表,物品表 orderitems 中,保存訂單號,客戶ID,訂單日期。customers表中保存客戶信息。(兩張表互不相連,需要查詢兩次)
如果要找到物品 TNT2 的所有客戶,需要採用下列步驟:

  1. 查找包含物品 TNT2 的所有訂單的編號;
  2. 查找前一步驟列出的訂單編號的所有客戶的 ID;
  3. 查找前一步驟返回的所有客戶 ID 的客戶信息;

所以 可以執行下列操作:

>select order_num from orderitems where prod_id='TNT2'; //查到爲4,6
>select cust_id from orders where order_num in (46);

13、表聯結
關係型數據庫的強大在於關係表,關係表的設計原則時保證把信息分解爲多個表,一類數據一個表,各個表通過某些常用的值互相關聯,比如兩個表之間通過外鍵來關聯。(外鍵是某個表中的一列,它又是另外一個表的主鍵值。)
表聯結的優點:

  1. 數據信息不重複,從而不浪費時間和空間,伸縮性好(scale well)
  2. 如果某個數據信息變動,可以只更新該表中的某個記錄,相關表數據不用變更

1、創建聯結select A_name,B_name from A,B where A.A_id = B.B_id order by A_name, B_name;
(where子句指示MySQL匹配 A 表中的A_id和 B表中的 B_id 相匹配,要匹配的兩列以A.A_id 和 B.B_id 完全限定表名(當引用的列可能存在二義性,必須使用完全限定表名),兩個表的聯結需要用到where語句,進行列過濾)

2、笛卡爾積:由沒有聯結條件的表關係返回的結果稱爲笛卡爾積(檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數)
select A_name,B_name from A, B order by A_name, B_name;

3、內部聯結:內部聯結也叫等值聯結(equijoin),它基於兩個表之間的相等測試,返回兩個表的交集部分
例如:select A_name,B_name from A inner join B on A_name = B_name;
(這條SQL語句中,select語句與之前的相同,相較於上面的from,這裏使用了inter join指定(當使用inter join時,聯結條件用on子句而不是where子句,在這裏on等同於where)

4、聯結多個表:SQL對一條select語句中可以聯結的表的數目沒有限制,創建規則也基本相同(首先列出所有表,然後定義表之間的關係)
(PS:MySQL在運行時關聯指定的每個表以處理聯結,這樣很耗費資源,因此使用中應注意,不要聯結不必要的表。)
select A_name,B_name C_name from A,B where A_name=B_name and A_name=B_name;

5、使用表別名:別名除了用於列名和計算字段外,也可以給表起別名,可以縮短SQL語句,允許在單條select語句中多次使用相同的表。

> select a_name,b_name,c_num
>      from A as a, B as b, C as c
>       where A.a_name = B.b_name
>       and C.c_num = B.b_num;

6、自聯結:自聯結爲在同一個表中做聯結操作。(user_id 是 TN1,查詢其user_name,最後找到user_name下其他的user_score的user_id,user_name ,最後找到的都是相同user_name下其他的user_score)

//使用子查詢
>select user_id,user_name from usertable
>     where user_score=(select user_score from usertable where user_id='TN1'  
//使用自聯結
>select p1.user_id, p1.user_name
>     from usertable as p1, usertable as p2
>     where p1.user_score = p2.user_score
>     and p2.user_id = 'TN1';

7、外聯結:外聯結分爲左聯結和右聯結(left join on / left outer join on
左聯結select A.Name from A left join B on A.id = B.id
(左(外)連接,左表的記錄將會全部表示出來,而右表(b_table)只會顯示符合搜索條件的記錄。右表記錄不足的地方均爲NULL。)

右聯結select A.Name from A right join B on A.id = B.id
(與左(外)連接相反,右(外)連接,左表只會顯示符合搜索條件的記錄,而右表的記錄將會全部表示出來。左表記錄不足的地方均爲NULL。)

8、創建組合查詢
例如把兩個查詢結合在一起,使用union(union聯結查詢的列必須相同)

>select name from student where id=1
> union select select name from student where id=0;

14、插入操作
使用 insert 完成插入操作,insert into 表名(列名1,列名2) values(行值1,行值2)可以採用下列方式:

  1. 插入完整的行;
  2. 插入行的一部分;
  3. 插入多行;
  4. 插入某些查詢結果;

前面中有使用插入操作進行,插入一個學生的數據

>insert into student(id,name,score) values(0,'zhansan',90)//插入一行
>insert into student(id,name,score) values(0,'zhansan',90),(1,'xiaowang',50)//插入多行

15、更新和刪除數據
update更新表中特定的行,或者更新所有的行,後面不跟where語句。
例如:修改小王的成績(更改一列一行) update student set score = 100 where name='xiaowang';
例如:修改小王的成績,以及id (更改兩列一個行) update student set score = 100,id=5 where name='xiaowang';
例如:更改一列下面所有行 update student set score=100

delete刪除數據
delete from student where id=0; //刪掉id=0這一行
drop table student;//刪掉這個表


16、安全管理
mysql的安全基礎是,用戶對數據具有適當的訪問權限
查詢用戶信息:>use mysql; >select user from user;

1、創建用戶
create user 'user_name'@'host' IDENTIFIED BY 'password';
user_name:要創建用戶的名字。
host:表示要這個新創建的用戶允許從哪臺機登陸,如果只允許從本機登陸,則 填localhost,如果允許從遠程登陸,則填 %
password:新創建用戶的登陸數據庫密碼,如果沒密碼可以不寫。
重命名用戶:>rename user user_name to user_name2

1、創建的用戶需要賦予權限才能進行登陸操作,
> grant all privileges on *.* to 'xiaowang'@'%' identified by '123456' with grant option;
>grant select update on mydb.* tO 'username'@'localhost' identified by 'password';(只賦予selectupdate
1、all privileges:表示將所有權限授予給用戶。也可指定具體的權限,如:SELECTCREATEDROP等。
2、on:表示這些權限對哪些數據庫和表生效,格式:數據庫名.表名,這裏寫“*”表示所有數據庫,所有表。如果我要指定將權限應用到test庫的user表中,可以這麼寫:test.user
3、to:將權限授予哪個用戶。格式:”用戶名”@”登錄IP或域名”。%表示沒有限制,在任何主機都可以登錄。比如[email protected].%,表示xiaowang這個用戶只能在192.168.0IP段登錄
4、identified by:指定用戶的登錄密碼
5、with grant option:表示允許用戶將自己的權限授權給其它用戶

2、設置權限後,需要刷新權>flush privileges;

3、回收權限grant的反操作revoke,用來撤銷特定權限。
收回select權限:revoke select on *.* from 'myuser'@'%'
收回所有權限:revoke all privileges,grant option from 'myuser'@'%'

4、更改用戶賬戶的密碼set password for xiaowang = password('123456789')


16、mysql數據庫的維護
使用mysqldump備份程序、恢復數據庫:
1mysqldump -u root -p test(備份test數據庫)
2、mysqldump -u root -p test mytable(備份test數據庫下的mytable表格)
3、mysql -u root -p test<c:\test.txt(備份數據庫導入到數據庫,導回test數據庫)
4、使用桌面可視化工具備份

查看日誌:
1、日誌文件路徑

> show variables like 'general_log_file';

2、錯誤日誌文件路徑

> show variables like 'log_error';

3、慢查詢日誌文件路徑

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