多表查询,子查询,及查询语句中语句执行的先后顺序和特点

对多张表进行查询操作
  查询方式1:
    笛卡尔积查询
      select * from 表1,表2;
      结果:让表1中的每一条记录和表2中每一条记录一次组合
      表1 n条记录
      表2 m条记录
      最终查询结果:n * m 条

    注意:
      1.观察笛卡尔积查询的最终结果,很多数据没有实际作用
      2.查询结果太多,对内存压力大

  笛卡尔积查询优化(内连接)
  加上条件
    隐式内连接
      select * from 表1,表2 where 表1.字段 = 表2.字段;

    显示内连接语法
      select * from 表1 inner join 表2 on 条件;
        注意:内连接语法条件过滤时,使用的是 on 关键字
        例1:select * from kecheng,teacher where kecheng.teacherid = teacher.tid;
        例2:select * from kecheng inner join teacher on kecheng.teacherid = teacher.tid;

  外链接(outer join)(谁在前面就先显示哪个表的数据)
    左外连接 ---- left outer join
      结果:
        以左表为准,左表中的所有数据都有 + 右表中符合条件的数据(连接条件on和判断条件where)
    右外连接 ---- right outer join
      结果:
        以右表为准,右表中的所有数据都有 + 左表中符合条件的数据

  外连接和内连接的区别:
    1.内连接获取的是严格符合条件的数据
    2.外连接获取的是严格符合条件的数据 + 左表(left)/右表(right)中不符合条件的数据

子查询:一个查询的结果作为另外一个查询的条件(一个查询中包含另一个查询)
    必须保证查询的结果为一个具体的值!!!(作为条件时)

难点:char与varchar的比较:
    相同点:二者都是存储文本(字符串)的
    不同点:
      1.数据声明的长度范围不同
        char --- 0 --- 255
        varchar --- 0 --- 65535
      拓展:varchar(10)
        长度:在mysql 4.0 之前代表的字节数
           在mysql 5.0 开始,代表字符数
      2.底层存储格式不同
        char(10) ---- ‘AB‘ ---- ‘AB             ‘       (已经定义了长度了,就像数组一样,你不用也有)
        varchar(10) ---- ‘AB‘ ---- ‘2AB‘             (有算法封装了长度,你定义的长度是最大长度)
          A、varchar 空间分配更灵活
          B、虽然char可能浪费空间,但是效率高
            char 比 varchar 效率高
      3.什么时候使用 char? 什么时候使用 varchar?
        具体情况具体分析
          用于固定格式的数据 char
          不确定格式 varchar

语句查询中的顺序:
  select D_*
    from 表名
    where A_条件
    group by B_字段
    having C_条件
    order by E_字段;

    0、先执行from
    1、执行where后的A_条件
    2、执行group by的 B_字段,拆分成子表
    3、执行having的C_条件,对子表进行筛选
    4、执行select的D_*,将子表合成一张表
    5、执行order by的E_字段,对4中的表进行排序(如果是用基础属性,就是按照符合条件的第一条的语句的基础属性在排序)

show create table 表名;
  显示所有的建表信息(可用于查询约束名等然后对约束进行操作)

limit

  select * from 表名 limit n, m;   用于显示数据库中从第(n+1)条数据开始的共m条语句

时间: 2024-11-10 07:45:32

多表查询,子查询,及查询语句中语句执行的先后顺序和特点的相关文章

开发中遇到的问题---【使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据】

问题:使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据: 原因:MyBatis看到 #{}会认为你在给sql中的变量赋值,就像JDBC编程中给问号赋值一样(自动在前后加单引号)也就是说,他把你传入的字符串并没有当做多个值,而是当做一个大的字符串,所以查询不到值 而MyBatis看到${}的时候会直接将之替换成变量的值而不做任何处理: 解决方案:将查询条件中的“#”替换成“$”. <select id="fi

Sql 语句中的执行顺序

(8)SELECT (9)DISTINCT (11)<Top Num> <select list>(1)FROM [left_table](3)<join_type> JOIN <right_table>(2) ON <join_condition>(4)WHERE <where_condition>(5)GROUP BY <group_by_list>(6)WITH <CUBE | RollUP>(7)HAV

python的pymysql中以表名作为变量传递进查询语句中

在我们学习使用pymysql的时候有时需要把表名当做变量传递到sql语句中去执行,然而我们的固定思维模式有时却限制了我们:如:我们知道传递变量可以用占位符%s,后面加上变量就行,在pymysql中也有同样的问题,我们在执行sql语句的时候可以把变量传递进去类似: sql = 'insert into TabName + ' value (%s %s)' cursor.execute(sql, [name,age]) 如果我们的TabName也是变量的话我们就会习惯性的这样加 sql = 'ins

MYSQL优化派生表(子查询)在From语句中的

Mysql 在5.6.3中,优化器更有效率地处理派生表(在from语句中的子查询): 优化器推迟物化子查询在from语句中的子查询,知道子查询的内容在查询正真执行需要时,才开始物化.这一举措提高了性能: 1:之前版本(5.6.3),from语句中的子查询在explain select 查看执行计划语句执行时就会物化.它导致了部分查询执行,但explain语句的目的是获取执行计划信息,而不是执行查询 该版本物化不会在explain中发生,所以explain执行计划结果的得到更快: 2:因为上面提及

sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询

执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date desc 逻辑上看着挺对 但是报错: 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效.   只要我们在嵌套子查询视图里面加入: top 100 percent 即可 select * from ( select top 100

【MYSQL】update/delete/select语句中的子查询

update或delete语句里含有子查询时,子查询里的表不能在update或是delete语句中,如含有运行时会报错:但select语句里含有子查询时,子查询里的表可以在select语句中. 如:把总成绩小于100的学生名称修改为天才 select stu_id from score group by stu_id having sum(grade)<100; #查询总成绩小于100的学生IDupdate students set name='天才' where id in (select s

数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

1.    oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一.比如SilverStream就是基于数据库的一种中间件.ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能:作为一个关系数据库,它是一个完备关系的产品:作为分布式数据库它实现了分布式处理功能.但它的所有知识,只要在一种机型上学习

【Oracle】曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询

一.多表联合查询 二.子查询 三.动态条件查询 LESSON 4 Displaying Data from Multiple Tables-------------------------------------------------------- 查询s_emp表中最大的工资数,并且显示出这个最大工资数的员工名字 select last_name,max(salary)from s_emp; 多表查询 查询多张表的时候会产生笛卡尔积 为了防止笛卡尔积的产生,我们需要使用某些条件把两张表或多张

使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例

前言:开发常用的关系型数据库MySQL,mssql,postgre,Oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样,对于标准SQL语句支持最好的是mssql和postgre,这个不需多讲,我们只讲讲单表情况下的postgre如何通过迭代查询获取有层级关系的数据. 一.表结构举例 MENU表 ID VARCHAR2(32)     N   sys_guid()    节点idFENXID VARCHAR2(32)