上篇地址:MySQL數據庫學習(一)
12、子查詢
子查詢實際上嵌套在其他查詢中的查詢,例如兩張表,物品表 orderitems 中,保存訂單號,客戶ID,訂單日期。customers表中保存客戶信息。(兩張表互不相連,需要查詢兩次)
如果要找到物品 TNT2 的所有客戶,需要採用下列步驟:
- 查找包含物品 TNT2 的所有訂單的編號;
- 查找前一步驟列出的訂單編號的所有客戶的 ID;
- 查找前一步驟返回的所有客戶 ID 的客戶信息;
所以 可以執行下列操作:
>select order_num from orderitems where prod_id='TNT2'; //查到爲4,6
>select cust_id from orders where order_num in (4,6);
13、表聯結
關係型數據庫的強大在於關係表,關係表的設計原則時保證把信息分解爲多個表,一類數據一個表,各個表通過某些常用的值互相關聯,比如兩個表之間通過外鍵來關聯。(外鍵是某個表中的一列,它又是另外一個表的主鍵值。)
表聯結的優點:
- 數據信息不重複,從而不浪費時間和空間,伸縮性好(scale well)
- 如果某個數據信息變動,可以只更新該表中的某個記錄,相關表數據不用變更
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)
可以採用下列方式:
- 插入完整的行;
- 插入行的一部分;
- 插入多行;
- 插入某些查詢結果;
前面中有使用插入操作進行,插入一個學生的數據
>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';
(只賦予select
和update
)
1、all privileges
:表示將所有權限授予給用戶。也可指定具體的權限,如:SELECT
、CREATE
、DROP
等。
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';