Navicat的使用与python中使用MySQL的基本方法
作者:互联网
Navicat的使用与python中使用MySQL的基本方法
Navicat的下载及安装
- 下载地址 http://www.navicat.com.cn/download/navicat-premium
- 由于navict的功能非常强大所以navicat是收费的,我们下载并使用的话是需要收取费用的,但是我们可以先试着适用他的14天体验一下感觉
- 但是我们作为程序员的话,可以稍微修改一点东西让他试用实践较长一点
- 链接:https://pan.baidu.com/s/1aIKFM8oUpcTJX8cw3mVTsQ?pwd=e5y5 提取码:e5y5
- 我们可以通过这个注册机将navicat变成试用实践长一点
- 通过注册机获得注册码然后试用一下
Navicat的基本使用
-
连接
- 我们使用navicat必须先和自己的mysql数据库建立连接然后才能使用,点击连接选择mysql
- 然后连接名个人使用的时候不需要填,主机的话我们如果在公司的话那么我们会使用公司的主机码,如果个人的话,不动即可
- 端口我们mysql默认的端口就是3306这个不需要修改
- 用户名和密码填上我们默认的root或者自己设置的用户名和密码即可
- 点击测试连接,连接成功后确定那么我们就和自己的mysql连接成功
-
查看数据库
- 双击自己的连接即可,我们就可以看到我们之前创建或者系统自带的一些数据库
- 注意:有一个数据库information_schema是一个基于内存创建的数据库,所以我们在文件夹中是看不到他的实体的但是我们在mysql中是可以使用到他的
- 接下来进入表进入数据库等几乎不需要我们使用mysql代码来进入直接双击然后选择就可以进行操作,但是我们不能太过依赖这种方式,一定要把mysql的操作练的炉火纯青的时候才可以放心去使用
-
导入数据库
- 我们如果有别的数据库文件导入本数据库的话那么我们可以点击我们的数据库右键选择运行数据库选择文件运行即可,但是巡行的时候记得选择utf-8
-
查看数据库之间各表的关系
- 右键点击我们的数据库,选择逆向数据库到模型,那么我们就可以查看到各个数据库之间的关系
- 我们可以在这个内部来查看各数据库之间的关系然后来梳理关系,帮助我们编写代码
-
注释
-
-- 注释,可以使用快捷键ctrl+?
-
*‘ #’ 注释 常用的注释只有井号前面后面那个是为了防止markdown语法
-
/**/ 注释
-
实验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;
navicat的实操
1、查询所有的课程的名称以及对应的任课老师姓名
-- 首先查看老师列表和课程列表
-- select * from teacher;
-- select * from course;
# 查看到一共有四门课,然后有五名老师然后通过课程表和老师表的关系来查看关系
SELECT
course.cname,
teacher.tname
FROM
course
INNER JOIN teacher ON teacher_id = teacher.tid;
2、查询平均成绩大于八十分的同学的姓名和平均成绩
-- 2、查询平均成绩大于八十分的同学的姓名和平均成绩
-- 首先我们应该查看我们需要的表的对应关系(成绩表,学生表,课程表)
-- select * from student;
-- select * from course;
-- select * from score;
# 然后发现他们的表关系是多对多,都需要成绩表来连接他们之间的关系
/*先将所有学生进行分组,利用子连接拿到学生id和平均值*/-- select student_id from score group by student_id;
-- select student_id,avg(num) from score group by student_id having avg(num) > 80;
# 然后获取学生姓名
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 * from teacher;
-- select * from course;
-- select * from score;
-- SELECT * FROM student;
# 根据李平老师编号获取教授哪几个课程
-- select teacher.tname,course.teacher_id from teacher.tname inner join course on teacher.tid=course.teacher_id ;
# 获取一下成绩表
select sname from student where sid not in(select distinct sid from score where course_id in(select cid from course where teacher_id=(select tid from teacher where tname='李平老师')));
4、查询没有同时选修物理课程和体育课程的学生姓名
-- select * from student;
-- select * from score;
-- select * from course;
# 获取物理和体育课程的编号
-- select cid from course where cname in ('物理','体育');
# 获取成绩中的学生编号
-- select sid from score where course_id in ( select cid from course where cname in ('物理','体育'));
# 获取到有报过物理和体育的所有学生
select sname from student where sid in(select score.student_id from score where course_id in (select cid from course where cname in ('物理','体育')group by score.student_id having count(score.course_id)=1);
5、查询挂科超过两门(包括两门)的学生姓名和班级
-- 5、查询挂科超过两门(包括两门)的学生姓名和班级
select * from score;
select * from student;
select * from class;
-- select * from score where num < 60;
select student_id from score where score.num < 60 group by student_id having count(student_id) = 2;
select * from student where sid=(select student_id from score where score.num < 60 group by student_id having count(student_id) >= 2);
SELECT
class.caption,
student.sname
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( student_id ) >= 2 ));
python操作mysql的基本方法
1.我们要是想使用python操控mysql那么就需要下载一个第三方模块,pymysql模块
2.下载:pip install pymysql
3.固定格式
import pymysql # 导入模块
conn = pymysql.connect( # 连接服务器
host='127.0.0.1', # 本机地址
port=3306, # 端口号,3306 mysql默认端口号
user='root', # 用户名
password='', # 密码
database='db3', # 库名
charset='utf8mb4', # 编码格式
autocommit=True # 输入二次确认自动确认
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 产生一个游标对象(等待输入命令)
sql1 = 'select * from userinfo' # 编写SQL语句,飘黄不怕因为他本来就是SQL语句pycharm不识别很正常
cursor.execute(sql1) # 发送给服务端
res = cursor.fetchall() # 获取执行结果
print(res) # 打印
python操作mysql的增删改查的提交操作
1.增
insert_form有三种
insert当有与主键相同的值插入时,不会插入数据并报错
insert.ignore当有与主键相同值插入时,忽略该记录不插入但是不报错
replace 当有与主键相同值插入时,删除原有记录重新插入新纪录值
def insert_data(insert_form, insert_table):
sql_insert = """{} into {}(id,name,number) values(%s,%s,%s)""".format(insert_form, insert_table)
cur.execute(sql_insert % (1,'lewis',44))
conn.commit() # 一定不能忘记commit
cur.close()
conn.close()
print('插入数据成功')
2.删
删除权限金山使用,一旦删除,恢复比较麻烦,建议一条一条删除
def delete_data(delete_table):
sql_selete = """delete from {} where id=%d""".format(delete_table)
cur.execute(sql_selete %(1))
conn.commit() # 一定不能忘记commit
cur.close()
conn.close()
print('删除数据成功')
3.改
在外面增加循环可更改任意字段
def update_data(update_table, **kwargs):
sql_selete = """update {} set {}=%s where name=%s""".format(update_table, key) # key、value为kwargs的key与value
cur.execute(sql_selete %(1, value))
conn.commit() # 一定不能忘记commit
cur.close()
conn.close()
print('更新数据成功')
4.查
如果想要增加限制条件那么就需要自己添加where语句
def select_data(select_table):
sql_select = """select * from {}""".format(update_table)
cur.execute(sql_selete)
results = cursor.fetchall() # cursor. fetchall():接收全部的返回结果行。fetchone()、fetchmany(size)与fetchall()的区别自行百度
print(results) # 只是查询结果,如有需要自行解析
cur.close()
conn.close()
python中获取结果注意事项
"""
获取结果有点像我们的文件中的光标就是文件的执行到哪里然后回到那里,去哪里
"""
1.cursor.fetchone() # 获取结果集中一条数据
2.cursor.fetchall() # 获取结果集中所有的数据
3.cursor.fetchmany() # 获取结果集中指定条的数据
4.cursor.scroll(2,mode='relative') # 基于当前位置向后移动然后输出
5.cursor.scroll(0,mode='absoulte') # 基于数据集开头的位置向后移动
SQL注入问题
1.我们在登录过程中我们发现只要是名字正确或者他判断为True的时候就会直接登录进去并且还能查到你对应的信息,判断为为True则可以将你的数据库内所有的信息全部取出。
2.发现问题
SQL注入,备注
问题一: select * from 库名 where name='用户名' --注释 'and password=''
问题二: select * from 库名 where name='随便输点东西' or 1=1 --注释'and password=''
3.错乱本质
其实就是由一些特殊含义的符号逃脱了正常的业务逻辑,导致我们后面的代码无法正常运行
4.措施
针对用户输入导致的错误,不需要我们自己处理,我们只需要交给专门的方法自动过滤即可
sql = 'select * from 库名 where name=%s and password=%s'
cuosor.execute(sql,username,password) # 由execute自动帮我们识别出用户所输入的各种数据子哦对那个过滤页数含义符号,最后整合数据执行 一次性提交一个
cursor.executemany() # 一次提交多个
小知识补充
1.as语法
给字段起别名,起表名都是as,在我们python中也经常使用as来替换变量名等
select * from 表名 as 新表名
2.comment语法
给表、字段等添加信息 # 也就是添加备注但是直接看是看不到的
create table server(id int) comment # 这个server的意思就是服务器表
create table t1(
id int comment'用户编码',
name varchar(32) comment'用户名'
) comment'用户表'
3.查看eomment语法注释的位置
show create table 表名
use information_schema
4.concat、concat-ws语法
concat 用于分组之前第一个字段数据的拼接
concat_ws 如果有多个字段并且分隔符一直的话可以使用该方法减少代码
5.exists 语法
select * from userinfo where exists(select * from department where id<100)
exists后买你跟的sql语句如果有的结果也就是 True的话那么就会执行前面的语句,如果不为True那么不会执行,因为语法问题所以sql是从from开始执行的
作业
1、查询所有的课程的名称以及对应的任课老师姓名
select * from teacher;
select * from course;
select cname,tname from course inner join teacher where course.teacher_id=teacher.tid;
2、查询学生表中男女生各有多少人
select * from student;
select gender,count(sid) from student group by gender;
3、查询物理成绩等于100的学生的姓名
select * from course;
select * from score;
select cid from course where cname='物理';
select student_id from score where course_id = (select cid from course where cname='物理');
select * from student;
select sname from student where sid = (select student_id from score where course_id = (select cid,score.num from course where cname='物理' group by score.num having score.num = 100));
4、查询平均成绩大于八十分的同学的姓名和平均成绩
select * from score;
select * from student;
select sname,avg(num) from student group by student_id where score.avg(num) having score.avg(num) >= 80;
5、查询所有学生的学号,姓名,选课数,总成绩
6、 查询姓李老师的个数
7、 查询没有报李平老师课的学生姓名
8、 查询物理课程比生物课程高的学生的学号
9、 查询没有同时选修物理课程和体育课程的学生姓名
10、查询挂科超过两门(包括两门)的学生姓名和班级
、查询选修了所有课程的学生姓名
12、查询李平老师教的课程的所有成绩记录
13、查询全部学生都选修了的课程号和课程名
14、查询每门课程被选修的次数
15、查询之选修了一门课程的学生姓名和学号
16、查询所有学生考出的成绩并按从高到低排序(成绩去重)
17、查询平均成绩大于85的学生姓名和平均成绩
18、查询生物成绩不及格的学生姓名和对应生物分数
19、查询在所有选修了李平老师课程的学生中,这些课程(李平老师的课程,不是所有课程)平均成绩最高的学生姓名
20、查询每门课程成绩最好的前两名学生姓名
21、查询不同课程但成绩相同的学号,课程号,成绩
22、查询没学过“叶平”老师课程的学生姓名以及选修的课程名称;
23、查询所有选修了学号为1的同学选修过的一门或者多门课程的同学学号和姓名;
24、任课最多的老师中学生单科成绩最高的学生姓名
标签:course,python,Navicat,--,score,student,MySQL,id,select 来源: https://www.cnblogs.com/joseph-bright/p/16600560.html