Python/MySQL(二、表操作以及連接)
mysql表操作: 主鍵:一個表只能有一個主鍵。主鍵可以由多列組成。 外鍵 :可以進行聯合外鍵,操作。
mysql> create table yuan(id int auto_increment,yuangongname int,bumen_id int, primary key(id,yuangongname))engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.43 sec)
查看表創建的類型:
show create table 表名;
mysql> show create table class; +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | class | CREATE TABLE `class` ( `cid` int(11) NOT NULL AUTO_INCREMENT, `caption` char(10) DEFAULT NULL, PRIMARY KEY (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 | +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
show create table 表名 \G;
mysql> show create table class\G; *************************** 1. row *************************** Table: class Create Table: CREATE TABLE `class` ( `cid` int(11) NOT NULL AUTO_INCREMENT, `caption` char(10) DEFAULT NULL, PRIMARY KEY (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) ERROR: No query specified
alter table 表名 auto_increment=20; 設置自增的起始位。
mysql> alter table class auto_increment=20; Query OK, 0 rows affected (0.11 sec)
步長:
基於會話級別:
show session variables like 'auto_inc%'; 查看會話的步長 mysql> show session variables like 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set, 1 warning (0.00 sec)
set session auto_increment_increment=2; 設置會話步長
mysql> set session auto_increment_increment=2; Query OK, 0 rows affected (0.00 sec) set session auto_incrment_offset=10; mysql> set session auto_increment_offset=10; Query OK, 0 rows affected (0.00 sec)
基於全局級別:
show global variables like ' auto_inc%'; 查看全局步長
show global variables like ' auto_inc%'; 查看全局步長 mysql> show global variables like 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set, 1 warning (0.00 sec)
set global auto_increment_increment=2; 設置全局步長
mysql> set global auto_increment_increment=2; Query OK, 0 rows affected (0.02 sec) set global auto_incrment_offset=10; mysql> set global auto_increment_increment=1; Query OK, 0 rows affected (0.00 sec)
數據庫中自增的共有(二種)
1.自增步長; 2.自增主鍵;
唯一索引:
unique 唯一索引名稱(列名,列名) 唯一:約束不能重復(可以為空),加速查找 主鍵:約束 不能重復且不能為空
創建唯一索引:
mysql> create table biao(id int auto_increment primary key,name char(10),unique s_t(id))engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.82 sec)
外鍵的擴展:
一對多:例如,一個公司有很多員工但是部門只有固定的4個
創建一個部門表;
mysql> create table bumen(id int auto_increment primary key,bumenname char(10))engine=innodb default charset=utf8; Query OK, 0 rows affected (0.55 sec) mysql> show tables; +--------------+ | Tables_in_b2 | +--------------+ | b1 | | biao | | bumen | | class | | course | | score | | student | | teacher | +--------------+ 8 rows in set (0.00 sec)
創建員工表: mysql> create table yuangong(id int auto_increment primary key,yuangongname char(10))engine=innodb default charset=utf8; Query OK, 0 rows affected (0.62 sec) mysql> show tables; +--------------+ | Tables_in_b2 | +--------------+ | b1 | | biao | | bumen | | class | | course | | score | | student | | teacher | | yuangong | +--------------+ 9 rows in set (0.00 sec) 為員工表添加信息: mysql> insert into yuangong(yuangongname) values('張三'); Query OK, 1 row affected (0.11 sec) mysql> insert into yuangong(yuangongname) values('張si'),('張ts'),('張li'); Query OK, 3 rows affected (0.06 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from yuangong; +----+--------------+ | id | yuangongname | +----+--------------+ | 1 | 張三 | | 2 | 張si | | 3 | 張ts | | 4 | 張li | +----+--------------+ 4 rows in set (0.00 sec) 為部門表添加信息: mysql> insert into bumen(bumenname) values('IT'),('BT'),('kT'),('XT'); Query OK, 4 rows affected (0.05 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from bumen; +----+-----------+ | id | bumenname | +----+-----------+ | 1 | IT | | 2 | BT | | 3 | kT | | 4 | XT | +----+-----------+ 4 rows in set (0.00 sec)
一對一:
例如公司有多個員工,公司分配郵箱,每個員工只能有一個郵箱不能重復有多,就是一對一的
多對多:
例如,相親記錄表(用戶表 1,用戶表 2 )倆個表的內容可以進行多次匹配 就實現多對多效果;
SQL語句數據行操作補充;
增 insert into biao(name,age) values('alex',18); insert into biao(name,age) values('alex',18),('egon',10); insert into biao(name,age) select name,age from biao2; 刪: delete from biao; delete from tb12 where id !=2 delete from tb12 where id =2 delete from tb12 where id > 2 delete from tb12 where id >=2 delete from tb12 where id >=2 or name='alex' 改: update biao set name='alex' where id>2 and name='egon' update biao set name='alex',age=19 where id>2 and name='egon'; 查: select * from biao: select name from biao; select id,name from biao where id>22 or name='alex'; select * from tb12 where id in (select id from tb11) select * from tb12 where id between 5 and 12; (閉區間包含自己本身)
通配符:
select * from biao where name like 'a%' (查看以a開頭的任意內容) select * from biao where name like 'a_' (查看以a開頭的下一個內容) select * from biao where name like '%a%' (查看包含a的內容) select * from biao where naem like '%a' (查看以a結尾的內容)
分頁:
select * from biao limit 10; (查看10的內容從0開始排列)) select * from biao limit 1,10;(查看從1開始后面的10個內容) select * from biao limeit 10 offset 20;(查看從20開始后面的10個人內容)
排序:
select *from biao order by id desc (從大到小的排序) select *from biao order by id asc (從小到大的排序)
查看后10條數據:
select *from biao order by id desc limit 10; (把表的內容進行反轉 ,然后再獲取10條數據)
分組:(count . max . min . sum . avg)
select count(id),min(id),max(id),part_id from mysql> select count(cid) from class group by cid; +------------+ | count(cid) | +------------+ | 1 | | 1 | | 1 | +------------+ 3 rows in set (0.04 sec) mysql> select caption from class group by caption; +----------+ | caption | +----------+ | 一年三班 | | 三年一班 | | 三年二班 | +----------+ 3 rows in set (0.04 sec) mysql> select sid,class_id from student group by sid,class_id; +-----+----------+ | sid | class_id | +-----+----------+ | 1 | 1 | | 2 | 1 | | 3 | 2 | +-----+----------+ 3 rows in set (0.04 sec) mysql> select sid from student group by sid having max(sid)>1; +-----+ | sid | +-----+ | 2 | | 3 | +-----+ 2 rows in set (0.09 sec) **** 如果對於聚合函數結果進行二次篩選時?必須使用having **** select count(id),part_id from userinfo5 group by part_id having count(id) > 1; select count(id),part_id from userinfo5 where id > 0 group by part_id having count(id) > 1;
連表操作 (left join 表名 on 有相關關系的進行連接,並設置是否相等,如果不設置就是(的卡爾基效果,表的行數相乘))
mysql> select * from teacher join course on course.tearch_id=teacher.tid; +-----+-------+-----+-------+-----------+ | tid | tname | cid | cname | tearch_id | +-----+-------+-----+-------+-----------+ | 1 | 波多 | 1 | 生物 | 1 | | 1 | 波多 | 2 | 體育 | 1 | | 2 | 蒼空 | 3 | 物理 | 2 | +-----+-------+-----+-------+-----------+ 3 rows in set (0.03 sec)
mysql> select * from teacher right join course on course.tearch_id=teacher.tid; +------+-------+-----+-------+-----------+ | tid | tname | cid | cname | tearch_id | +------+-------+-----+-------+-----------+ | 1 | 波多 | 1 | 生物 | 1 | | 1 | 波多 | 2 | 體育 | 1 | | 2 | 蒼空 | 3 | 物理 | 2 | +------+-------+-----+-------+-----------+ 3 rows in set (0.00 sec)
靠左連接 (left join 表名 on 有相關關系的進行連接)
mysql> select * from teacher left join course on course.tearch_id=teacher.tid; +-----+-------+------+-------+-----------+ | tid | tname | cid | cname | tearch_id | +-----+-------+------+-------+-----------+ | 1 | 波多 | 1 | 生物 | 1 | | 1 | 波多 | 2 | 體育 | 1 | | 2 | 蒼空 | 3 | 物理 | 2 | | 3 | 飯島 | NULL | NULL | NULL | +-----+-------+------+-------+-----------+ 4 rows in set (0.00 sec)
靠右連接:(right join 表名 on 有相關關系的進行連接)
mysql> select * from teacher right join course on course.tearch_id=teacher.tid; +------+-------+-----+-------+-----------+ | tid | tname | cid | cname | tearch_id | +------+-------+-----+-------+-----------+ | 1 | 波多 | 1 | 生物 | 1 | | 1 | 波多 | 2 | 體育 | 1 | | 2 | 蒼空 | 3 | 物理 | 2 | +------+-------+-----+-------+-----------+ 3 rows in set (0.00 sec) mysql>
不顯示NULL(空)行(inner)
mysql> select * from teacher inner join course on course.tearch_id=teacher.tid; +-----+-------+-----+-------+-----------+ | tid | tname | cid | cname | tearch_id | +-----+-------+-----+-------+-----------+ | 1 | 波多 | 1 | 生物 | 1 | | 1 | 波多 | 2 | 體育 | 1 | | 2 | 蒼空 | 3 | 物理 | 2 | +-----+-------+-----+-------+-----------+ 3 rows in set (0.00 sec)
篩選條件:
這些條件可以在對表進行操作時代入
1 in 在 2 not in 不在 3 and 和 4 or 或 5 = 等於 6 != 不等於 7 > 大於 8 < 小於 9 >= 大於等於 10 <= 小於等於 11 between and 在什么之間 和 .....