Python基礎學習教程—MySQL常見的多表聯查
5 人贊了文章
一、 MySQL的多表聯查
==================================
表之間的關係有:1對1 1對多 多對多
1. 嵌套查詢:一個查詢的結果是另外sql查詢的條件:
如:查詢stu表中年齡最大的是誰?
mysql> select * from stu where age=(select max(age) from stu);
mysql> select * from stu where age in(select max(age) from stu); --(子查詢結果是多條時使用in查詢)
+----+------+------+-----+----------+
| id | name | age | sex | classid |
+----+------+------+-----+----------+
| 14 | abc | 33 | w | python01 |
+----+------+------+-----+----------+
1 row in set (0.01 sec)
2. where關聯查詢
已知:員工personnel表和部門department表,其中員工表中的did欄位為部門表id主鍵關聯。
查詢所有員工信息,並顯示所屬部門名稱
要求:顯示欄位:員工id 部門 姓名
mysql> select p.id,d.name,p.name from personnel p,department d where p.did = d.id;
+----+-----------+-----------+
| id | name | name |
+----+-----------+-----------+
| 2 | 人事部 | 李玉剛 |
| 10 | 人事部 | 阿杜 |
| 4 | 市場部 | 劉歡 |
。。。。
3. 連接join查詢
左聯:left join
右聯:right join
內聯:inner join
已知如下表所示,商品類別信息表(具有兩層類別關係,通過pid表示,0表示一級類別)
mysql> select * from type;
+----+-----------+------+
| id | name | pid |
+----+-----------+------+
| 1 | 服裝 | 0 |
| 2 | 數碼 | 0 |
| 3 | 男裝 | 1 |
| 4 | 手機 | 2 |
| 5 | 相機 | 2 |
| 6 | 電腦 | 2 |
| 7 | 女裝 | 1 |
| 8 | 童裝 | 1 |
| 9 | 食品 | 0 |
| 10 | 零食 | 9 |
| 11 | 特產 | 9 |
| 12 | 休閑裝 | 1 |
+----+-----------+------+
12 rows in set (0.00 sec)
mysql> desc type;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | | NULL | |
| pid | int(10) unsigned | YES | | NULL | |
+-------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
-- 查詢二級類別信息,並關聯出他們的父類別名稱
mysql> select t1.id,t1.name,t2.name from type t1,type t2 where t1.pid!=0 and t1.pid=t2.id;
+----+-----------+--------+
| id | name | name |
+----+-----------+--------+
| 3 | 男裝 | 服裝 |
| 4 | 手機 | 數碼 |
| 5 | 相機 | 數碼 |
| 6 | 電腦 | 數碼 |
| 7 | 女裝 | 服裝 |
| 8 | 童裝 | 服裝 |
| 10 | 零食 | 食品 |
| 11 | 特產 | 食品 |
| 12 | 休閑裝 | 服裝 |
+----+-----------+--------+
9 rows in set (0.01 sec)
--統計每個一級類別下都有多少個子類別。
mysql> select t1.id,t1.name,count(t2.id) from type t1,type t2 where t1.pid=0 and t1.id=t2.pid group by t1.id;
+----+--------+--------------+
| id | name | count(t2.id) |
+----+--------+--------------+
| 1 | 服裝 | 4 |
| 2 | 數碼 | 3 |
| 9 | 食品 | 2 |
+----+--------+--------------+
3 rows in set (0.00 sec)
二、MySQL的其他操作
==================================
1. MySQL的表複製
複製表結構
mysql> create table 目標表名 like 原表名;
複製表數據
mysql> insert into 目標表名 select * from 原表名;
2. *數據表的索引
創建索引
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
刪除索引
DROP INDEX index_name ON talbe_name
3. mysql視圖
創建視圖:
mysql> create view v_t1 as select * from t1 where id>4 and id<11;
Query OK, 0 rows affected (0.00 sec)
view視圖的幫助信息:
mysql> ? view
ALTER VIEW
CREATE VIEW
DROP VIEW
查看視圖:
mysql> show tables;
刪除視圖v_t1:
mysql> drop view v_t1;
4. MySQL的內置函數
字元串處理函數
---------------------------------------------
*concat(s1,s2,…Sn) 連接s1,s2..Sn為一個字元串
insert(str,x,y,instr)將字元串str從第xx位置開始,y字元串的子字元串替換為字元串str
lower(str)將所有的字元串變為小寫
upper(str)將所有的字元串變為大寫
left(str,x)返回字元串中最左邊的x個字元
rigth(str,y)返回字元串中最右邊的x個字元
lpad(str,n,pad)用字元串pad對str最左邊進行填充,直到長度為n個字元串長度
rpad(str,n,pad)用字元串pad對str最右邊進行填充,直到長度為n個字元串長度
trim(str) 去掉左右兩邊的空格
ltrim(str) 去掉字元串str左側的空格
rtrim(str) 去掉字元串str右側的空格
repeat(str,x) 返回字元串str重複x次
replace(str,a,b)將字元串的的a替換成b
strcmp(s1,s2) 比較字元串s1和s2
substring(s,x,y)返回字元串指定的長度
*length(str) 返回值為字元串str 的長度
數值函數
-----------------------------------------------------
*abs(x) 返回x的絕對值
ceil(x) 返回大於x的最小整數值
floor(x) 返回小於x的最大整數值
mod(x,y) 返回x/y的取余結果
*rand() 返回0~1之間的隨機數
*round(x,y)返回參數x的四捨五入的有y位小數的值
truncate(x,y) 返回x截斷為y位小數的結果
日期和時間函數
---------------------------------------------------
curdate() 返回當前日期,按照』YYYY-MM-DD』格式
curtime() 返回當前時間,當前時間以HH:MM:SS
*now() 返回當前日期和時間,
*unix_timestamp(date) 返回date時間的unix時間戳
from_unixtime(unix_timestamp[,format]) 返回unix時間的時間
week(date) 返回日期是一年中的第幾周
year(date) 返回日期的年份
hour(time) 返回time的小時值
minute(time) 返回日time的分鐘值
monthname(date) 返回date的月份
*date_fomat(date,fmt) 返回按字元串fmt格式化日期date值
date_add(date,INTERVAL,expr type) 返回一個日期或者時間值加上一個時間間隔的時間值
*datediff(expr,expr2) 返回起始時間和結束時間的間隔天數
//統計時間戳647583423距離當前時間相差天數(生日天數(不考慮年份))
mysql> select datediff(date_format(from_unixtime(647583423),"2017-%m-%d %h:%i:%s"),now());
其他常用函數
------------------------------------------------------
*database() 返回當前資料庫名
version() 返回當前伺服器版本
user() 返回當前登陸用戶名
inet_aton 返回當前IP地址的數字表示 inet_aton("192.168.80.250");
inet_ntoa(num) 返回當前數字表示的ip inet_ntoa(3232256250);
*password(str) 返回當前str的加密版本
*md5(str) 返回字元串str的md5值
5. MySQL的事務處理
關閉自動提交功能(開啟手動事務)
mysql> set autocommit=0;
從表t1中刪除了一條記錄
mysql> delete from t1 where id=11;
此時做一個p1還原點:
mysql> savepoint p1;
再次從表t1中刪除一條記錄:
mysql> delete from t1 where id=10;
再次做一個p2還原點:
mysql> savepoint p2;
此時恢復到p1還原點,當然後面的p2這些還原點自動會失效:
mysql> rollback to p1;
退回到最原始的還原點:
mysql> rollback;
回滾
mysql> commit;
事務提交
開啟自動事務提交(關閉手動事務)
mysql> set autocommit=1;
6. MySQL的觸發器
格式:1、觸發器的定義:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
說明:
# trigger_name:觸發器名稱
# trigger_time:觸發時間,可取值:BEFORE或AFTER
# trigger_event:觸發事件,可取值:INSERT、UPDATE或DELETE。
# tb1_name:指定在哪個表上
# trigger_stmt:觸發處理SQL語句。
示例:
mysql> delimiter $$
mysql> create trigger del_stu before delete on stu for each row
-> begin
-> insert into stu_bak values(old.id,old.name,old.sex,old.age,old.addtime);
-> end;
-> $$
Query OK, 0 rows affected (0.05 sec)
mysql> delimiter ;
7. mysql日誌
開啟日誌: 在mysql配置文件中開啟:log-bin=mysql-bin
查看bin-log日誌:
mysql>show binary logs;
查看最後一個bin-log日誌:
mysql>show master status;
此時就會多一個最新的bin-log日誌
mysql>flush logs;
查看最後一個bin日誌.
mysql>show master status;
mysql>reset master;
清空所有的bin-log日誌
執行查看bin-log日誌
備份數據:
mysqldump -uroot -pwei test -l -F >/tmp/test.sql
其中:-F即flush logs,可以重新生成新的日誌文件,當然包括log-bin日誌
// Linux關閉MySQL的命令
$mysql_dir/bin/mysqladmin -uroot -p shutdown
// linux啟動MySQL的命令
$mysql_dir/bin/mysqld_safe &
8、有關慢查詢操作:
開戶和設置慢查詢時間:
vi /etc/my.cnf
log_slow_queries=slow.log
long_query_time=5
查看設置後是否生效
mysql> show variables like "%quer%";
慢查詢次數:
mysql> show global status like "%quer%";
9 資料庫的恢復
1. 首先恢復最後一次的備份完整數據
[root@localhost mnt]# mysql -u root -p mydemo<mydemo_2017-7-26.sql
Enter password:
2. 查看bin-log日誌
[root@localhost data]# mysqlbinlog --no-defaults mysql-bin.000009;
查找到恢復的節點
3. 執行bin-log日誌文件,恢復最後一塊的增量數據。
[root@localhost data]# mysqlbinlog --no-defaults --stop-position="802" mysql-bin.000009|mysql -u root -p123456 mydemo;
推薦閱讀:
※#python基礎入門#01
※從零開始的python世界的闖蕩之視頻學習篇 第二話 VIM的簡單使用
※Python Set and Dict Type
※Python獲取網頁中動態載入的數據
※4. Command line tool 命令行工具