14.mysql+mysqlconnector

一、多表查询
多表连接分为内连接和外连接
内连接:通过条件查找两个表中与之匹配的记录 select * from 表1 inner join 表2 on 关联条件
1)连接的难点:
找准关联条件
一般表1.主键=表2.外键
内连接两种表示方式:

1)inner join...on...
select * from emp inner JOIN dept on emp.deptno=dept.deptno;

2)表之间,连接
select * from emp,dept where emp.deptno=dept.deptno;

3)join on
select * from emp JOIN dept on emp.deptno=dept.deptno;
2)自连接

自己连接自己

-- 查询每门课程的先修课名称

select a.cno '选修课编号',a.cname '选修课名称',a.cpno '先修课编号' ,b.cname as '先修课名称',b.cno
from course_01 a,course_01 b
where a.cpno=b.cno;

2)外连接分为左连接和右连接

左连接 left join...on 以左表为准,左表的数据全有,通过关联条件跟右表去匹配,有与之匹配的记录就显示,否则显示为null


select * from emp left JOIN dept on emp.deptno=dept.deptno;


3)右连接 right join..on... 以右表为准,右表的数据全有,通过关联条件跟左表去匹配,有与之匹配的记录就显示,否则显示为null

select * from emp RIGHT JOIN dept on emp.deptno=dept.deptno;



二、存储过程
1)什么是存储过程
为了完成某个特定功能对应的sql语句集
2)存储过程语法
create procedure 存储过程名称(in/out/inout 参数名 参数类型,.....)
begin
存储过程体语句
end
3)如何来调用存储过程
call 存储过程名(参数值)

实例:
-- 查询学生的人数
delimiter //
drop PROCEDURE if exists get_studentcounts;
create PROCEDURE get_studentcounts(out counts int)
BEGIN
select count(*) into counts from student;
end//


-- 调用存储过程
call get_studentcounts(@num);
select @num;

4)删除存储过程
drop procedure if exists 存储过程名;

5)delimiter 自定义分隔符 因为默认分隔符是; 避免会把存储过程当作sql语句来执行,一般另外定义分隔符

6)存储过程参数类型

1)传出参数存储过程
create procedure 存储过程名称(out 参数名 参数类型,.....)
begin
存储过程体语句
end
实例:
delimiter //
drop PROCEDURE if exists get_studentcounts;
create PROCEDURE get_studentcounts(out counts int)
BEGIN
select count(*) into counts from student;
end//


-- 调用存储过程
call get_studentcounts(@num);
select @num;
2)传入参数存储过程
1)语法:
create procedure 存储过程名称(in 参数名 参数类型,.....)
begin
存储过程体语句
end
2)实例

-- 输入学员的名称,查询学员编号

delimiter //
drop PROCEDURE if exists get_studentsid;
create PROCEDURE get_studentsid(in stuname varchar(20),out studtid int)
BEGIN
select sid into studtid from student where sname=stuname;
end //

-- 调用
call get_studentsid('tifa',@studtid);
select @studtid

3)传入传出参数存储过程

1)语法:
create procedure 存储过程名称(inout 参数名 参数类型,.....)
begin
存储过程体语句
end
2)实现一个数进行翻倍运算

delimiter //
drop PROCEDURE if exists p_yunsuan;
create procedure p_yunsuan(inout numbers int)
BEGIN
set numbers=numbers*2;
end//

-- 调用
set @numbers=10;
call p_yunsuan(@numbers);
select @numbers;

三、mysql-connector
1)什么是mysql-connector
mysql-connector 来连接使用 MySQL, mysql-connector 是 MySQL 官方提供的驱动器。

2)安装
在dos命令窗口:python -m pip install mysql-connector
如何验证是否安装成功,在python文件中输入import mysql.connector 执行不会报错,那么就是mysql-connector安装成功

导入pycharm mysql-connector-python

3)mysql-connector如何使用

1)连接数据库
使用mysql.connector模块的connect函数。 Connect接收参数为user, password, host,port=3306及database,返回一个连接对象
比如:
conn=mysql.connector.connect(
host='localhost',
user='root',
password='admin',
database='test'
)
print(conn)

2)执行命令
执行sql命令,首先先需要调用cursor(),相当于光标行,再执行execute()方法来执行sql语句
注意:结果集也是保存在光标行中


conn=mysql.connector.connect(
host='localhost',
user='root',
password='admin'
)
print(conn)
cmd=conn.cursor() #光标行
cmd.execute('create database testcode')
cmd.execute('show databases')
for x in cmd:
print(x)



3)select语句查询
查询结果的几个方法:
1)fetchall()获取所有结果集记录,返回元组列表,元素就是一行记录
2)fetchone()获取结果集中的第一行,每执行一次就指向下一行
3)fetchmany(num)获取结果集中的num行记录

conn=mysql.connector.connect(
host='localhost',
user='root',
password='admin',
database='test'
)
# print(conn)
cmd=conn.cursor() #光标行
cmd.execute("select * from student ")
# res=cmd.fetchall() #fetchall()获取所有结果集记录,返回元组列表,元素就是一行记录
# print(cmd.fetchone())
# print(cmd.fetchone()) #获取结果集中的第一行,每执行一次就指向下一行
print(cmd.fetchmany(3)) #获取结果集中的num行记录
# print(res)

4)使用预处理格式 %s
execute()方法有三个参数
第一个参数sql语句
第二个参数sql语句占位符对应参数,是元组类型 ,当只有一个占位符,一定注意加上逗号
第三个参数,判断第一个参数是否是多sql语句,如果是True否则为False

conn=mysql.connector.connect(
host='localhost',
user='root',
password='admin',
database='test'
)
# print(conn)
cmd=conn.cursor() #光标行
# ssql='select * from student where sname=%s and sid=%s'
# sval=('tifa',2)

ssql='select * from student where sname=%s '
sval=('tifa',) #execute()方法第二个参数是元组类型,sql语句格式占位符对应参数,当只有一个占位符,一定注意加上逗号
cmd.execute(ssql,sval)
res=cmd.fetchall() #fetchall()获取所有结果集记录,返回元组列表,元素就是一行记录
# print(cmd.fetchone())
# print(cmd.fetchone()) #获取结果集中的第一行,每执行一次就指向下一行
# print(cmd.fetchmany(3)) #获取结果集中的num行记录
print(res)

5)批量插入使用 executemany() 方法,该方法的第二个参数是一个元组列表,第一个参数是sql语句
commit()对数据进行更新(插入、删除、修改),一定用到这个方法,否则数据没有做更新。

conn=mysql.connector.connect(
host='localhost',
user='root',
password='admin',
database='test'
)
# print(conn)
cmd=conn.cursor() #光标行
# ssql='select * from student where sname=%s and sid=%s'
# sval=('tifa',2)

ssql='insert into student(sid,sname)values(%s,%s)'
sval=[(10,'susu'),(11,'待招恶徒'),(12,'不必追')]
cmd.executemany(ssql,sval) #批量+插入记录
conn.commit() #对数据进行更新(插入、删除、更新)的话,必须用到这个方法,才会把更新的数据更新到数据库
print(cmd.rowcount,'条记录插入成功') #对数据更新(插入、删除、修改)返回影响行数
cmd.execute('select * from student')
print(cmd.fetchall())


四、pymysql

1)什么是pymysql
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb

2)安装
pip install PyMySQL

3)它的操作跟mysql-connector操作一样的噢

import pymysql


# conn=pymysql.connect('localhost','root','admin','test') # 连接数据库
# # print(conn)
# cmd=conn.cursor() #光标行
# cmd.execute('select * from student') #执行sql语句
# print(cmd.fetchall()) #获取结果集记录
# conn.close() #关闭连接

#创建表testcode(sid ,sname,age)
conn=pymysql.connect('localhost','root','admin','test')
cmd=conn.cursor()
cmd.execute('drop table if exists testcode')
ssql='''
create table testcode(sid int primary key auto_increment,
sname varchar(20),
age int)
'''
cmd.execute(ssql)











原文地址:https://www.cnblogs.com/Murraya/p/14020890.html