Mysql

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()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糕簿,一起剝皮案震驚了整個濱河市探入,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌懂诗,老刑警劉巖蜂嗽,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殃恒,居然都是意外死亡徒爹,警方通過查閱死者的電腦和手機荚醒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隆嗅,“玉大人界阁,你說我怎么就攤上這事∨衷” “怎么了泡躯?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丽焊。 經(jīng)常有香客問我较剃,道長,這世上最難降的妖魔是什么技健? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任写穴,我火速辦了婚禮,結(jié)果婚禮上雌贱,老公的妹妹穿的比我還像新娘啊送。我一直安慰自己,他們只是感情好欣孤,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布馋没。 她就那樣靜靜地躺著,像睡著了一般降传。 火紅的嫁衣襯著肌膚如雪篷朵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天婆排,我揣著相機與錄音声旺,去河邊找鬼。 笑死段只,一個胖子當著我的面吹牛艾少,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翼悴,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幔妨!你這毒婦竟也來了鹦赎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤误堡,失蹤者是張志新(化名)和其女友劉穎古话,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锁施,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡陪踩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年杖们,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩狂。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡摘完,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傻谁,到底是詐尸還是另有隱情孝治,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布审磁,位于F島的核電站谈飒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杭措。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一钾恢、第九天 我趴在偏房一處隱蔽的房頂上張望手素。 院中可真熱鬧,春花似錦赘那、人聲如沸刑桑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祠斧。三九已至,卻和暖如春拱礁,著一層夾襖步出監(jiān)牢的瞬間琢锋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工呢灶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吴超,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓鸯乃,卻偏偏與公主長得像鲸阻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缨睡,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 花了3天時間學習MySql鸟悴,考了個二級MySql 書籍參考:高等教育出版社《全國計算機等級考試二級教程-MySQL...
    如果仲有聽日閱讀 1,264評論 4 4
  • mysql 數(shù)據(jù)庫 使用系統(tǒng):ubuntu 18.04 LTS 安裝mysql 基本使用 登陸 : mysql ...
    simbanyan閱讀 485評論 0 0
  • 基礎(chǔ)知識: 1.數(shù)據(jù)庫的連接mysql -u -p -h-u 用戶名-p 密碼-h host主機 2:庫級知識2....
    網(wǎng)絡(luò)安全自修室閱讀 1,455評論 0 1
  • MySQL語句大全(超詳細) 1、說明:創(chuàng)建數(shù)據(jù)庫 CREATE DATABASE database-name 2...
    Ncompass閱讀 295評論 0 1
  • 我該怎么用最平常的語氣告訴你我想 你
    癡音病人閱讀 124評論 0 0