MySQL-多表查询的两种方法、Navicat、python操作MySQL
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.2left join:左连接,以左表为基础,展示左表所有的数据,如果没有对应的项则用NULL填充,如果左边的表格中的一项对应多个其他表格的内容,那么左边的表格可以重复。
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.导入sql文件
4.1新建连接(可以使用本身存在的连接)
4.2导入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
'''
如果要给分组之后用聚合函数的结果起别名,并且该查询结果被当做一个列表和其他表连起来,name该聚合函数的别名只能在括号外面用,括号内不能使用该结果
'''
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'):基于开头位置光标向后移动指定位数的数据。
MySQL-多表查询的两种方法、Navicat、python操作MySQL的更多相关文章
- 两种方法实现Python二分查找算法
两种方法实现Python二分查找算法 一. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 arr=[1,3,6,9,10,20,30] def findnumber( ...
- SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...
- MySQL中删除数据的两种方法
转自:http://blog.csdn.net/apache6/article/details/2778878 1. 在MySQL中有两种方法可以删除数据: 一种是delete语句,另一种是trunc ...
- 使用js提交form表单的两种方法
提交form表单的时候瑶族一些简单的验证,验证完后才能提交,避免无效提交. 1.当输入用户名和密码为空的时候,需要判断.这时候就用到了校验用户名和密码,这个需要在前端页面写:有两种方法,一种是用sub ...
- linq 查询的两种方法 (在EF model中实现)
众所周知:linq查询有两种方式 1.通过linq表达式查询 2.是通过linq方法查询 代码中 每一步都有注释
- mysql开启远程登陆(修改数据表和授权两种方法)
一.确认防火墙没有阻止3306端口(一般服务器默认会屏蔽掉) windows防火墙例外设置方法 控制面板(右上角选择查看方式为大图标)---防火墙---高级设置---高级设置---出站规则---最右边 ...
- 关于MySQL中添加数据的两种方法
下面介绍两种执行SQL命令的方法,并作出相应地总结,第一种介绍一种常规用法,下面进行做简要地分析,首先我们需要执行打开数据库操作首先创建一个MySqlConnection对象,在其构造函数中传入一个连 ...
- SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)
下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式. 首先我们先创建两个数据库表,分别是user用户表和account账户表 ...
- Mysql多表查询(两张独立表,一张关系表)
一.数据库设计 1.三个数据表长这样 其中user表记录用户信息,cat主要记录男女性别,mete表是用户id和性别id的对应关系 2.具体数据如下 二.查询目标 查询出所有性别为“男”的 ...
- spring mvc 防止重复提交表单的两种方法,推荐第二种
第一种方法:判断session中保存的token 比较麻烦,每次在提交表单时都必须传入上次的token.而且当一个页面使用ajax时,多个表单提交就会有问题. 注解Token代码: package c ...
随机推荐
- vue3中的defineProps,watch,computed
在vue3的setup语法糖中,defineProps不需要引入了 <script setup> import { computed } from '@vue/reactivity'; i ...
- AR路由器如何配置Portal认证(二层网络)
规格 适用于所有版本.所有形态的AR路由器. 说明: 4GE-2S.4ES2G-S.4ES2GP-S和9ES2单板不支持NAC功能. 组网需求 如图所示,某公司接待室需要部署一套身份认证系统,对接入网 ...
- 树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
摘要 这片文章主要是记录自己的整活过程,涉及到的技术包括.NET IoT, .NET Web, .NET MAUI,框架采用的也是最新的.NET 7. 本人是用的树莓派Zero 2 W(ubuntu- ...
- MinioAPI浅入及问题
MinioAPI浅入及问题 bucketExists(BucketExistsArgs args) boolean 判断桶是否存在 返回boolean boolean gxshuju = minioC ...
- 解决python3解压文件名乱码问题(unzip)
看来很多文章,不过我觉得最有效的还是改源码,因为我用的sublime text 3有插件Anaconda可以很方便的跳转到源码文件,你也可以入python3 的安装目录, 搜索 zipfile.py这 ...
- Day27:异常详解
异常 1.1 异常概述 异常(Exception)指程序运行中出现的不正常情况:文件找不到.网络异常.非法参数等等. 我们通过代码来了解一下: public class Demo{ public st ...
- requests模块和openpyxl模块
第三方模块的下载和使用 1,第三方模块就是别人大神们已经写好的模块,功能特别强大.我们如果像使用第三方模块就先要进行下载.下载完成后 才可以在python中直接调用 2.下载方式一:pip工具 pip ...
- 浅谈 Java 和 Python 的反射
反射这个词我一直没搞懂,也不知道为什么需要反射,也不知道反射到底做了什么.所见所闻逐渐丰富之后,开始有点儿懂了. 先不管反射这个词是什么意思.Java 里面有反射,Python 里面也有反射,但是不太 ...
- 为什么总是应该考虑给定 List 的初始大小
在 .Net 技术中,使用 List<> 来存储数据是很常见的.List<> 是一个可以动态增长的泛型集合类型,可以存储任何类型的数据. 但是,在实际使用中,很多人并不注意给定 ...
- 解析【.mdb】文件
有一些项目用的是微软的access软件,这里面存放数据用的是mdb结尾的文件 有的时候,客户想开发一个新的系统,但是数据需要从这些文件中获取,因此得解析这些文件,来提取数据 一.解析时用到的依赖 1. ...