今日内容总结
多表查询的两种方法
#方式一:连表操作
1.inner join 内连接
select * from 表1 inner join 表2 on 连接部分
只连接两张表的共有部分
2.left join 左连接
select * from 表1 left join 表2 on 连接部分
以左表为基准 展示左表所有的数据 如果没有对应项用NULL填充
3.right join 右连接
select * from 表1 right join 表2 on 连接部分
以右表为基准 展示右表所有的数据 如果没有对应的用NULL填充
4.union 全连接
select * from 表1 left join 表2 on 连接部分
union
select * from 表1 right join 表2 on 连接部分;
以左右表为基准 展示所有的数据 各自没有的全部NULL填充
'''
当需要连接的表不再是两张而是更多的时候
我们编写的SQL代码所得到结果可以视为一张新的表 可以将已经连接的两张表作为一张表去和别的表建立连接
'''
#方式二:子查询
将一条SQL语句用括号括起来当成另外一条SQL语句的查询条件
子查询类似于我们日常生活中解决问题的方式>>>:分布操作
'''
很多时候多表查询需要结合实际情况判断用哪种 更多时候甚至时相互配合
'''
小知识点补充说明
#concat与concat_ws
concat用于分组之前的字段拼接操作
select conact(字段名1,'中间可插入符号',字段名2) from 表名;
concat_ws用于拼接多个字段并且中间的连接符要一致
select concat_ws('符号',字段名1,字段名2,字段名3) from 表名;
#exists
sql1 exists sql2
sql2有结果的情况下才会执行sql1 否则不执行sql1 返回空数据
#表相关SQL补充
1.修改表名
alter table 表名 rename 新表名;
2.添加字段
alter table 表名 add 字段名 字段类型(数字) 约束条件;
'''
在约束条件后面加上 after 已有字段 可选择插入字段的位置
在约束条件后面加上 first 可以将字段移至最前
'''
3.修改字段
alter table 表名 change 旧字段 新字段 字段类型(数字) 约束条件
alter table 表名 modify 字段名 新字段类型(数字) 约束条件;
4.删除字段
alter table 表名 drop 字段名
可视化软件Navicat
第三方开发的用来充当数据库客户端的简单快捷的操作界面
无论第三方软件底层的本质还是sql 类似于的软件还有许多但navicat是最出名的
#常用操作
创建库、表、记录、外键
逆向数据库到模型、模型创建
新建查询可以编写sql语句并自带提示功能
sql语句注释语法
--、/**/、#
运行 转储sql文件
多表查询练习题
1.查询所有的课程的名称以及对应的任课老师姓名
2.查询平均成绩大于八十分的同学的姓名和平均成绩
3.查询没有报名李平老师课的学生姓名
4.查询没有同时选修物理课程和体育课程的学生姓名
思路分享
--1.查询所有的课程的名称以及对应的任课老师姓名
#1.先确定需要用到几张表>>>课程表 教师表
#2.预览表中的数据 做到心中有数
#3.确定多表查询的思路 连表 子查询 混合操作
--2.查询平均成绩大于八十的同学的姓名和平均成绩
#1.先确定需要需要用到几张表>>>学生表 分数表
#2.预览表中的数据
#3.根据已知条件80分 作为切入点 分数表
#4.求出每个学生的平均成绩 按照学生的id分组 然后使用avg求出即可
#5.筛选出平均成绩低于八十的
#6.确定最后需要几张表>>>需要两张表 所以用连表更加合适
--3.查询没有报名李平老师课的学生
#1.先确定需要用到几张表>>>老师表 课程表 分数表 学生表
#2.预览每张表的数据
#3.确定思路 思路1:正向筛选 思路2:筛选所有报了李平老师课程的学生id然后取反即可
--4.查询没有同时选修物理课程和体育课程的学生姓名
#1.先确定需要的表>>>学生表 分数表 课程表
#2.预览表数据
#3.根据给出的条件确定起手的表
#4.根据物理和体育筛选课程id
#5.根据课程id筛选出所有跟物理 体育有关的学生id
#6.统计每个学生报了的课程数 筛选出等于1的
#7.我们有了学生id所以只用子查询查询学生姓名即可
python操作MySQL
pymysql模块(需要下载)
pip3 install pymysql
import pymysql
#1.连接Mysql服务端
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root'
password='',
db = '库名'
charset='utf8md4'
)
# 2.产生游标对象
cursor = conn.coursor(cursor=pymysql.cursors.Dictcursor) #不写就是列表包元组 写了就是字典 指代性更强
#3.编写sql语句
sql = 'select * from score;'
#4.发送sql语句
affect_rows = cursor.excute(sql) # execute有返回值 接收的是sql语句影响的行数
#5.获取sql语句执行之后的结果
res = currsor.fetchall()
print(res)
pymysql补充说明
#1.获取数据
fetchall() 获取所有的结果
fetchone() 获取结果集的第一个数据
fetchmany() 获取指定数量的结果集
ps:注意三者都有类似于文件光标移动的特性
cursor.scroll(1,'relative') # 基于当前位置往后移动
cursor.scroll(0,'absolute') # 基于数据的开头往后移动
#2.增删改查
autocommit=True # 针对增删改 可添加至配置 (自动确认)
conn.commit() # 针对增删改 需要二次确认 (代码确认)
标签:多表,表名,查询,可视化,select,sql,Navicat,连接,字段名
From: https://www.cnblogs.com/xiaochenxiangchangpang/p/16932959.html