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. Mybatis:解决调用带有集合类型形参的mapper方法时,集合参数为空或null的问题

    此文章有问题,待修改! 使用Mybatis时,有时需要批量增删改查,这时就要向mapper方法中传入集合类型(List或Set)参数,下面是一个示例. // 该文件不完整,只展现关键部分 @Mappe ...

  2. 修改egg.js项目的默认favicon图标

    在项目根目录下的config/config.default.js文件中配置 将 .ico的图标放在一个目录中 方法一.读取本地文件 const path = require('path'); cons ...

  3. Go语言核心36讲47

    你好,我是郝林,今天我们继续分享使用os包中的API. 我们在上一篇文章中.从"os.File类型都实现了哪些io包中的接口"这一问题出发,介绍了一系列的相关内容.今天我们继续围绕 ...

  4. 聊聊Go里面的闭包

    以前写 Java 的时候,听到前端同学谈论闭包,觉得甚是新奇,后面自己写了一小段时间 JS,虽只学到皮毛,也大概了解到闭包的概念,现在工作常用语言是 Go,很多优雅的代码中总是有闭包的身影,看来不了解 ...

  5. services资源+pod详解

    services资源+pod详解 一.Service 虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题: Pod IP 会随着Pod的重建产生变化 Pod IP 仅仅是集群内可见的虚 ...

  6. 教你用JavaScript完成轮播图

    案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个轮播图.图片每3秒自动轮换,也可以点击左右按键轮播图片,当图片到达最左端或最右端时, ...

  7. 设计链表-LeetCode707 基础题

    LeetCode链接:https://leetcode.cn/problems/design-linked-list/ 题目:设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属 ...

  8. 跳出foreach循环

    直接return false没用,需要用throw来跳出foreach 1 try { 2 this.categoryList.forEach((item, index) => { 3 if ( ...

  9. 现代 CSS 高阶技巧,完美的波浪进度条效果!

    本文是 CSS Houdini 之 CSS Painting API 系列第三篇. 现代 CSS 之高阶图片渐隐消失术 现代 CSS 高阶技巧,像 Canvas 一样自由绘图构建样式! 在上两篇中,我 ...

  10. flask博客项目之tinymce图片上传

    查看当前的博客发表情况 截图一张立马粘贴进来 点击发表,显示数据太长 不断撤退回到刚刚页面 删除大图,换成小图,上传方式 点击发表可以成功发表 数据库中查看,是把图片生成这种编码后字符串方式存储的了, ...