• 三十七、python操作mysql,和navicat


    一、多表操作练习

      题材:

    /*
     数据导入:
     Navicat Premium Data Transfer
    
     Source Server         : localhost
     Source Server Type    : MySQL
     Source Server Version : 50624
     Source Host           : localhost
     Source Database       : sqlexam
    
     Target Server Type    : MySQL
     Target Server Version : 50624
     File Encoding         : utf-8
    
     Date: 10/21/2016 06:46:46 AM
    */
    
    SET NAMES utf8;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    --  Table structure for `class`
    -- ----------------------------
    DROP TABLE IF EXISTS `class`;
    CREATE TABLE `class` (
      `cid` int(11) NOT NULL AUTO_INCREMENT,
      `caption` varchar(32) NOT NULL,
      PRIMARY KEY (`cid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `class`
    -- ----------------------------
    BEGIN;
    INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');
    COMMIT;
    
    -- ----------------------------
    --  Table structure for `course`
    -- ----------------------------
    DROP TABLE IF EXISTS `course`;
    CREATE TABLE `course` (
      `cid` int(11) NOT NULL AUTO_INCREMENT,
      `cname` varchar(32) NOT NULL,
      `teacher_id` int(11) NOT NULL,
      PRIMARY KEY (`cid`),
      KEY `fk_course_teacher` (`teacher_id`),
      CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `course`
    -- ----------------------------
    BEGIN;
    INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');
    COMMIT;
    
    -- ----------------------------
    --  Table structure for `score`
    -- ----------------------------
    DROP TABLE IF EXISTS `score`;
    CREATE TABLE `score` (
      `sid` int(11) NOT NULL AUTO_INCREMENT,
      `student_id` int(11) NOT NULL,
      `course_id` int(11) NOT NULL,
      `num` int(11) NOT NULL,
      PRIMARY KEY (`sid`),
      KEY `fk_score_student` (`student_id`),
      KEY `fk_score_course` (`course_id`),
      CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
      CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `score`
    -- ----------------------------
    BEGIN;
    INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');
    COMMIT;
    
    -- ----------------------------
    --  Table structure for `student`
    -- ----------------------------
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student` (
      `sid` int(11) NOT NULL AUTO_INCREMENT,
      `gender` char(1) NOT NULL,
      `class_id` int(11) NOT NULL,
      `sname` varchar(32) NOT NULL,
      PRIMARY KEY (`sid`),
      KEY `fk_class` (`class_id`),
      CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `student`
    -- ----------------------------
    BEGIN;
    INSERT INTO `student` VALUES ('1', '', '1', '理解'), ('2', '', '1', '钢蛋'), ('3', '', '1', '张三'), ('4', '', '1', '张一'), ('5', '', '1', '张二'), ('6', '', '1', '张四'), ('7', '', '2', '铁锤'), ('8', '', '2', '李三'), ('9', '', '2', '李一'), ('10', '', '2', '李二'), ('11', '', '2', '李四'), ('12', '', '3', '如花'), ('13', '', '3', '刘三'), ('14', '', '3', '刘一'), ('15', '', '3', '刘二'), ('16', '', '3', '刘四');
    COMMIT;
    
    -- ----------------------------
    --  Table structure for `teacher`
    -- ----------------------------
    DROP TABLE IF EXISTS `teacher`;
    CREATE TABLE `teacher` (
      `tid` int(11) NOT NULL AUTO_INCREMENT,
      `tname` varchar(32) NOT NULL,
      PRIMARY KEY (`tid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `teacher`
    -- ----------------------------
    BEGIN;
    INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师');
    COMMIT;
    
    SET FOREIGN_KEY_CHECKS = 1;
    View Code

    题目:

    1、查询所有的课程的名称以及对应的任课老师姓名
        select course.cname,teacher.tname from course inner join teacher
        on course.teacher_id = teacher.tid;
    
    2、查询平均成绩大于八十分的同学的姓名和平均成绩
        select student.sname,t1.avg_num from student inner join (select student_id,avg(num) AS avg_num
        from score group by student_id having avg(num) > 80) as t1 on student.sid = t1.student_id;
    
    3、 查询没有报李平老师课的学生姓名
        select student.sname from student where sid not in (select distinct student_id from score where course_id IN
        (select course.cid from course inner join teacher on course.teacher_id = teacher.tid where teacher.tname = '李平老师'));
    
    4、 查询没有同时选修物理课程和体育课程的学生姓名
        select student.sname from student where sid in (select student_id from score where course_id in (select cid from course
        where cname = '物理' or cname = '体育') group by student_id having count(course_id) = 1 );
    
    5、 查询挂科超过两门(包括两门)的学生姓名和班级
        select student.sname,class.caption from class inner join student
        on class.cid = student.class_id
        where student.sid in
        (select student_id from score where num < 60
        group by student_id
        having count(course_id) >=2);

    二、python操作数据库

    import pymysql
    
    conn = pymysql.connect(
        host="127.0.0.1",
        port=3306,
        user="root",
        password="123456",
        database="day41",
        charset="utf8"
    )
    
    cursor = conn.cursor(pymysql.cursors.DictCursor)  # 将查询结果做成字典格式
    res = cursor.execute('select * from class')  # 查询里面多少条数据
    print(res)
    print(cursor.fetchone())  # 获取一条查询结果
    print(cursor.fetchone())  # 获取一条查询结果
    # cursor.scroll(1, "absolute")  # 绝对移动,光标往后移动一位(参照物是开始位置)
    cursor.scroll(1, "relative")  # 相对移动,在当前位置往后移动一位
    print(cursor.fetchall())  # 获取所有数据

    三、校验用户名和密码

    import pymysql
    
    conn = pymysql.connect(
        host="127.0.0.1",
        port=3306,
        user="root",
        password="123456",
        database="day41",
        charset="utf8",
        # autocommit = True  # 修改数据的最终版本,就不用在下面加上  conn.commit()
    )
    
    cursor = conn.cursor(pymysql.cursors.DictCursor)  # 将查询结果做成字典格式
    username = input("username>>>>>>:")
    password = input("password>>>>>:")
    # sql ="insert into userinfo(name,password) values(%s,%s)"   # 增
    # sql = "update userinfo set name ='jsonhs' where id =1"    # 改
    sql = "select * from userinfo where name=%s and password =%s"
    res = cursor.execute(sql, (username, password))  # 传个可迭代对象
    print(res)
    conn.commit()  # 确认数据无误之后,commit之后才会将数据真正修改到数据库,一般用于对数据库的修改比如(改,增,删)
    if res:
        print(cursor.fetchall())
    else:
        print("用户名密码错误")
    
    SQL注入
    """
    千万不要手动拼接关键参数查询条件 
    """
    
    #
    # import pymysql
    #
    # conn = pymysql.connect(
    #     host="127.0.0.1",
    #     port=3306,
    #     user="root",
    #     password="123456",
    #     database="day41",
    #     charset="utf8",
    #     autocommit=True
    # )
    # cursor =conn.cursor(pymysql.cursors.DictCursor)
    # username = input("username>>>>>>:")
    # password = input("password>>>>>:")
    # sql ="select * from userinfo where name=%s and password =%s"
    # res =cursor.execute(sql,(username,password))
    # print(res)
    # if res:
    #     print(cursor.fetchall())
    # else:
    #     print("用户名密码错误")
  • 相关阅读:
    C#循环页面form中控件
    鼠标放到按钮上页面样式发生变化
    access INSERT INTO 语句的语法错误
    更改水晶报表数据源
    C# byte[]与string互转
    禁用右键
    showModalDialog IE9 报错
    ListBox 循环删除当前项
    showModalDialog 刷新本页面,不重新发送信息,则无法刷新网页,Page_PreRender
    敏捷模式开发(转)
  • 原文地址:https://www.cnblogs.com/wukai66/p/11395038.html
Copyright © 2020-2023  润新知