MYSQL和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('用户名密码错误')
posted @ 2020-05-07 17:10  小子,你摊上事了  阅读(351)  评论(0编辑  收藏  举报