三十七、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("用户名密码错误")

 

posted @ 2019-08-22 16:19  凯帅  阅读(918)  评论(0编辑  收藏  举报