Python與數據庫


一:數據庫基礎:

數據庫:存儲數據的倉庫

sql及其規范:SQL是專為數據庫而建立的操作命令集,是一種功能齊全的數據庫語言

登錄mysql:mysql -u用戶名 -p密碼
-mysql -h 127.0.0.1 -P 3306 -uroot -p123456;


退出:exit;quit;

sql規范:

sql語句不區分大小寫,但數據常量區分大小寫,建議命令大寫,表庫名小寫;

sql語句可單行多行抒寫,以;結尾,關鍵詞不能跨多行或簡寫

用空格和縮進來提高語句的可讀性,子句通常位於獨立行,便於編輯,提高可讀性

注釋:-- /*....*/

數據庫操作(DDL)的語句:
show databases; 查看mysql管理的數據庫
drop database 數據庫名 刪除指定數據庫
create database 數據庫名 [if not exists] 數據庫名 創建數據庫
show create database oldboy; 查看數據庫創建時的的配置信息

alter database oldboy1 character set utf-8; 修改數據庫編碼

create database if not exists oldboy character set gbk;設置數據庫的字符集

切換數據庫 use db_name; 注意:進入到某個數據庫過后,沒辦法在退回之前狀態,但可以通過use進行切換
select database() 查看當前使用的數據庫


數據表操作:

字段操作
非空且唯一 not NULL unique
進入目標數據庫(use database) 創建數據表CREATE TABLE employee
(
id INT PRIMARY KEY auto_increment,設置主鍵不能為空,主鍵自增(一張表就一個主鍵)
name VARCHAR(25),
gender boolean,會自動轉換為TINYINT
age TINYINT,
department VARCHAR(20),
salary DOUBLE(7,2)
#表的創建,字段的設置
);

查看當前數據庫的數據表 show tables
查看當前數據表的字段信息 desc employee
將當前數據表的字段轉換為mysql語句 show create table employee


#1.修改表結構 alter
為數據表添加一條字段:alter table employee add is_married tinyint(1)
alter table employee add entry_date date [約束字段]not null;


alter table employee add A int, ADD B VARCHAR(20);添加多個字段用逗號隔開

alter table employee drop B; 刪除字段B

alter table employee convert to character set utf8;修改表的編碼格式

#2.修改--列類型 modify

unique 字段唯一不能重值
#modify 修改字段類型 after放在某個字段的后面
alter table employee modify age int(10) not null default 18 after id;


#3.修改--列名 change
-----修改列名需要指定列的類型
alter table employee change department depart varchar(20) after salary


#4.修改表名 rename

rename table employee to emp;


#5.刪除表 drop table tab_name



表記錄操作:增-刪-查-改

#1.增加一條數據:insert into emp (id,age,name,gender,salary,depart) value (1,20,"alex","0",5500.1,"運維部");
#插入多條
INSERT INTO emp (name,salary,depart) VALUES ("唐","3500","開發部"),("xiao_yu",5000,"python")

,("wang_jun",8000.02,"運營部");
#直接插入
INSERT INTO emp VALUES (5,"雨雨",0,8328.88,"管理部"),要與列名一一對應

#set插入
INSERT INTO emp set name="丹丹",age=26;



#2.修改表記錄 update tab_name set field1=value1 field2=value2 where id=1;

update emp set salary =salary+20000 where id=2;




查詢當前表里面的所有記錄 select * from emp;


#3.刪除表記錄
DELETE FROM emp; 刪除所有記錄(一條一條的刪除),返回操作條數

DELETE FROM emp where id=5 or id=3; 刪除表中id為5和id為3的記錄

truncate table emp_new; 使用truncate刪除表中的所有記錄
(刪除表,創建新表),不返回操作條數


#4.查詢表記錄 select [distinct] * from table_name
---from指定從那張表篩選,*表示查找所有列,可以指定一個列----
----表明確知道要查找的列,distinct用來刪除重復行---

select filed1,filed2 from table_name;

#限制重復字段
select distinc filed1,filed2 from emp;


#別名使用
select filed1 as name,filed2 as age from table_name;


#使用where子句進行過濾查詢
select filed1,filed2 from table_name where filed2>80;
!= > < >= <= <>

select filed1,filed2 from table_name where filed2 between 88 and 100;

select filed1,filed2 from table_name where filed2 in (88,100,200);


select filed1,filed2 from table_name where name like "y%";
select filed1,filed2 from table_name where name like "y_____";
'''
pattern 可以是%或者_,
如果是%則表示任意多字符,
如果是_則表示一個字符,
'''

邏輯運算符 and or null

select filed1,filed2 from table_name where name="xxx" and age=xxxx;

select filed1,filed2 from table_name where filed2 is null ;為空


order by 指定排序的列,排序的列及可是表中的列名,也可以說是select語句后指定的別名
select filed1,filed2 from table_name where order by filed1 desc; 排序


重點:Select from where group by having order by

mysql在執行sql語句時的執行順序: from where Select group by having order by


group by 分組查詢:
--注意:按分組條件分組后每一組只顯示第一條記錄
‘’‘where是分組之前進行過濾,having是group by(先分組) 之后進行過濾’‘’
--group by子句,其后可以接多個列名,也可以跟having子句,對group by結果進行篩選

#sum聚合函數
select name,sum(Django) from oldboy1 group by name having sum(Django)>80;
select name,sum(JS) from employee group by name;

/*
having 和 where 兩者都可以對查詢結果進行進一步的過濾,差別有:
<1>where 語句只能在分組之前的篩選,having可以用在分組之后的篩選
<2>使用where語句的地方都可以使用haveing進行替換
<3>having可以使用聚合函數 where不可以

*/


聚合函數:先不要管聚合函數要干嘛,先把要求的內容查出來再包上聚合函數即可,
--一般和分組查詢配合使用

select sum(js) from emp;


#使用正則表達式
select * from emp where emp_name REGEXP "^yu"



#外鍵
CREATE TABLE oldboy.classCharger(
#直接指定庫下面的一張表
id TINYINT PRIMARY KEY auto_increment,
name VARCHAR(20),
age INT(4),
is_married boolean
);

INSERT INTO classCharger (name,age,is_married) VALUES ("tang",20,0),("wang",26,0),("li",30,1);

#外鍵
CREATE TABLE Student3(
id TINYINT PRIMARY KEY auto_increment,
name VARCHAR(20),
charger_id TINYINT,
FOREIGN KEY (charger_id) REFERENCES classcharger(id)
--切記 #關聯外鍵 做為外鍵一定要和關聯的主鍵的數據類型保持一致 有foreing key 的為子表

)ENGINE=INNODB;

INSERT INTO Student3 (name,charger_id) VALUES ("張",3),("朴",3);


#增加外鍵
ALTER TABLE Student ADD CONSTRAINT abc FOREIGN KEY (charger_id) REFERENCES classcharger(id);

#刪除外鍵
ALTER TABLE Student DROP FOREIGN KEY abc;


#INNODB支持的on語句
----外鍵對子表的含義:如果在父表中找不到候選鍵,則不允許在字表進行insert/update

----外鍵約束對父表的含義: 在父表上進行update和delete以更新和刪除在子表中有一條或多條對應匹配行的候選鍵時,
父表的行為取決於:在定義字表的外鍵時指定的 on update/on delete 子句


----------innodb支持的四種方式---------

---------- cascade方式:在父表上update/delete 記錄時,同步update/delete 掉的子表的匹配記錄
外鍵的級聯刪除:如果父表中的紀錄被刪除那么字表中的紀錄自動被刪除
FOREIGN KEY (charger_id) REFERENCES classcharger (id) ON DELETE cascade ;



---------- set null 方式在父表上update/delete記錄時,將子表上匹配的記錄的列設為null
--要注意子表的外鍵不能為not null



#多表查詢
連接查詢:
‘’‘
create table A(id int primary key,name varchar(20));

create table B(id int primary key,name varchar(20),A_id int);

insert into A values (1,"tang");
insert into A values (2,"yuan");
insert into A values (3,"wang");

insert into B values(1,"張",1);
insert into B values(2,"王",2);
insert into B values(3,"李",3);

select * from a,b where a.id=b.A_id; 內連接查詢
select A.id,a.name,b.name from a,b where a.id=b.A_id;

’‘’

內連接:inner join
select * from b inner join a on b.a_id=a.id and xxxx;



外連接:left join: 在內連接的基礎上增加左邊有的右邊沒有的結果; right join:在內連接的基礎上增加右邊有的左邊沒有的結果;
select a.name,b.name from b left join a on b.a_id=a.id;


全連接:full join



#多表查詢之復合條件連接查詢#多表查詢之復合條件連接查詢

SELECT DISTINCT department.dept_name FROM employee,department WHERE employee.dept_id=department.dept_id
and employee.age>30;
'''DISTINCT:去重 unique:唯一'''


#多表查詢之子查詢
--子查詢是將一個查詢語句嵌套在另一個查詢語句中
--內層查詢語句的結果,可以為外層查詢語句提供查詢條件
--子查詢中可以包含:IN NOT ANY ALL EXISTS 和 NOT EXISTS等關鍵字
--還可以包含比較運算符:= , !=,< ,>等

----1.帶in關鍵字的子查詢,查詢employee表,但dept_id必須在department表中出現過
select * from emplyoee where dept_id in (select dept_id * from department);


#索引 索引特點:創建與維護索引會消耗很多時間與磁盤空間,但查詢速度大大提高。PRIMARY KEY--主鍵索引 UNIQUE

CREATE TABLE test1 (
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR (20),
resume VARCHAR (255)
);

INSERT INTO test1 (name,resume) values ("alex","111"),("tang","2222"),("zhang","33333");

給name加上索引
alter table test1 modify name varchar(20) unique; #unique 唯一索引

創建普通索引
CREATE TABLE emp2(
id int,
name VARCHAR (20),
index index_name (name)#添加索引
KEY index_name (name)#添加索引
);

創建唯一索引
CREATE TABLE emp3(
id int,
name varchar (30),
unique index index_emp (name)
);

創建多列索引
CREATE TABLE emp4(
id INT,
name VARCHAR (30),
resume varchar (50),
index index_name(name,resume)
)

添加索引
CREATE TABLE t2 ADD INDEX index_name (id);

CREATE INDEX index_name on t2 (id);


刪除索引
DROP INDEX index_name on t2;




二:python關於數據庫的API---pymysql

import pymysql

#連接數據庫
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",passwd='123456',db="oldboy")

cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
sql="create table tang(id int (10),name varchar(20))"

#cursor.execute(sql)
ret=cursor.execute("insert into tang values (1,'alex'),(2,'yuan')")
#print(ret)#返回影響的行數

# ret2=cursor.execute("select * from tang;")
# print(ret2)
#
# # print(cursor.fetchone()) 查詢數據 cursor游標標記當前查詢位置
# # print(cursor.fetchall())
# print(cursor.fetchmany(2))
#
# cursor.scroll(1,mode="relative")#設置游標所在的位置


#conn.commit()
# cursor.close()
# conn.close()


'''
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

# 創建連接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 創建游標
cursor = conn.cursor()

# 執行SQL,並返回收影響行數
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")

# 執行SQL,並返回受影響行數
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))

# 執行SQL,並返回受影響行數
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])


# 提交,不然無法保存新建或者修改的數據
conn.commit()

# 關閉游標
cursor.close()
# 關閉連接
conn.close()
3、獲取新創建數據自增ID
可以獲取到最新自增的ID,也就是最后插入的一條數據ID

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()
cursor.close()
conn.close()

'''


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM