zoukankan      html  css  js  c++  java
  • 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
Copyright © 2011-2022 走看看