pymysql模块的数据操做

数据的简单查询操做:mysql

 1 import pymysql  2 username=input("请输入用户名:")  3 pwd=input("请输入密码:")  4 
 5 conn=pymysql.connect(host="localhost",user="kevin",password='12121',database="around") #建立链接
 6 cursor=conn.cursor()  #建立一个游标对象
 7 sql="select * from userinfo where user=%s AND psd=%s"
 8 r=cursor.execute(sql,[username,pwd])   #受影响的行数
 9 print(r) 10 ret=cursor.fetchone()      #查询到的结果
11 print(ret) 12 
13 cursor.close()   #关闭游标
14 conn.close() 

添加数据操做:sql

 1 import pymysql  2 conn=pymysql.connect(host="localhost",user="kevin",password="12121",database='around')  3 cursor=conn.cursor()  4 sql="insert into userinfo(user,psd) VALUES (%s,%s)"
 5 r=cursor.executemany(sql,[('jack','1234'),('lisa','12138'),('time','11594')]) #插入多行记录时必须用executemany  6 conn.commit()  7 print(r)  8 
 9 cursor.close() 10 conn.close()

 建立视图:(不推荐使用)数据库

1 CREATE VIEW cont AS
2 SELECT s.uid 编号,s.uname 用户名,s.psd 密码,s.powid 权限号,power.cate 权限 FROM 
3     (SELECT * FROM userinfo INNER JOIN control ON userinfo.uid=control.userid)AS s INNER JOIN power
4     ON power.pid=s.powid

触发器的建立:函数

1     USE around; 2     delimiter //    -- 触发器
3     CREATE TRIGGER t1 BEFORE INSERT ON userinfo FOR EACH ROW   -- 在执行userinfo插入一条数据后会被执行
4     BEGIN
5     INSERT INTO student(sname)VALUES(NEW.user); 6     END //
7  delimiter ; 8     
9     INSERT INTO userinfo (user,psd)VALUES('abc','admin');

>>>>>>>>>>>>>>>>>>>>>>>>>>>>由于SQL语句默认识别分号为结束标志,因此触发器在建立时必须修改默认标志,建立完成以后再改回原样fetch

存储过程的实现:ui

MySQL端代码块:spa

 1 delimiter //
 2     CREATE PROCEDURE p1 (IN t1 INT,OUT t2 INT )  3     BEGIN
 4        SET t2=12121;  5      SELECT * FROM student WHERE sid > t1;  6          INSERT INTO teacher (tname)VALUES('小芬');  7   END //
 8  delimiter ;  9     
10     SET @v=0; 11     call p1(10,@v); 12     SELECT @v;

pycharm端代码块:code

 1 import pymysql  2 
 3 conn=pymysql.connect(host='localhost',user='kevin',password='12121',database='around',charset='utf8')  4 cursor=conn.cursor()  5 cursor.callproc('p1',(10,123))  6 conn.commit()  7 ret=cursor.fetchall()  8 print(ret)  9 
10 cursor.execute('select @_p1_0,@_p1_1') 11 r=cursor.fetchall() 12 print(r) 13 
14 cursor.close() 15 conn.close()

用存储过程实现把A表的数据id和num求和插入B表:对象

建立的A表和B表:blog

 

1     CREATE TABLE A(id INT PRIMARY KEY auto_increment, 2     number INT); 3 
4     CREATE TABLE B(bid INT PRIMARY KEY auto_increment, 5     num INT);

 

MySQL代码块:

 1     delimiter //
 2     CREATE PROCEDURE pre()  3     BEGIN
 4     DECLARE row_id INT;           -- 自定义变量
 5     DECLARE row_num INT;   -- 自定义变量
 6     DECLARE done INT DEFAULT FALSE;      -- done 默认为false
 7     DECLARE temp int;  8     
 9     DECLARE my_cursor CURSOR FOR SELECT id,number FROM A;  -- 定义一个游标去取值
10     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;  -- 若是为true 则游标数据为空
11     
12     OPEN my_cursor; 13  xxx: LOOP 14                     FETCH my_cursor INTO row_id,row_num;    -- 获取的值传给变量
15                     IF done THEN
16  LEAVE xxx; 17                     END IF; 18                     SET temp=row_id+row_num; 19                     INSERT INTO B (num)VALUES(temp); 20           END LOOP xxx; 21     END //
22     delimiter ;

 >>>>>>>>>>>>>>>>>>>>>>>>>>>

数据库 动态防SQL注入:

1     delimiter //
2     CREATE PROCEDURE proce( IN nid INT) 3     BEGIN
4      SET @nid=nid; 5          PREPARE prod FROM 'select * FROM student WHERE sid > ?'; 6          EXECUTE prod USING @nid; 7          DEALLOCATE PREPARE prod; 8     END  //
9     delimiter  ;

建立索引:

1  -- 索引的建立
2 CREATE INDEX ix_name ON student(sname); 3  -- 索引的删除
4 DROP INDEX ix_name ON student; 5 索引种类(某种格式存储):hash索引: 单值快 6 btree索引: btree索引二叉树  适合范围查询

 索引的命中:

 1 - like '%xx'
 2                 select * from tb1 where email like '%cn';  3                 
 4                 
 5             - 使用函数  6                 select * from tb1 where reverse(email) = 'wupeiqi';  7                 
 8                 
 9             - or
10                 select * from tb1 where nid = 1 or name = 'seven@live.com'; 11                 
12                 
13  特别的:当or条件中有未创建索引的列才失效,如下会走索引 14                         select * from tb1 where nid = 1 or name = 'seven'; 15                         select * from tb1 where nid = 1 or name = 'seven@live.com' and email = 'alex'
16                         
17                         
18             - 类型不一致 19  若是列是字符串类型,传入条件是必须用引号引发来,否则... 20                 select * from tb1 where email = 999; 21                 
22                 
23             - !=
24                 select * from tb1 where email != 'alex'
25                 
26  特别的:若是是主键,则仍是会走索引 27                     select * from tb1 where nid != 123
28             - >
29                 select * from tb1 where email > 'alex'
30                 
31                 
32  特别的:若是是主键或索引是整数类型,则仍是会走索引 33                     select * from tb1 where nid > 123
34                     select * from tb1 where num > 123
35                     
36                     
37             - order by
38                 select name from tb1 order by email desc; 39                 
40  当根据索引排序时候,选择的映射若是不是索引,则不走索引 41  特别的:若是对主键排序,则仍是走索引: 42                     select * from tb1 order by nid desc; 43              
44             - 组合索引最左前缀 45  若是组合索引为:(name,email) 46                 name and email       -- 使用索引
47                 name                 -- 使用索引
48                 email                -- 不使用索引

 注意事项:

1 避免使用select  *  来直接查询

2.用count(1)或者count(列)代替count(*)

3.表的固定长度字段优先

4.建立表时尽可能使用char代替varchar

5.组合索引替代多个单列索引

6.尽可能使用短索引

7.使用join链接来代替子查询

8.连表是注意条件类型一致

9.重复或者少值散列的列不适合创建索引 好比性别

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>执行计划:让mysql预估执行操做(通常正确) explain

 2    执行效率:慢--->快    all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
 3             id,email
 4             
 5             慢:
 6                 select * from userinfo3 where name='alex'
 7                 
 8                 explain select * from userinfo3 where name='alex'
 9                 type: ALL(全表扫描)
10                     select * from userinfo3 limit 1;
11             快:
12                 explain select * from userinfo3 where email='alex'
13                 type: const(走索引)

 分页操做:

 1 ******分页*******
 2         
 3         a. select * from userinfo3 limit 20,10;  4  b.  5             - 不让看  6             - 索引表中扫:  7                 select * from userinfo3 where id in(select id from userinfo3 limit 200000,10)  8             - 方案:  9  记录当前页最大或最小ID 10                 1. 页面只有上一页,下一页 11  # max_id 12  # min_id 13  下一页: 14                         select * from userinfo3 where id > max_id limit 10; 15  上一页: 16                         select * from userinfo3 where id < min_id order by id desc limit 10; 17                 2. 上一页 192 193  [196]  197  198  199 下一页 18                     
19                     select * from userinfo3 where id in ( 20                         select id from (select id from userinfo3 where id > max_id limit 30) as N order by N.id desc limit 10
21                     )
相关文章
相关标签/搜索