py知识(每日更新) 8.2

连表查询

# 笛卡尔积
# 先计算两张表的笛卡尔积,再根据用户给出的条件进行筛选
select * from employee,department where dep_id = department.id

# 内连接  inner join ... on 连接条件
    select * from 表1 inner join 表2 on 条件
    select * from employee inner join department on dep_id = department.id
        employee --> dep_id: 200,201,202,204
        department --> id : 200,201,202,203
    # 内连接 :只显示两张表中互相匹配的项,其他不匹配的不显示
# 外连接z
    # 左外连接 left join .. on
        select * from 表1 left join 表2 on 条件
        select * from employee left join department on dep_id = department.id
        select * from department left join employee  on dep_id = department.id
        # 不管左表中是不是匹配上都会显示所有内容
    # 右外连接 right join .. on
        select * from 表1 right join 表2 on 条件
        select * from employee right join department on dep_id = department.id
        # 不管右表中是不是匹配上都会显示所有内容
    # 全外连接
        select * from department left join employee  on dep_id = department.id
        union
        select * from department right join employee on dep_id = department.id

# 连表查询
# 原来是两张表,现在拼成一张表,所有的操作都像是操作一张表一样了
# 年龄大于25岁的员工以及员工所在的部门
select * from employee inner join department d on d.id = dep_id;

# 以内连接的方式查询employee和department表,并且以age字段的升序方式显示
select * from employee e inner join department d on d.id = e.dep_id order by age;

子查询

# 存在年龄大于25岁员工的部门
select * from employee where age>25;
select distinct dep_id from employee where age>25;
select * from department where id in (select distinct dep_id from employee where age>25);

# a.查询平均年龄在25岁以上的部门名
    # 求部门的平均年龄
    select avg(age) from employee group by dep_id
    # 求部门的平均年龄>25岁的 部门id
    select dep_id from employee group by dep_id having avg(age)>25
    # 根据部门id求部门名
    select name from department where id in (select dep_id from employee group by dep_id having avg(age)>25);

# b.查询平均年龄在25岁以上的部门名,平均年龄的值
    # 方法1:
    # 先查部门的平均年龄>25岁的部门id,平均年龄
    select dep_id,avg(age) from employee group by dep_id having avg(age) > 25
    # 查出结果在之后再连表
    select name,avg_age from department as d right join (select dep_id,avg(age) as avg_age from employee group by dep_id having avg(age) > 25) as t on d.id = t.dep_id

    # 方法2
    # 先查各部门的平均年龄
    select dep_id,avg(age) from employee group by dep_id;
    # 查出结果在之后再连表
    select name,avg_age from
        department as d inner join (select dep_id,avg(age) as avg_age from employee group by dep_id) as t
        on d.id =t.dep_id
        where avg_age>25

    # 根据a,b总结出来的规律:
    # 如果最终需要的结果只出现在一张表中,可以用子查询解决问题
    # 如果最终需要的结果出现在2表中,那么最后用的一定是连表查询

# 查看"技术"部员工姓名
    # 技术部门在department表中的id
    select id from department where name = '技术';
    # 查的是姓名 employee
    select name from employee where dep_id = (select id from department where name = '技术');

# 查看不足1人的部门名
    # 子查询
    # 先查出所有人的部门id
        select distinct dep_id from employee;
    # 看不在部门id这个集合中的部门有哪些
        select name from department where id not in (select distinct dep_id from employee);

    # 连表
    select d.name from department d left join employee e on d.id = dep_id where e.id is null;

# 查询大于所有人平均年龄的员工名与年龄
    # 先查询所有人的平均年龄
    select avg(age) from employee;
    select name,age from employee where age > (select avg(age) from employee);

# 查询大于部门内平均年龄的员工名、年龄
    # 先求各部门的平均年龄
    select dep_id,avg(age) from employee group by dep_id;
    # 拼接
    select e.name,e.age from
        employee e
    inner join
        (select dep_id,avg(age) avg_age from employee group by dep_id) t
    on e.dep_id = t.dep_id
    where e.age > t.avg_age;

select * from 表 where 字段 > 一个值

如果我们查询出来的结果是一个值,那么就可以使用 > < =

select * from 表 where 字段 in (1个值,1个值)

如果我们查询出来的结果是一列中的多个值

    # dep_id
    # 201
    # 202
    # 204
    in ;not in

如果我们查出来的是一张表,也不能作为条件,如果必须保留这两个字段,就不能用作条件,只能连表

# id name
# 1  alex

select 语句到底做了什么?

select name from emp;
select name as n,(select age from employee where name = n) from emp;

子查询处理可以放在条件中,还可以放在连表中,还可以放在select字段(要求查询的结果必须是一个单行单列的值)中.

推荐连表 : 连表的效率比子查询的效率要高

原文地址:https://www.cnblogs.com/lyoko1996/p/11328913.html

时间: 2024-08-30 17:46:41

py知识(每日更新) 8.2的相关文章

py知识(每日更新) 6.18

万能传参 #当给函数传入的参数数目不定时,之前的穿饭餐方式解决不了问题 #万能参数//动态参数*args 将实参角度: 定义一个函数时* 所有位置参数聚合到一个元祖中. # **kwargs 函数定义是:**讲实参角度所有的关键字参数聚合成一个字典 * 的魔性用法: def func(*args,**kwargs): print(args) print(kwatgs) l1 = [1,2,3] l2 = ["阿萨德","去去去"] 函数形参角度的形参顺序 位置参数&

py知识(每日更新) 7.1

包的使用 第一类: ? 执行文件 通过import导入包以及包内的功能 ? 创建一个aaa的包,自行创建一个__init__py文件 ? 创建一个包会发生三件事儿: ? 1.将以XXX包内的__init__py文件加载到内存中 ? 2.创建一个以XXX命名的名称空间. ? 3.通过XXX . 的当时引用__init__的所有的名字. import aaa # 如何在当前文件中,引用aaa包的bbb包? 1.在执行文件写入 import aaa 2. aaa的__init__ 里面写 from a

py知识(每日更新) 7.30

sql语句的分类 sql语句的分类 # DDL : CREATE ALTER DROP # DML : SELECT INSERT DELETE UPDATE # DCL : GRANT REVOKE 常用sql语句 # 库 # create database 库名; # use 库名 # show tables; # 表 # create table 表名(字段名 类型(长度),...); # desc 表名; # show create table 表名; # alter table 表名

py知识(每日更新) 6.5

1整数 int 计算和比较 a.bit_length() #求十进制数转换为二进制时所占用的位数 2布尔值 bool True 真 False 假 数字转成布尔值: 0 False 非0 True 字符串转换成布尔值: 空字符串 "" False 非空 True 布尔值转换成数字 True = 1 False = 0 布尔值转换成字符串 True = str(True) False = str(False) 3字符串 作用:存储少量数据 索引(下标):从左向右 0, 1, 2, 3;;

py知识(每日更新) 6.13

文件操作初识 f = open("文件",mode="模式",encoding="编码") open() #调用操作系统打开文件 mode #对文件的操作方式 encoding #文件的编码 ? #不写indocing 默认为系统编码 Windows--gbk ? #linux&mac ----utf-8 f 文件句柄 ---- 操作文件的锅把 文件操作怎么用? 读 r rb r+ r+b r 读 r+ 读写 #后期开发中使用频率比较低

py知识(每日更新) 7.2

collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtuple和OrderedDict等. 1.namedtuple: 生成可以使用名字来访问元素内容的tuple 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象 3.Counter: 计数器,主要用来计数 4.OrderedDict: 有序字典 5.defaultdict:

py知识(每日更新) 7.16

socket套接字 五层协议:从传输层包括传输层以下,都是操作系统版主我们封装的各种head 套接字:他存在于传输层与应用层之间的抽象层 ? 1.避免你学习各层的接口以及协议的使用 socket已经封装好了所有的接口.直接使用这这些接口或者方法即可,提升开发效率. ? 2.在Python中socket就是一个模块.通过调用模块中已经实现的方法建立两个进程之间的通信. 单个客户端通讯 # client端 import socket # 1. 创建socket对象 phone = socket.so

py知识(每日更新) 7.12

反射 通过字符串去操作一个对象 字符串: 字符串类型 对象: 实例,类,当前文件(模块),其他模块 hasattr() # getattr() # setattr() # 增 delattr() # 删 函数VS方法 1.通过函数名可以大致判断 print(func) print(obj.func) 2.通过模块types模块去验证 from types import FunctionType from types import MethodType print(isinstance(func,

py知识(每日更新) 7.15

C/S B/S架构 C:client 客户端 B:Browers 浏览器 S:Service 服务端 C/S 客户端与服务器之间的架构 :QQ 微信 APP等 都属于C/S架构 ? 优点:安全性高,个性化设置,功能全面,相应速度快 ? 缺点:开发成本高,维护成本高,面向客户固定 B/S架构属于C/S架构, 浏览器-服务器之间的架构 ? 优点:开发维护成本低,面向用户广泛 ? 缺点: 安全性相对低,响应速度相对较慢,个性化设置单一 互联网通讯的原理 ISO七层协议(五层) ? 1.物理层:一系列的

py知识(每日更新) 7.25

GIL锁. GIL锁: 全局解释器锁. 就是一个把互斥锁,将并发变成串行,同一时刻只能有一个线程使用共享资源,牺牲效率,保证数据安全. 带来的问题1: ? 单进程的多线程不能利用多核. 诟病之一. ? 多进程的多线程可以利用多核. 带来的问题2: ? 感觉上不能并发的执行问题. 讨论: 单核处理IO阻塞的多线程,与多核处理IO阻塞的多线程效率差不多. # 多核的前提下: 如果任务Io密集型: 多线程并发.如果任务计算密集型: 多进程并发. GIL锁与互斥锁的关系. # 1. GIL 自动上锁解锁