一、Navicat 可视化工具的使用

1、Navicat [1]  是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。

它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,

让你可以以安全并且简单的方式创建、组织、访问并共用信息。

#要求掌握
1;测试+连接数据库
2:新建库
3:新建表,新增字段+类型+约束条件的创建
4:设计表:外键
5:新建查询
6:建立表的模型
7:转储/运行SQL文件
8
:通过模型多表之间查询,输入命令 #注意
  批量加注释:ctrl+?建
  批量去注释:CTRL+shift+?建

2、 软件操作界面及使用注意事项:

3、新建库时注意事项:

4、可以把建好的表转储为SQL文件保存下来,可以把新的SQL文件直接添加并运行(可以直接利用别人建好的框架模型或数据)

二、练习题:(多表之间的查询)

1、查询所有的课程的名称以及对应的任课老师姓名
4、查询平均成绩大于八十分的同学的姓名和平均成绩
7、 查询没有报李平老师课的学生姓名
8、 查询没有同时选修物理课程和体育课程的学生姓名
9、 查询挂科超过两门(包括两门)的学生姓名和班级 # 解题步骤:
把复杂的问题拆分,按条件拆分一步一的写,再基于上一次查询的结果再做条件筛选

1:查询所有的课程的名称以及对应的任课老师姓名

解题思路:(1):先采用连表操作 inner join(内连接把老师和课程的信息查找)   

select *from course inner join teacher on course.teacher_id =teacher.tid; 内连接查找

      (2):在找到老师和课程的基础上,再查找课程对应的老师信息

        把 * 换成要查找的内容即可:

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 # 第二步:查询学生符合符合条件的学生 再用avg
INNER JOIN (
SELECT
student_id,
avg(num) AS avg_num
FROM
score # 第一步:先查找平均成绩大于80分的同学
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、 查询没有同时选修物理课程和体育课程的学生姓名(没有同时选修指的是选修了一门的,

  思路是得到物理+体育课程的学生信息表,然后基于学生分组,统计count(课程)=1)

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)

三、pymysql 模块

命令行安装: pip insatll mysql   用Python来实现操作mysql

import pymysql

conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '',
database = 'day38',
charset = 'utf8' # 编码千万不要加- 如果写成了utf-8会直接报错
)
# 向mysqld服务端发送请求连接 cursor = conn.cursor(pymysql.cursors.DictCursor) # 产生一个游标对象 以字典的形式返回查询出来的数据
# 键是表的字段 值是表的字段对应的信息
sql = 'select * from teacher' cursor.execute(sql)   # 执行传入的sql语句
print(cursor.fetchone()) # 只获取一条数据
print(cursor.fetchone()) # 只获取一条数据 # cursor.scroll(2,'absolute') # 控制光标移动 absolute相对于其实位置 往后移动几位
cursor.scroll(1,'relative')    # relative相对于当前位置 往后移动几位
print(cursor.fetchall())   # 获取所有的数据 返回的结果是一个列表

四、mysql 注入问题

 解决在输入没有密码或者用户名错误的情况下也能访问数据的问题。

# 2.代码链接
import pymysql
#链接
conn=pymysql.connect(
host='localhost',
user='root',
password='',
database='egon',
charset='utf8')
#游标
cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) # 以字典的方式显示数据 # 3.pymysql操作数据库
#执行sql语句
user = input(">>>:").strip()
pwd = input(">>>:").strip()
sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号 rows=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
# 获取真实数据cursor.fetchone(),cursor.fetchall(),cursor.fetchmany(),类似管道取值,获取一条,所有,多条 cursor.scroll(1,'relative') # 相对移动
cursor.scroll(3,'absolute') # 绝对移动 cursor.close()
conn.close()

sql注入的问题:

  通过修改验证方式,解决在没有输入正确的用户名和密码时也能获取数据的情况

import  pymysql

conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '',
database = 'day38',
charset = 'utf8' # 编码千万不要加- 如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor) username =input('username>>>:').strip()
password = input('password>>>:').strip() sql ="select * from userinfo where name = %s and password = %s"
print(sql)
res = cursor.execute(sql,(username,password)) # execute 会自动识别sql语句中的%s 帮你做替换
if res:
print(cursor.fetchall())
else:
print("用户名和密码错误!") 结果:
username>>>:james
password>>>:123
select * from userinfo where name = %s and password = %s
[{'id': 2, 'name': 'james', 'password': '123'}]
"""
sql注入 就是利用注释等具有特殊意义的符号 来完成一些骚操作
后续写sql语句 不要手动拼接关键性的数据
而是让excute帮你去做拼接 """
sql ="select * from userinfo where name = %s and password = %s" %(username,password)
res = cursor.execute(sql) 如果这么写的话会出现注入问题:利用mysql -- 注释的语法实现破解密码 如输入:Jack‘-- bhgdj 或 xxx' or 1=1 没有密码不知道用户名也能获取数据

五、增删改

conn.commit()   手动提交

autocommit = True  自动提交

import  pymysql

conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '',
database = 'day38',
charset = 'utf8', # 编码千万不要加- 如果写成了utf-8会直接报错
autocommit = True # 这个参数配置完成后 增删改操作都不需要在手动加conn.commit了
)
cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'insert into userinfo (name,password) values("jerry","666")'
# sql = 'update userinfo set name = "jasonhs" where id = 1'
# sql = 'delete from userinfo where id = 2'
cursor.execute(sql) # conn.commit() """
增删改操作 都必须加一句
conn.commit()操作
"""

  

  

      

  

Navicat-pymysql-sql注入问题的更多相关文章

  1. Navicat,SQL注入,pymysql模块

    # 关键字exists(了解) 只返回布尔值 True False 返回True的时候外层查询语句执行 返回False的时候外层查询语句不再执行 select * from emp where exi ...

  2. python-pymysql防止sql注入攻击介绍

    目录 pymysql sql 注入攻击 调用存储过程 pymysql pymysql 是一个第三方模块,帮我们封装了 建立表/用户认证/sql的执行/结果的获取 import pymysql # 步骤 ...

  3. Navicat工具、pymysql模块 sql注入

    cls超 Navicat工具.pymysql模块 阅读目录 一 IDE工具介绍 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试, ...

  4. MySQL 之Navicat Premium 12安装使用、pymysql模块使用、sql注入问题的产生与解决

    本文内容提要: Navicat Premium 12 的介绍.使用. pymysql模块的使用 sql注入问题的产生与解决 -------------------------------------- ...

  5. MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05

    目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操 ...

  6. 数据库——可视化工具Navicat、pymysql模块、sql注入问题

    数据库--可视化工具Navicat.pymysql模块.sql注入问题 Navicat可视化工具 Navicat是数据库的一个可视化工具,可直接在百度搜索下载安装,它可以通过鼠标"点点点&q ...

  7. MySQL多表查询,Navicat使用,pymysql模块,sql注入问题

    一.多表查询 #建表 create table dep( id int, name varchar(20) ); create table emp( id int primary key auto_i ...

  8. pymysql的使用及sql注入

    pymysql简介 pymysql是python操纵mysql的一个模块,本质上是一个socket客户端 pymysql使用 准备数据 #创建数据库db2,如果已存在,请忽略 CREATE DATAB ...

  9. 多表查询思路、navicat可视化软件、python操作MySQL、SQL注入问题以及其他补充知识

    昨日内容回顾 外键字段 # 就是用来建立表与表之间的关系的字段 表关系判断 # 一对一 # 一对多 # 多对多 """通过换位思考判断""" ...

  10. pymysql 解决 sql 注入问题

    1. SQL 注入 SQL 注入是非常常见的一种网络攻击方式,主要是通过参数来让 mysql 执行 sql 语句时进行预期之外的操作. 即:因为传入的参数改变SQL的语义,变成了其他命令,从而操作了数 ...

随机推荐

  1. WebSocket在建立连接时通过@PathParam获取页面传值

    最近用Java下使用WebSocket,有一个需求,在页面与Java后台建立连接的时候获取页面上提供的参数,也就是在@OnOpen注解的方法里面获取一次页面的参数,有一个很简单的方法可以获得.即使用@ ...

  2. git push 现有代码到一个新的分支

    git push origin HEAD:task/xxx-test-local git push的一般形式为 git push <远程主机名> <本地分支名>  <远程 ...

  3. 1.1 js中函数定义解析(学习笔记)

    1.1.1函数的分类 函数声明式 :使用function声明函数,并指定函数名. 函数表达式:使用function声明函数,但未指定函数名. 函数表达式2.匿名函数,匿名函数有很多作用,赋予一个变量则 ...

  4. textField 基本属性

    _textField.frame = CGRectMake(0, 0, 200, 50); _textField.delegate = self; _textField.text = str; [_t ...

  5. iOS 中的延时操作方法

    1. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_q ...

  6. 201712-2 游戏 Java

    思路: 第一感觉有点像约瑟夫环.想到用队列解决比较好理解 import java.util.LinkedList; import java.util.Queue; import java.util.S ...

  7. es和数据库关系对比

    es类比传统关系型数据库:   Relational DB -> Databases -> Tables -> Rows -> Columns Elasticsearch -& ...

  8. vue 动画框架Animate.css @keyframes

    <script src="vue.js"></script> <link rel="stylesheet" href=" ...

  9. h5-钟表动画案例

    1.html代码 <div class="clock"> <div class="line line1"> <div class= ...

  10. java 面向对象概述, 函数解析

    函数:class FunctionDemo { public static void main(String[] args) { /* int x = 4; System.out.println(x* ...