MYSQL和navicat的使用练习
navicat的使用
Navicat 是以直觉化的图形用户界面而建的
Navicat内部封装了所有的操作数据库的命令
用户在使用它的时候只需要鼠标即可完成操作 无需书写sql语句
安装和使用的方法navicat
在navicat的练习
1、查询所有的课程的名称以及对应的任课老师姓名
SELECT
cname,
tname
FROM
course
INNER JOIN teacher ON teacher.tid = course.teacher_id;
2.查询平均成绩大于八十分的同学的姓名和平均成绩
1.先拿大于80分的学生id号,在跟学生表做拼接
SELECT
student.sname,
t1.avg_nun
FROM
student
INNER JOIN (
SELECT
score.student_id,
AVG( score.num ) AS avg_nun
FROM
score
INNER JOIN student ON student.sid =.score.student_id
GROUP BY
score.student_id
HAVING
AVG( score.num )> 80
) AS t1 ON student.sid = t1.student_id;
7、 查询没有报李平老师课的学生姓名
# 先找到李平老师的课程id
# 再找到所有报了李平老师课程学生的id
# 之后去学生表里取反,就可以获取到没有报李平老师课程的学生姓名
SELECT
student.sname
FROM
student
WHERE
sid NOT IN (
SELECT DISTINCT
score.student_id
FROM
score
WHERE
score.course_id IN ( SELECT course.cid FROM course INNER JOIN teacher ON course.teacher_id = teacher.tid WHERE teacher.tname = '李平老师' ));
8、 查询没有同时选修物理课程和体育课程的学生姓名
(只要选了一门的 选了两门和没有选的都不要)
# 1 先查物理和体育课程的id
# 2 再去获取所有选了物理和体育的学生数据
# 3 按照学生分组 利用聚合函数count筛选出只选了一门的学生id
# 4 依旧id获取学生姓名
SELECT
student.sname
FROM
student
WHERE
student.sid IN #3
(
SELECT
score.student_id
FROM
score
WHERE
score.course_id IN # 2
(
SELECT
course.cid
FROM
course
WHERE
course.cname IN ( '物理', '体育' )) # 1
GROUP BY
score.student_id
HAVING
COUNT( score.course_id )= 1
);
-- 9、 查询挂科超过两门(包括两门)的学生姓名和班级
# 1 先筛选出所有分数小于60的数据
# 2 按照学生分组 对数据进行计数获取大于等于2的数据
SELECT
student.sname,
class.caption
FROM
student
INNER JOIN class ON class.cid = student.class_id
WHERE
student.sid IN ( SELECT score.student_id FROM score WHERE score.num < 60 GROUP BY score.student_id HAVING COUNT( score.course_id )>= 2 );
mysql注入
"""
利用一些语法的特性 书写一些特点的语句实现固定的语法
MySQL利用的是MySQL的注释语法
select * from user where name='jason' -- jhsadklsajdkla' and password=''
select * from user where name='xxx' or 1=1 -- sakjdkljakldjasl' and password=''
"""
日常生活中很多软件在注册的时候都不能含有特殊符号
因为怕你构造出特定的语句入侵数据库 不安全
# 敏感的数据不要自己做拼接 交给execute帮你拼接即可
# 结合数据库完成一个用户的登录功能?
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '123456',
database = 'day48',
charset = 'utf8' # 编码千万不要加-
) # 链接数据库
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('>>>:')
password = input('>>>:')
sql = "select * from user where name=%s and password=%s"
# 不要手动拼接数据 先用%s占位 之后将需要拼接的数据直接交给execute方法即可
print(sql)
rows = cursor.execute(sql,(username,password)) # 自动识别sql里面的%s用后面元组里面的数据替换
if rows:
print('登录成功')
print(cursor.fetchall())
else:
print('用户名密码错误')