首页 > 数据库 >多表查询两种方法、可视化软件navicat、python操作mysql、pymysql模块

多表查询两种方法、可视化软件navicat、python操作mysql、pymysql模块

时间:2022-11-28 18:58:13浏览次数:33  
标签:多表 python SQL 查询 dep emp mysql id select

目录

多表查询的思路

表数据准备

表数据准备
create table dep(
  id int primary key auto_increment,
  name varchar(20) 
);

create table emp(
  id int primary key auto_increment,
  name varchar(20),
  sex enum('male','female') not null default 'male',
  age int,
  dep_id int
);

#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'财务');

insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('dragon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);
select * from emp,dep;  会将两张表中所有的数据对应一遍
这个现象我们也称之为'笛卡尔积' 无脑的对应没有意义 应该将有关系的数据对应到一起才合理
基于笛卡尔积可以将部门编号与部门id相同的数据筛选出来
涉及到两张及以上的表时 字段很容易冲突 我们需要在字段前面加上表名来指定
select * from emp,dep where emp.dep_id=dep.id;
基于上述的操作就可以将多张表合并到一起然后一次性获取更多的数据

多表查询的两种方法

方式一:连表操作

inner join	内连接

select * from emp inner join dep on emp.dep_id=dep.id; # 只连接两张表中公有的数据部分
left join	左连接
select * from emp left join dep on emp.dep_id=dep.id;
以坐标为基准 展示坐标所有的数据 如果没有对应项则用NULL填充
right join	右连接
select * from emp right join dep on emp.dep_id=dep.id;
以右表为基准 展示右表所有的数据 如果没有对应项则用NULL填充
union	全连接
select * from emp right join dep on emo.dep_id=dep.id;
以左右表为基准 展示所有的数据 各自没有的全部NULL填充

学会了连表操作之后也就可以连接N多张表

思路:将拼接之后的表起别名当成一张表再去与其他表拼接 在起别名 在于其他表拼接 其次往复即可

方式二:子查询

将一条SQL语句括起来当成另外一条SQL语句的查询条件

题目:求姓名是jason的员工部门名称

子查询类似我们日常生活中解决问题的方式:分步操作

步骤一:先根据jason获取部门名称
select dep_id from emp where name='jason';
步骤二:再根据部门编号获取部门名称
# select name from dep where id=200;
总结:select name from dep where id=(select dep_id from emp where name='jason');
'''
很多时候多表查询需要结合实际情况判断用哪种 更多时候甚至是相互配合使用
'''

小知识点补充数说明

  1. concat与concat_ws

    concat用于分组之前的字段拼接操作
    select concat(name,'$',sex) from emp;
    concat_ws拼接多个字段并且中间的连接符一致
    select concat_ws('|',name,sex,age,dep_id) from emp;
    
  2. exists

    sql1 exists sql2
    	sql2有结果的情况下才会执行qsl1 否则不执行sql1 返回空数据
    
  3. 表相关SQL补充

# 修改表名
alter table 表名 rename 新表名;  
# 添加字段
alter table 表名 add 字段名 字段类型(数字) 约束条件;  
alter table 表名 add 字段名 字段类型(数字) 约束条件 after 已有字段;
# 修改字段
alter table 表名 add 字段名 字段类型(数字) 约束条件 first;
alter table 表名 change 旧字段名 新字段名 字段类型(数字) 约束条件;
# 修改字段类型
lter table 表名 modify 字段名 新字段类型(数字) 约束条件;
# 删除字段
alter table 表名 drop 字段名;  

可视化软件Navicat

第三方开发的用来充当数据库客户端的简单快捷的操作界面
	无论第三方软件有多么的花里胡哨 底层的本质还是SQL
能够操作数据库的第三方可视化软件有很多 其中针对MySQL最出名的就是Navicat

1.浏览器搜索Navicat直接下载
	版本很多、能够充当的数据库客户端也很多
2.破解方式
	先试用在破解、直接下载破解版(老版本)、修改试用日期
3.常用操作
	有些功能可能需要自己修改SQL预览
    	创建库、表、记录、外键
    	逆向数据库到模型、模型创建
    	新建查询可以编写SQL语句并自带提示功能
    	SQL语句注释语法
        --、#、\**\
    	运行、转储SQL文件

多表查询练习题

编写复杂的SQL不要想着一口气写完 一定要先明确思路 然后一步步查一步步补

  1. 查询所有与的课程的名称以及对应的任课老师姓名
  2. 查询平均成绩大于八十分得同学的姓名和平均成绩、
  3. 查询没有报李平老师课的学生姓名
  4. 查询没有同时选修物理课程和体育课程的学生姓名
  5. 查询挂科超过两门(包括两门)的学生姓名和班级

python 操作MySQL

pymysql模块
	pip3 install pymysql
import pymysql
# 1.连接MySQL服务端
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    db='db4_03',
    charset='utf8mb4'
)
# 2.产生游标对象
# cursor = conn.cursor()  # 括号内不填写额外参数 数据是元组 指定性不强  [(),()]
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # [{},{}]
# 3.编写SQL语句
# sql = 'select * from teacher;'
sql = 'select * from score;'
# 4.发送SQL语句
affect_rows = cursor.execute(sql)  # execute也有返回值 接收的是SQL语句影响的行数
print(affect_rows)
# 5.获取SQL语句执行之后的结果
res = cursor.fetchall()
print(res)

pymysql补充说明

1.获取数据
	fetchall()	获取所有的结果
    fetchone()	获取结果集的第一发个数据
    fetchmany()	获取指定数量的结果集
    Ps:注意三者都有类似于文件光标移动的特性
2.增删改查
	autocommit=True	# 针对增删 该自动确认(直接配置)
    conn.commit()	# 针对 增 删 改 需要二次确认

标签:多表,python,SQL,查询,dep,emp,mysql,id,select
From: https://www.cnblogs.com/xiao-fu-zi/p/16933037.html

相关文章

  • python svg 验证码处理
        <svgxmlns="http://www.w3.org/2000/svg"width="130"height="55"viewBox="0,0,130,55"><rectwidth="100%"height="100%"fill="#b5b9b9"/><pathfill=......
  • skywalking启动配置agent及数据储存对数据源(mysql,es)版本要求
    skywalking启动配置agent及数据储存对数据源(mysql,es)版本要求#skywalking-agent.jar的本地磁盘路径-javaagent:D:\SkyWalking\skywalking-agent\skywalking-agent.jar#......
  • Mysql 基础概念
      一、数据库的基本概念1、数据库的组成2、数据库的管理系统(DBMS)3、数据库系统(DBS) 二、主流数据库 三、关系数据库 四、非关系数据库 五、关系数据库和非关......
  • mysql基础语句
       一、mysql中6中常见的的约束/规则主键约束(primarykey)外键约束(foreignkey):如果同一个属性字段x在表一中数主键,而在表二中不是主主键,则字段称为表二的外键。非......
  • Mysql 连接参数 useAffectedRows 详解
    Mysql连接参数useAffectedRows详解Javamysql链接串:jdbc:mysql://mysql安装IP:3306/db_test?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertTo......
  • MySQL多表查询语法
    MySQL多表查询语法多表查询准备数据准备createtabledep(idintprimarykeyauto_increment,namevarchar(20));createtableemp(idintprimarykeya......
  • mysql数据库之事务
     一、mysql事务1、事务的概念2、事务的ACID特点2.1原子性2.2一致性2.3隔离性2.4持久性3、两个事务之间的影响3.1脏读(读取未提交数据)3.2不可重复度(前后多......
  • termux安装完整linux(ubuntu)、python、vscode-web
    1安装Ubuntu#需要先安装proot-distroaptinstallproot-distro#安装ubuntuproot-distroinstallubuntu2登录Ubuntuproot-distrologinubuntu3安装指定版本py......
  • MySQL深度掌握之路
    目录​​目录​​​​前言​​​​知识点​​前言知识点MySQL要求​​AUTO_INCREMENT​​列必须有某种索引,如果没有索引,那么表的定义就是不合法的。任何一个​​PRIMARYKE......
  • MySQL自定义函数
     ⚠不推荐将业务逻辑存储在数据库中.MySQL不仅提供了很多很方便的内置函数,用户还可以自定义函数。不同于MongoDB对Js函数的良好支持,MySQL的自定义函数用起来感觉处处掣......