首页 > 数据库 >多表查询的两种方法、Navicat、python操作MySQL

多表查询的两种方法、Navicat、python操作MySQL

时间:2022-11-28 21:58:40浏览次数:43  
标签:多表 python Navicat course teacher student where id select

1.多表查询的两种方法

1.连表操作:
	1.1:inner join:内连接,将两张表共同的部分连接起来生成一张新表。拼接顺序是把后面的表拼在前面的表,如果颠倒位置结果不同。
   select * from 表1 inner join 表2 on on连接条件。
	select * from course inner join teacher on course.teacher_id=teacher.tid;
	select * from teacher inner join course on course.teacher_id=teacher.tid;   
# 1 2


	1.2left join:左连接,以左表础,展示坐标所有的数据,如果没有对应的项则用NULL填充,如果左边的表格中的一项对应多个其他表格的内容,name左边的表格可以重复。
	1.3right join:右连接,以右表为准,展示右表所有的数据,如果没有对应则用NULL填充。
	1.4union:全连接,以左右表为基准,展示所有的数据,相当于把所有表的数据都合成在一列上,各自没有的全部用NULL填充。
select * from course left join teacher on        	course.teacher_id=teacher.tid
union
select * from teacher right join course on teacher.tid=course.teacher_id;
"""
学习了多表连接之后可以连接多张表,思路是将拼接之后的表起别名当成一张新表再去和其他的表拼接,再起别名继续拼接其他表。
"""
	
2.子查询:将一条SQL语句用括号括起来当成是另外一条SQL语句的查询条件。
准备条件:表1:emp;表2:dep;
需求:求姓名是jason的员工部门名称
按照我们之前的解决思路,分步解决:
	1.首先根据员工表查找出部门id:select dep_id from emp where name='jason';  # 200
	2.再根据部门id在部门表中查找出部门名称:select name from dep where id=200;
	现在将两步合为一步:select name from dep where id=(select dep_id from emp where name='jason');
"""
要是只拿一个字段名就用子查询,拿多个字段名就用连表。
"""

2.小知识点补充说明

1.concat与concat_ws:
	concat:用于字段拼接操作:select concat(字段名1,'特殊符号',字段名2) from emp;
	concat_ws:拼接多个字段表并且中间的连接符一致:select concat_ws('特殊符号',字段名1,字段名2,字段名3)
2.exist:前后分别跟一个sql语句,只有只有右边的sql语句成立时才执行左边的sql语句,语法结构为:select *(可更换) from 表名 where exists (select * from 表名 where 条件);
3.其他相关SQL语句:
改表名:alter table 旧表名 rename 新表名;
添加字段:alter table 表名 add 字段名 字段类型(数字) 约束条件
指定位置添加字段:alter table 表名 add 字段名 字段类型(数字) 约束条件 after  已有字段
修改字段:alter table 表名 add 字段名 字段类型(数字) 约束条件 first;
修改字段名或字段类型:alter table 表名 change 旧字段名 新字段名 字段类型(数字) 约束条件;(可以只改字段类型和约束条件,新旧字段名可以写成一样的)
 	alter table 表名 modify 字段名 新字段类型(数字) 约束条件;
 	alter table 表名 drop 字段名;  # 删除字段

3.可视化Navicat

第三方开发的用来充当数据库客户端的简单快捷的操作界面
	无论第三方软件有多么的花里胡哨 底层的本质还是SQL
能够操作数据库的第三方可视化软件有很多 其中针对MySQL最出名的就是Navicat

1.浏览器搜索Navicat直接下载
	版本很多、能够充当的数据库客户端也很多
2.破解方式
	先试用在破解、直接下载破解版(老版本)、修改试用日期
3.常用操作
	有些功能可能需要自己修改SQL预览
    	创建库、表、记录、外键
    	逆向数据库到模型、模型创建
    	新建查询可以编写SQL语句并自带提示功能
    	SQL语句注释语法
        --、#、\**\
    	运行、转储SQL文件

4.多表查询练习题

1.查询所有的课程名称以及对应的老师姓名
# 确定需要的表:course,teacher,其次确定需要查询所有,确定是连表
select course.cname,teacher.tname from course INNER JOIN teacher where course.teacher_id=teacher.tid

2.查询平均成绩大于八十分的同学的姓名和平均成绩
# 1.用到的表:student,score,首先在score表中查询大于80分的课程信息
#	2.从分数表入手,先查询所有平均分八十分以上的学生姓名和学生id
select student_id,avg(num) as avg_num from score GROUP BY student_id HAVING avg(num)>80
# 3.连表,将学生姓名和平均成绩联系
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.查询没有报李平老师课的学生姓名
# 1.先确定表:course,teacher,score,student
# 2.查找到李平老师的tid
select tid from teacher WHERE tname='李平老师'
# 3.根据teacher中的tid拿到course中的cid
select cid from course where teacher_id=(select tid from teacher WHERE tname='李平老师')
# 4.在表socre中根据course_id拿到student_id
select distinct student_id from score where course_id in (select cid from course where teacher_id=(select tid from teacher WHERE tname='李平老师'))
# 5.在表student中根据student_id拿到学生姓名(取反)
select * from student where sid not in (select distinct student_id from score where course_id in (select cid from course where teacher_id=(select tid from teacher WHERE tname='李平老师'))) 

4. 查询只选修物理或只选修体育的学生姓名
# 1.所需要的表:course,score,student
# 2.根据course拿到物理和体育的cid(已经筛选掉了两门不报的学生id)
SELECT cid from course where cname in ('物理','体育')
# 3.根据course_id拿到score中的student_id
select * from score where course_id in (SELECT cid from course where cname in ('物理','体育'))
# 4.筛选出选课数量等于1的学生id
select student_id from score where course_id in (SELECT cid from course where cname in ('物理','体育')) group by student_id having count(student_id)=1
# 5.根据学生id拿到学生姓名
select * from student where sid in (select student_id from score where course_id in (SELECT cid from course where cname in ('物理','体育')) group by student_id having count(student_id)=1)

5.查询挂科超过两门(包括两门)的学生姓名和班级
# 1.确定表:score,student,class
# 2.通过score表拿到挂科超过两门的学生id
SELECT student_id from score where num < 60 group by student_id HAVING count(student_id)=2
# 3.通过连表拿到学生姓名和班级
select student.sname,class.cid from student INNER JOIN class 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)

5.python操作MySQL

pymysql模块,需提前安装

查看数据:
import pymysql

# 1.连接mysql服务器,生成连接对象
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,  # mysql端口号默认3306
    user='root',
    password='123',
    db='db9',  # 指定库
    charset='utf8mb4'
)

# 2.产生游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 3.编写sql语句
sql = 'select * from teacher;'
# 4.发送sql语句,execute有返回值,接收的是sql语句影响的行数(可以看做是表的行数)
affect_rows = cursor.execute(sql)
print(affect_rows)
# 5.获取表中的数据
res = cursor.fetchall()
print(res)

6.python操作MySQL补充说明

获取数据:
1.当我们获取三次表中的数据并且打印三次,发现第一次打印有结果,第二次第三次打印都没有结果,类似文件中光标的移动。
2.cursor.fetchone():一次性只接收一条数据,光标只移动到第一个数据的后面,再接收一次就再拿一条数据。
3. cursor.fetchmany(3):括号内的参数可以指定一次读取的条数,不能超过总条数。
4.cursor.scroll(1,'relative'):基于当前位置光标向后移动指定位数的数据,从下一个数据开始打印。(可以向后移动,改成负数即可)
5.cursor.scroll(0,'absolute'):基于开头位置光标向后移动指定位数的数据。

标签:多表,python,Navicat,course,teacher,student,where,id,select
From: https://www.cnblogs.com/zkz0206/p/16933739.html

相关文章