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的更多相关文章

  1. 两种方法实现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( ...

  2. SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

    软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...

  3. MySQL中删除数据的两种方法

    转自:http://blog.csdn.net/apache6/article/details/2778878 1. 在MySQL中有两种方法可以删除数据: 一种是delete语句,另一种是trunc ...

  4. 使用js提交form表单的两种方法

    提交form表单的时候瑶族一些简单的验证,验证完后才能提交,避免无效提交. 1.当输入用户名和密码为空的时候,需要判断.这时候就用到了校验用户名和密码,这个需要在前端页面写:有两种方法,一种是用sub ...

  5. linq 查询的两种方法 (在EF model中实现)

    众所周知:linq查询有两种方式 1.通过linq表达式查询 2.是通过linq方法查询 代码中 每一步都有注释

  6. mysql开启远程登陆(修改数据表和授权两种方法)

    一.确认防火墙没有阻止3306端口(一般服务器默认会屏蔽掉) windows防火墙例外设置方法 控制面板(右上角选择查看方式为大图标)---防火墙---高级设置---高级设置---出站规则---最右边 ...

  7. 关于MySQL中添加数据的两种方法

    下面介绍两种执行SQL命令的方法,并作出相应地总结,第一种介绍一种常规用法,下面进行做简要地分析,首先我们需要执行打开数据库操作首先创建一个MySqlConnection对象,在其构造函数中传入一个连 ...

  8. SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)

     下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式.   首先我们先创建两个数据库表,分别是user用户表和account账户表 ...

  9. Mysql多表查询(两张独立表,一张关系表)

    一.数据库设计 1.三个数据表长这样   其中user表记录用户信息,cat主要记录男女性别,mete表是用户id和性别id的对应关系   2.具体数据如下   二.查询目标 查询出所有性别为“男”的 ...

  10. spring mvc 防止重复提交表单的两种方法,推荐第二种

    第一种方法:判断session中保存的token 比较麻烦,每次在提交表单时都必须传入上次的token.而且当一个页面使用ajax时,多个表单提交就会有问题. 注解Token代码: package c ...

随机推荐

  1. 《Design by Contract for Embedded Software》 翻译

    原文: Design by Contract for Embedded Software (state-machine.com) Design by Contract is the single mo ...

  2. [CS61A] Lecture 5&6&7. Environments & Design & Functions Examples & Homework 2: Higher Order Functions

    [CS61A] Lecture 5&6&7. Environments & Design & Functions Examples & Homework 2: ...

  3. Seata 1.5.2 源码学习(Client端)

    在上一篇中通过阅读Seata服务端的代码,我们了解到TC是如何处理来自客户端的请求的,今天这一篇一起来了解一下客户端是如何处理TC发过来的请求的.要想搞清楚这一点,还得从GlobalTransacti ...

  4. Spring Boot 多数据源配置

    第一种方式: AbstractRoutingDataSource 1.1. 手动切换数据源 application.properties # Order # 如果用Druid作为数据源,应该用url属 ...

  5. ArcEngine 释放对象

    释放对象 例如IFeatureCursor,IFeatureClass等 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(myFeatureCursor); ...

  6. 网络工具netstat与ss

    建议使用ss命令,2001年的时候netstat 1.42版本之后就没更新了,之后取代的工具是ss.netstat命令在很多场景下比较慢.ss可以显示跟netstat类似的信息,但是速度却比netst ...

  7. js逆向到加密解密入口的多种方法

    一.hook hook又称钩子. 可以在调用系统函数之前, 先执行我们的函数. 例如, hook eval eval_ = eval; // 先保存系统的eval函数 eval = function( ...

  8. 手把手教你玩转 Excel 数据透视表

    1.  什么是数据透视表 数据透视表是一种可以快速汇总.分析大量数据表格的交互式分析工具.使用数据透视表可以按照数据表格的不同字段从多个角度进行透视,并建立交叉表格,用以查看数据表格不同层面的汇总信息 ...

  9. 从Spring中学到的【2】--容器类

    容器类 我们在实际编码中,常常会遇到各种容器类,他们有时叫做POJO,有时又叫做DTO,VO, DO等,这些类只具有容器的作用,具有完全的get,set方法,作为信息载体,作数据传输用. 其实,很多地 ...

  10. 对Asp.net WebApi中异步(async+await)接口实际使用及相关思考(示例给出了get,post,提交文件,异步接口等实践).

    [很多初学者的疑问] 为何作为web api这样的天然的并发应用,还需要在controller的action上声明使用async这些呢? <参考解答> 在 web 服务器上,.NET Fr ...