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. Linux操作系统,笔录!

    1.Linux 1.1.Linux介绍: Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX ...

  2. C#多线程之线程基础篇

    目录 一.概念 二.原理 硬件结构 运行时 三.基础 创建与启动 传递参数 前台/后台线程 异常处理 中断与中止 中断(Interrupt) 中止(Abort) 协作取消模式 四.异步编程模式 异步编 ...

  3. Java注解与原理分析

    目录 一.注解基础 二.注解原理 三.常用注解 1.JDK注解 2.Lombok注解 四.自定义注解 1.同步控制 2.类型引擎 五.参考源码 使用的太多,被忽略的理所当然: 一.注解基础 注解即标注 ...

  4. redis五种数据结构详解

    5.相关介绍和命令 5. redis是单线程+多路io复用技术 多路复用是指使用一个线程来检查多个文件描述符的就绪状态,比如调用select和poll函数,传入多个文件毛舒服,如果有一个文件描述符就绪 ...

  5. Day24:static关键字

    static static关键字是静态的意思,可以修饰成员方法.属性. static修饰的特点: 被类的所有对象共享 可以通过类名调用,也可以通过对象名调用:推荐使用类名调用! public clas ...

  6. 如何在 K8S 集群范围使用 imagePullSecret?

    在这篇文章中,我将向你展示如何在 Kubernetes 中使用 imagePullSecrets. imagePullSecrets 简介 Kubernetes 在每个 Pod 或每个 Namespa ...

  7. 数电第7周周结_by_yc

    一.通用双向移位寄存器: 功能描述:   4位的双向移位寄存器,含控制输入端(ctrl).串行输入端(Dsl.Dsr).4个并行输入端和4个并行输出端,要求实现5种功能:异步置零.同步置数.左移.右移 ...

  8. linux内核源码下载地址

    一.官网链接 https://www.kernel.org/ 二.HTTP https://www.kernel.org/pub/ 三.GIT https://git.kernel.org/ 四.镜像 ...

  9. python2和python3的区别(1)

    1.python2和python3的解释器的默认编码不同 python2解释器的编码默认用的是 ascii python3解释器的编码默认用的 utf-8 2.python2和python3输入的表示 ...

  10. HDOJFatmouse肥鼠交易//c++控制保留小数

    贪心算法.我就不贴题了//no.1009 但是我的代码运行超时了-改了好久都不对- 看别人代码,顺便学习c++控制保留小数怎么操作; 我的错误代码:(时间占用可能是多次调用findmax造成的) #i ...