review_數(shù)據(jù)庫_20191223-1227
第一章.sql-基礎(chǔ)語法
sql又叫結(jié)構(gòu)化查詢語言,
分為三大類:
DDL(數(shù)據(jù)定義語言)
DML(數(shù)據(jù)操作語言)
DCL(數(shù)據(jù)控制語言)
1.DDL(數(shù)據(jù)定義語言)
1.創(chuàng)建數(shù)據(jù)庫
create database 數(shù)據(jù)庫名稱;
? ? -- 創(chuàng)建指定數(shù)據(jù)庫,如果已經(jīng)存在會報錯
create database if not exists 數(shù)據(jù)庫名稱;
? ? -- 當指定數(shù)據(jù)庫不存在的時候創(chuàng)建對應(yīng)數(shù)據(jù)庫
create database if not exists 數(shù)據(jù)庫名稱 default charset utf8;
? ? -- 創(chuàng)建數(shù)據(jù)庫的時候指定數(shù)據(jù)文件編碼方式
2.刪除數(shù)據(jù)庫
drop database 數(shù)據(jù)庫名稱;
drop database if EXISTS 數(shù)據(jù)庫名;
3.切換/使用數(shù)據(jù)庫
USE 數(shù)據(jù)庫;?
--切換/使用指定數(shù)據(jù)庫;切換后所有數(shù)據(jù)庫相關(guān)操作都是針對此數(shù)據(jù)庫
=================== 表的操作 ================
-- 1.創(chuàng)建表(數(shù)據(jù)庫文件是通過表來存數(shù)據(jù))
create table if not exists 表名(字段名1 類型1 約束1,字段名2 類型名2 約束2...)
-- 表名:程序員自命名,見名知意,一般前綴加t_/tb_表示
-- 字段名:程序員自命名,見名知意
-- 主鍵:字段中一定要有一個字段作為主鍵 可以用來表示唯一一條記錄;
--? ? ? ? ? ? ? 主鍵要求不能為空,并且是唯一的,并且是整型
-- 類型名: 必須是當前數(shù)據(jù)庫支持的數(shù)據(jù)類型,
-- mysql中常用的數(shù)據(jù)類型:int float double varchar/text(字符串) bit(布爾) date/datatime(日期時間)
-- 約束:not NULL 非空約束,? UNIQUE 唯一約束, DEFAULT 默認值約束, PRIMARY KEY 主鍵約束, FOREIGN KEY 外鍵約束,
--? ? ? ? ? ? ? auto_increment(自動增長)
-- 注意:約束可以沒有,也可以有多個
例子:
create table if not EXISTS t_stu(
stu_id int PRIMARY KEY auto_increment,
stu_name VARCHAR(10) not NULL,
stu_birth DATE,
stu_gender BIT DEFAULT 1,
stu_tel VARCHAR(11) UNIQUE
);
2.刪除表
-- drop table if EXISTS 表名;? -刪除指定表
drop table t_stu;
3.修改表
3.1 添加字段
-- alter table 表名 add COLUMN 字段名 字段類型 字段約束;
alter table t_stu add COLUMN stu_enname VARCHAR(20),add COLUMN stu_email VARCHAR(20);
3.2 刪除字段
-- alter table 表名 drop column 字段名
alter table t_stu drop COLUMN stu_addr,drop COLUMN stu_email;
3.3 修改字段名
-- alter table 表名 change 原字段 新字段 新的類型(必寫)
alter table t_stu change stu_enname stu_email VARCHAR(20);
2.DML(數(shù)據(jù)操作語言)
數(shù)據(jù)操作語言主要提供表中數(shù)據(jù)的增刪改查操作
=========1.insert=========
-- insert into 表名 values (值1铛碑,值2,值3...); 按表中字段的順序依次給每個字段賦值,最終形成一條新的記錄
insert into t_stu values(1001,'范閑','1987-03-23',0,13320996307,'hyoyee@126.com');
-- INSERT INTO 表名 (字段名1,字段名2,....)? values (值1,值2,....);? -按指定順序給指定字段賦值,最終形成一條新的記錄
insert into t_stu (stu_name,stu_tel,stu_birth) values ('司理理',14255887799,date(now()));
-- 補充:值的問題
-- 字符串? - 用引號引起來
-- 日期date?
date(now()) -當前日期?
year(now()) -當前年?
(mysql的函數(shù))
=========2.delete=========
-- delete from 表名;? 清空當前表
-- delete from 表名 where 條件;? -刪除所有滿足條件的紀錄
delete from t_stu WHERE stu_name = '婉兒';
-- 補充:sql條件語句的寫法(篩選)
-- 比較運算:= <>(不等于) > < >= <=
-- 邏輯運算:and or not
-- 集合運算:in
-- 范圍:between...and....
-- 判斷是否為空:is null,is not null
-- 篩選:like %任意字符? _ 單個任意字符
delete from t_stu WHERE stu_name like '范%';
delete from t_stu WHERE stu_tel like '__8%';
=========3.update=========
-- update 表名 set 字段1=新值1,字段2=新值2,...;? 將指定表中所有記錄中指定的字段修改成指定的值
=========4.select=========
-- SELECT * from 表名;
-- 結(jié)果重新復(fù)制(主要針對布爾)
-- select if(字段名,值1,值2) from 表名;? -如果if中對應(yīng)的字段的值是1,最后結(jié)果是值1,否則是值2
-- mysql寫法:if(字段,新值1,新值2)
select stu_name,if(stu_gender,'男','女') as 'gender' from t_stu;
-- 通用寫法:case 字段 when 值 then 新值1 else 新值2 end
select stu_name,case stu_gender when 1 then '男' else '女' end as'性別' from t_stu;
-- 列合并(查詢的時候講多個字段合并成一個數(shù)據(jù)返回結(jié)果)
-- select concat(字段1,字段2,...)as '新字段名' from 表名;
-- 篩選
-- 上面所有的查詢語法的后面都可以加where 條件 對記錄進行篩選
-- selelct *from 表名 where 條件;
-- 排序
-- select * from 表名 order by 字段;? 將查詢結(jié)果按指定字段的值從小到大排序
-- order by 字段 asc? ? 升序排序
-- order by 字段 desc? 降序排序
========================================
第二章.sql-外鍵約束和高級查詢
E.R實體關(guān)系圖
-- E.R實體關(guān)系圖是通過圖表的形式來表示數(shù)據(jù)庫中表和字段以及表和表之間的關(guān)系
-- 表和表之間的關(guān)系主要有四種:1對1 1對多 多對1 多對多
2.外鍵約束
-- 外鍵約束:讓字段的值取值范圍在另外一張表的主鍵中
-- 怎么添加外鍵約束:
1)保證當前表中有一個字段能夠保持另外一張表的主鍵
2)添加外鍵約束
-- 不同對應(yīng)關(guān)系 外鍵的添加的要求不同
-- 一對一:可以添加到任意一張表中
-- 一對多和多對一: 添加到多的那張表中
-- 多對多:兩張表沒有辦法簡歷多對多的對應(yīng)關(guān)系,需要第三張表
alter table tb_student add COLUMN collid int COMMENT '所在學院';?
-- 在學生表中添加新的字段保存學院表的主鍵
alter table tb_teacher add column collid int;
alter table tb_course add column teaid int;
3.怎么添加約束
-- 3.1 創(chuàng)建表或者添加字段的時候直接在字段后面添加約束
-- 3.2 通過修改表的方式添加和刪除約束
-- alter table 表名 add constraint 約束索引 約束名(字段);
-給指定字段添加指定約束(只能添加唯一約束和主鍵約束)
alter table tb_student add constraint UNIQUE_collid UNIQUE(collid);
alter table tb_teacher add CONSTRAINT UNIQUE_collid UNIQUE(collid);
alter table tb_course add CONSTRAINT UNIQUE_teaid UNIQUE(teaid);
-- 刪除指定約束:alter table 表名 drop index 約束索引名;
alter table tb_student drop INDEX UNIQUE_collid;
alter table tb_teacher drop index UNIQUE_collid;
alter table tb_course drop index UNIQUE_teaid;
-- 3.3 添加外鍵約束
-- alter table 從表名 add CONSTRAINT FK_cid FOREIGN KEY(從表字段名) REFERENCES 主表(主表字段名);
alter table tb_student add CONSTRAINT FK_stucolid FOREIGN KEY(collid) REFERENCES tb_college(collid);
ALTER TABLE tb_teacher add CONSTRAINT FK_teacolid FOREIGN key(collid) references tb_college(collid);
ALTER table tb_course add CONSTRAINT FK_courteaid FOREIGN KEY(teaid) REFERENCES tb_teacher(teaid);
-- 3.4 刪除外鍵約束
alter table 從表名 drop FOREIGN KEY 約束索引名;
alter table tb_student drop FOREIGN key FK_stucolid;
alter table tb_teacher drop FOREIGN key FK_teacolid;
-- 3.4.5 多對多的外鍵約束
(兩張表沒有辦法簡歷多對多的對應(yīng)關(guān)系,需要第三張表)
create table if not EXISTS tb_record(
reid int PRIMARY key auto_increment,
stu_id int comment '學生外鍵',
cou_id int comment '課程外鍵',
re_date date comment '選課日期',
score FLOAT,
FOREIGN key(stu_id) REFERENCES tb_student(stuid),
FOREIGN key(cou_id) REFERENCES tb_course(couid)
);
-- ======4.高級查詢======
-- 1.去重
select DISTINCT 字段名 from 表名;
select DISTINCT re_date from tb_record order by re_date;
-- 2.限制和分頁
-- 限制:查詢語句最后加關(guān)鍵字 LIMIT 數(shù)字(條數(shù))
select * from tb_record limit 5;
-- 偏移(分頁):
-- select * from 表名 limit M offset N;? -跳過前N條數(shù)據(jù)獲取M條數(shù)據(jù)(從N+1條數(shù)據(jù)開始獲取M條數(shù)據(jù))
-- select * from 表名 limit M,N;? ? -跳過前M條數(shù)據(jù)獲取N條數(shù)據(jù)
select * from tb_record order by score desc LIMIT 3 offset 3;
-- 3.聚合:
max(),min(),sum(),avg(),count()
select max(score) from tb_record;
select min(score) from tb_record;
select sum(score) from tb_record;? -- 值為空的不參與運算
select avg(score) from tb_record;? -- 值為空的不參與運算
select count(score) from tb_record;? -- 值為空的不參與運算
-- 4.分組 group by
-- select 聚合函數(shù)(字段名) from 表名 group by(字段);
-- 注意:分組后,除了分組字段意外,其他字段只能聚合操作
-- 每個學生的所有學科的平均分
select stu_id,format(avg(score),2) from tb_record group by stu_id;
-- 每個學科的平均分
select cou_id,format(avg(score),2) from tb_record GROUP BY cou_id;
-- 獲取每個學生的選課數(shù)量
select stu_id,count(cou_id) from tb_record GROUP BY stu_id;
-- 5.子查詢
-- 將一個查詢的結(jié)果作為另一個查詢的條件或查詢對象
-- 獲取成績是最高分的所有的學生的id
-- 第一種查詢:將查詢結(jié)果作為另一個查詢的條件
select stu_id,score from tb_record where score = (select max(score) from tb_record);
-- 獲取選了2門課程以上的學生的id
select stu_id,count(cou_id) from tb_record GROUP BY stu_id having count(cou_id)>2;
-- 獲取選了2門課程以上的學生的姓名
select stuname from tb_student where stuid in (select stu_id from tb_record group by stu_id having count(cou_id)>2);
-- 第二種查詢:將一個查詢的結(jié)果作為另一個查詢的查詢對象
-- 注意:第一次查詢的結(jié)果必須重命名后才能賦給另一個查詢作為查詢對象
-- 獲取分數(shù)前三的所有學生的id
select stu_id,score from tb_record where score in(select t.score from (select distinct score from tb_record order by score desc limit 3)as t);
-- 6.聯(lián)表查詢/連接查詢:同時查多張表的數(shù)據(jù)
-- select * from 表名1,表名2,表名3 連接條件 查詢條件;
-- 注意:如果既有連接條件又有查詢條件,查詢條件必須置后
-- 查詢所有學生的名字和學院名稱
select stuname,collname from tb_college,tb_student where tb_college.collid = tb_student.collid;
-- 查詢學生每個學科的成績: 學生姓名 - 學科名 - 分數(shù)
select stuname,couname,score from tb_student,tb_course,tb_record where tb_student.stuid = tb_record.stu_id AND tb_course.couid = tb_record.cou_id;
========================================
第三章.sql-內(nèi)/外連接 授權(quán) 事物 視圖 索引
1.內(nèi)連接和外連接
-- 1.1 內(nèi)連接
-- 內(nèi)連接有兩種寫法
-- 寫法一:select * from 表1,表2,表3,.....where 連接條件 查詢條件;
-- 寫法二:select * from 表1 INNER JOIN 表2 on 表2連接條件 INNER JOIN 表3 on 表3的連接條件....where 查詢條件
-- 注意:如果不寫連接條件,最后會形成笛卡爾積現(xiàn)象;
-- 在方法二中中間表必須放在最前面
-- 查詢薪水超過其所在部門平均薪水的員工的姓名他匪、部門編號和工資
-- 方法一
select c.ename,c.dno,(sal+IFNULL(c.comm,0))as '工資'
FROM
(select dno,avg(sal)as num FROM tb_emp GROUP BY dno) as t
,tb_emp as c
WHERE c.dno = t.dno and c.sal>t.num ORDER BY c.dno;
-- 方法二
select c.ename,c.dno,(sal+IFNULL(c.comm,0))as '工資'
FROM
(select dno,avg(sal)as num FROM tb_emp GROUP BY dno) as t
INNER JOIN tb_emp as c
ON c.dno = t.dno
where c.sal>t.num ORDER BY c.dno;
-- 查詢部門中薪水最高的人姓名巨柒、工資和所在部門名稱
select a.ename,(a.sal+IFNULL(a.comm,0))as '工資',b.dname
FROM
(select c.ename,c.sal,c.comm,c.dno
FROM
(select dno,max(sal)as Top FROM tb_emp GROUP BY dno) as t
INNER JOIN tb_emp as c
on c.dno = t.dno and c.sal=t.Top ORDER BY dno) as a
INNER JOIN tb_dept as b
on a.dno=b.dno
-- 1.2 外連接:
-- 在mysql中外連接支持左外連接 LEFT JOIN 和右外鏈接 RIGHT JOIN
-- 表1 left JOIN 表2:
-- 先將表1的紀錄全部取出來,按連接條件依次去連接表2的紀錄,
-- 表1中的記錄找不到條件滿足表2記錄時那么連接的內(nèi)容為空
=================
DCL 數(shù)據(jù)控制語言
-- DCL主要提供授權(quán)和召回授權(quán) 以及事務(wù)的相關(guān)功能
-- 1.用戶管理(root特權(quán))
1)創(chuàng)建用戶(root賬號登錄數(shù)據(jù)庫后才有創(chuàng)建用戶的權(quán)限)
--? ? ? create user '用戶名'@'登錄地址'; - 創(chuàng)建指定用戶,該用戶登錄不需要密碼
--? ? ? ? ? create user '用戶名'@'登錄地址' IDENTIFIED by '密碼';
-- 說明:用戶名 - 隨便命名;
--? ? ? ? ? ? ? 登錄地址 - ip地址/localhost(本機)/%(任意位置)
create user 'user1'@'localhost';
create user 'user2'@'%' identified by '123456';
2)刪除用戶
-- drop user 用戶名;
drop user user2;
-- 2.授權(quán)管理
1)授權(quán)
-- grant 權(quán)限類型 on 數(shù)據(jù)庫.表 to 用戶名;
-- 說明:
-- 權(quán)限類型:insert,delete,update,select,create,drop...., all PRIVILEGES(所有權(quán)限)
grant SELECT on school.tb_student to 'user1'@'localhost';
GRANT delete,update on school.tb_student to 'user1'@'localhost';
GRANT select on hrs.* to 'user1'@'localhost';
2)召回權(quán)限
-- revoke 權(quán)限類型 on 數(shù)據(jù)庫.表 from 用戶名;
revoke delete on school.tb_student from 'user1'@'localhost';
-- 3.事務(wù)
-- 如果完成一個任務(wù)需要多個操作,但是要求多個操作只要有一個失敗,
--? ? ? 那么任務(wù)被取消,讓數(shù)據(jù)回到任務(wù)開始前的狀態(tài);
-- 只有所有的操作都成功了,數(shù)據(jù)庫才更新,這個時候就要用事務(wù)控制
-- 語法:
BEGIN;
-- 操作語句1;
-- 操作語句2;
-- ...
commit;
rollback;
-- 4.視圖
-- 作用:是用來存儲一個sql查詢語句的結(jié)果.
-- 就相當于給這個查詢語句的結(jié)果創(chuàng)建一張臨時表,但是這張臨時表不占物理內(nèi)存
--
-- 創(chuàng)建視圖
-- create view 視圖名 as sql查詢語句;
use school;
create view vw_score_info as
select stuid,stuname,couid,couname,score FROM
tb_student,tb_record,tb_course
where tb_student.stuid=tb_record.stu_id and tb_record.cou_id=tb_course.couid;
-- 使用視圖
-- select * from 視圖名;
-- 查詢視圖和查詢表一樣
SELECT stuname,avg(score) from vw_score_info group by stuid;
-- 創(chuàng)建學生表的視圖:要求視圖中不能看到學生的生日,
-- 用學號 姓名 性別 地址和學院作為視圖中字段名
use school;
create VIEW vw_stu_info AS
select stuid as'學號',stuname as'姓名',if(stusex,'男','女')as'性別',stuaddr as'地址',
tb_college.collname as'學院'
from tb_student,tb_college
where tb_student.collid = tb_college.collid;
-- 5.索引
-- 記錄數(shù)據(jù)的位置,可以提高查詢的速度 (犧牲內(nèi)存換速度)
-- 一般給使用功率較高的字段添加索引 (主鍵自帶唯一索引)
-- 1.給指定字段添加普通索引
-- create index 索引名 on 表名(字段)?
-- 給指定字段添加唯一索引(字段值是唯一的時候才能添加唯一索引)
-- create unique index 索引名 on 表名(字段)?
use school;
-- EXPLAIN:獲取sql語句的執(zhí)行計劃(主要用于檢測sql語句的性能)
explain select * from tb_student where stuname='項少龍';
explain select * from tb_student where stuid=3755;
create index idx_stuname on tb_student(stuname);
-- 注意:模糊查詢的時候以% 和 _ 開頭索引無效
explain select * from tb_student where stuname like '%少龍';
explain select * from tb_student where stuname like '_少龍';
-- 2.刪除索引
alter table 表名 drop index 索引名;
========================================
第四章 redis-常用命令
==>環(huán)境準備
Linux安裝軟件:
包管理工具
? - yum CentOS
? ? ? ~ yum search nginx
? ? ? ~ yum install nginx
? ? ? ~ yum erase nginx / yum remove nginx
? ? ? ~ yum info nginx
? ? ? ~ yum list installed | grep nginx
? - rpm Redhat
? ? ? ~ rpm -ivh 下載的rpm包文件名
? ? ? ~ rpm -e
? ? ? ~ rpm -qa
? - apt Ubuntu
源代碼構(gòu)建安裝
安裝Redis官方最新版
? ? ~ wget http://download.redis.io/releases/redis-5.0.7.tar.gz
? ? ~ gunzip redis-5.0.7.tar.gz
? ? ~ tar -xvf redis-5.0.7.tar
? ? ~ cd redis-5.0.7
? ? ~ make && make install
安裝Git官方最新版
? ? ~ wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.24.1.tar.xz
? ? ~ xz -d git-2.24.1.tar.xz
? ? ~ tar -xf git-2.24.1.tar
? ? ~ cd git-2.24.1
? ? ~ yum install -y curl libcurl-devel
? ? ~ ./configure --prefix=/usr/local
? ? ~ make && make install
<==環(huán)境準備
lloogg.com ---> LAMP = Linux + Apache + MySQL + PHP
LNMP = Linux + Nginx + MySQL + PHP
Remote Dictionary Server ---> KV存儲系統(tǒng)
GitHub ---> 3.x ---> 5.x
緩存系統(tǒng)緩解關(guān)系型數(shù)據(jù)庫的訪問壓力
命令 & ---> 將命令放到后臺運行
jobs ---> 查看后臺運行的命令
fg %編號 ---> 將后臺命令放到前臺運行
Ctrl+z ---> 將前臺命令暫停并放到后臺
bg %編號 ---> 將暫停的命令在后臺運行
redis-cli -p 端口 -h 主機
> set username luohao ex 120 ---> 添加鍵值對
> get username ---> 通過鍵查找值
> ttl username ---> 查看鍵過期時間
> expire username 300 ---> 設(shè)置鍵過期時間
> keys * ---> 查看所有鍵
> dbsize ---> 查看數(shù)據(jù)庫大薪夭辍(鍵值對數(shù)量)
========================================
第五章 redis-核心數(shù)據(jù)類型
字符串
? ? set key value ---> 添加鍵值對
? ? get key ---> 通過鍵查看值
? ? strlen key ---> 獲取字符串長度
? ? append key value2 ---> 給字符串追加內(nèi)容
? ? mset key1 value1 key2 value2 ---> 添加多組鍵值對
? ? mget key1 key2 ---> 查看多個鍵對應(yīng)的值
? ? incr key ---> 值加1
? ? incrby key value ---> 值加上value
? ? decr key ---> 值減1
? ? decrby key value ---> 值減去value
? ? getrange key start end ---> 獲取字符串指定范圍的子串
? ? setrange key offset value ---> 修改字符串指定位置的內(nèi)容
哈希(表) - hash
? ? hset key field value ---> 添加hash類型鍵值對
? ? hmset key field1 value1 field2 value2 ---> 添加多組hash類型鍵值對
? ? hget key field ---> 獲取hash類型字段對應(yīng)的值
? ? hmget key field1 field2 ---> 獲取hash類型多個字段對應(yīng)的值
? ? hgetall key ---> 獲取hash類型所有的字段和對應(yīng)的值
? ? hkeys key ---> 獲取hash類型所有的字段
? ? hvals key ---> 獲取hash類型所有字段的值
? ? hexists key field ---> 判斷hash類型某個字段是否存在
列表 - list
? ? lpush key value1 value2 value3 ---> 在左邊添加元素
? ? rpush key value1 value2 value3 ---> 在右邊添加元素
? ? lpop key ---> 從左邊移除一個元素
? ? rpop key ---> 從右邊移除一個元素
? ? lrange key start end ---> 查看列表指定范圍的元素
? ? llen key ---> 查看列表元素個數(shù)
? ? lindex key index ---> 查看列表指定位置元素
? ? lrem key count value ---> 刪除列表中指定元素
集合 - set
? ? sadd key value1 value2 value3 ---> 添加元素
? ? srem key value ---> 刪除元素
? ? spop ---> 獲取隨機元素
? ? scard key ---> 查看元素個數(shù)
? ? smembers key ---> 查看所有元素
? ? sismember key value ---> 查看集合中有沒有指定元素
? ? sinter key1 key2 ---> 交集
? ? sunion key1 key2 ---> 并集
? ? sdiff key1 key2 ---> 差集
有序集合 - zset
? ? zadd key score1 mem1 score2 mem2 ---> 添加元素
? ? zrem key mem ---> 刪除元素
? ? zrange key start end ---> 按score的升序查看元素
? ? zrevrange key start end ---> 按score的降序查看元素
? ? zscore key mem ---> 查看元素對應(yīng)的score
? ? zincrby key value mem ---> 修改元素的score值
Linux系統(tǒng)啟停服務(wù)
? ? ~ 啟動:systemctl start nginx
? ? ? ? ? ? service nginx start
? ? ~ 停止:systemctl stop nginx
? ? ? ? ? ? service nginx stop
? ? ~ 重啟:systemctl restart nginx
? ? ~ 查看狀態(tài):systemctl status nginx
? ? ~ 開機自啟:systemctl enable nginx
? ? ~ 禁用自啟:systemctl disable nginx
========================================
第六章 pymysql的使用
import pymysql
1.和mysql建立連接
連接對象 = pymysql.connect(host,port,user,password)
-- 和指定mysql建立連接并且返回一個連接對象
-- 說明:
host - mysql主機地址(localhost表示當前設(shè)備上的mysql, 服務(wù)器公網(wǎng)ip)
port - mysql服務(wù)端口吠式, 3306
user - mysql用戶
password - 用戶對應(yīng)的密碼(如果創(chuàng)建用戶的時候沒有設(shè)置密碼奏窑,這個參數(shù)可以不用賦值)
database - 建立連接后默認操作的數(shù)據(jù)庫
charset - 設(shè)置連接的數(shù)據(jù)庫文件的編碼方式
autocommit - 是否自動提交
con = pymysql.connect(
? ? ? ? host='localhost',
? ? ? ? port=3306,
? ? ? ? user='root',
? ? ? ? password='yuting123456',
? ? ? ? database='school',
? ? ? ? charset='utf8',
? ? ? ? autocommit=True
)
2.通過連接獲取游標對象
with 連接對象.cursor(查詢返回值類型=None) as 游標對象:
數(shù)據(jù)庫操作上下文
說明:
查詢返回值類型 - None: 查詢結(jié)果以元組的形式返回;
pymysql.cursors.DictCursor: 查詢結(jié)果以字典的形式返回
數(shù)據(jù)庫操作上下文 - 游標對象(數(shù)據(jù)庫操作)只有在數(shù)據(jù)庫操作上下文才有效
3.執(zhí)行sql語句: 游標對象.execute(sql語句)
with con.cursor() as cursor:
? # 數(shù)據(jù)庫操作上下文
? cursor.execute('create database if not exists pyschool;')
關(guān)閉連接
con.close()
========================================
第七章 pymysql-數(shù)據(jù)庫基本操作
import pymysql
def query_table(connect):
? ? # 注意: 執(zhí)行查詢的sql語句,查詢結(jié)果保存在游標對象中的
? ? # 游標對象.fetchall()
? ? sql_str = 'select * from tb_student;'
? ? with connect.cursor(pymysql.cursors.DictCursor) as cursor:
? ? ? ? result = cursor.execute(sql_str)
? ? ? ? print(result, cursor)
? ? ? ? # 注意: cursor中的查詢結(jié)果扭粱,取一個就少一個
? ? ? ? # 1. 游標對象.fetchall() - 獲取當前查詢的所有的結(jié)果
? ? ? ? # all_result = cursor.fetchall()
? ? ? ? # print('查詢結(jié)果的個數(shù):', len(all_result))
? ? ? ? # for dic in all_result:
? ? ? ? #? ? print(dic['stuname'])
? ? ? ? #
? ? ? ? # all_result2 = cursor.fetchall()
? ? ? ? # print(all_result2)
? ? ? ? # 2. 游標對象.fetchone()? - 獲取當前查詢中一條數(shù)據(jù)
? ? ? ? print(cursor.fetchone())
? ? ? ? print(cursor.fetchone())
? ? ? ? # 3. 游標對象.fetchmany(size)? -- 獲取當前查詢中指定條數(shù)的數(shù)據(jù)
? ? ? ? print(cursor.fetchmany(2))
def operate_table(connect):
? ? """增刪改"""
? ? # 1.增
? ? # sql_str = '''
? ? #? ? insert into tb_student
? ? #? ? (stuname, stusex, stuage, setutel)
? ? #? ? values
? ? #? ? ('張三', 1, 30, '17823736452'),
? ? #? ? ('stu1', 0, 28, '16728729739');
? ? # '''
? ? print('=========插入學生==========')
? ? sql_str = 'insert into tb_student (stuname, stusex, stuage, setutel) values %s;'
? ? str2 = ''
? ? while True:
? ? ? ? name = input('請輸入名字:')
? ? ? ? sex = int(input('請輸入性別(0/1):'))
? ? ? ? age = int(input('請輸入年齡:'))
? ? ? ? tel = input('請輸入電話號碼:')
? ? ? ? value = input('是否繼續(xù)添加(y/n):')
? ? ? ? str2 += "('%s', %d, %d, '%s')," % (name, sex, age, tel)
? ? ? ? if value == 'n':
? ? ? ? ? ? print(str2[:-1])
? ? ? ? ? ? sql_str = sql_str % str2[:-1]
? ? ? ? ? ? print(sql_str)
? ? ? ? ? ? break
? ? with connect.cursor() as cursor:
? ? ? ? cursor.execute(sql_str)
def create_table(connect):
? ? """創(chuàng)建表"""
? ? with connect.cursor() as cursor:
? ? ? ? # 1.=========創(chuàng)建學生表=========
? ? ? ? try:
? ? ? ? ? ? sql_str = '''
? ? ? ? ? ? create table tb_student
? ? ? ? ? ? (
? ? ? ? ? ? ? ? stuid int auto_increment,
? ? ? ? ? ? ? ? stuname varchar(10) not null,
? ? ? ? ? ? ? ? stuage int,
? ? ? ? ? ? ? ? stusex bit default 1,
? ? ? ? ? ? ? ? setutel varchar(11),
? ? ? ? ? ? ? ? primary key (stuid)
? ? ? ? ? ? );
? ? ? ? ? ? '''
? ? ? ? ? ? cursor.execute(sql_str)
? ? ? ? except:
? ? ? ? ? ? pass
? ? ? ? # 自定制表
? ? ? ? # table_name = input('表名:')
? ? ? ? # pre = table_name[:3]
? ? ? ? # cnames = []
? ? ? ? # while True:
? ? ? ? #? ? cname = input('請輸入字段名(q-退出):')
? ? ? ? #? ? if cname == 'q':
? ? ? ? #? ? ? ? break
? ? ? ? #? ? cnames.append(pre+cname+' text,')
? ? ? ? #
? ? ? ? # str1 = '''
? ? ? ? #? ? create table if not exists tb_%s
? ? ? ? #? ? (
? ? ? ? #? ? ? ? %sid int auto_increment,
? ? ? ? #? ? ? ? %s
? ? ? ? #? ? ? ? primary key (%sid)
? ? ? ? #? ? );
? ? ? ? # '''
? ? ? ? #
? ? ? ? # sql_str = str1 % (
? ? ? ? #? ? table_name,
? ? ? ? #? ? table_name[:3],
? ? ? ? #? ? ' '.join(cnames),
? ? ? ? #? ? table_name[: 3]
? ? ? ? # )
? ? ? ? # print(sql_str)
? ? ? ? # cursor.execute(sql_str)
def main():
# 1.建立連接
? ? con = pymysql.connect(
? ? ? ? ? ? host='localhost',
? ? ? ? ? ? user='root',
? ? ? ? ? ? password='yuting123456',
? ? ? ? ? ? port=3306,
? ? ? ? ? ? charset='utf8',
? ? ? ? ? ? autocommit=True
? ? )
# 2.切換數(shù)據(jù)庫
? ? with con.cursor() as cursor:
? ? ? ? cursor.execute('use pyschool;')
# 3.創(chuàng)建表
? ? create_table(con)
# 4.操作表
? ? operate_table(con)
# 5.查詢數(shù)據(jù)
? ? query_table(con)
if __name__ == '__main__':
? ? main()