• 二、Oracle SQL(SQL高级--表数据相关)


    3. SQL高级--表数据相关

    3.1 top / limit / rownum / percent (前XXX条数据)

    --top(SQL Server / MS Access)
    select top 条数 from 表;
    
    --percent(SQL Server)
    select top 20 percent * from 表 --选取前百分之20的数据
    
    --limit(MySQL)
    select * from 表 limit 条数
    
    --rownum(Oracle)
    select * from 表 where rownum <= 条数
    

    3.2 like(模糊查询)

    --查询列1值为G开头的数据
    select * from 表 where 列1 like 'G%' ;
    
    --查询列1值为G结尾的数据
    select * from 表 where 列1 like '%G' ;
    
    --查询列1值包含G的数据
    select * from 表 where 列1 like '%G%' ;
    
    PS:在like 前面加上 not 可以实现反选
    PS:%代替0个或多个字符  _代替1个通配字符
    

    3.3 in(指定多个值)

    select * from 表 where 列 in(值1,值2...);
    

    3.4 between(两个值之间的范围,可以是数值,文本或者日期)

    select * from 表 where 列 between 值1 and 值2
    

    3.5 as(别名)

    select 列 as 别名 from 表
    

    3.6 join(连接)

    INNER JOIN:如果表中有至少一个匹配,则返回行
    LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
    RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
    FULL JOIN:只要其中一个表中存在匹配,则返回行

    3.6.1 inner join(内连接)

    --inner join 关键字在表中存在至少一个匹配时返回行。(取A、B交集)
    PS:inner join 与 join 是相同的。
    
    select 列 from 表1 inner join 表2 on 表1的列=表2的列;
    
    PS:在使用 join 时,on 和 where 条件的区别如下:
      1、on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
      2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
      详细讲解可以查看这篇文章:SQL JOIN 中 on 与 where 的区别
    
    PS:inner join on 1=1 时取得是笛卡尔积,总数据量相当于 表1数据总数 X 表2数据总数 (即每条数据都要与另一张表做一次关联)
    

    3.6.2 left join(左连接)

    --如果右表中没有匹配,则结果为 null。(取左表全部数据,不管此时右表能否对应上,左表可以存在一对多的情况)
    
    PS:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
    PS:LEFT JOIN 关键字从左表(表1)返回所有的行,即使右表(表2)中没有匹配。
    
    select 列 from 表1 left join 表2 on 表1的列=表2的列;
    

    3.6.3 right join(右连接)

    --如果左表中没有匹配,则结果为 null。(取右表全部数据,不管此时左表能否对应上,右表可以存在一对多的情况)
    
    PS:在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
    PS:RIGHT JOIN 关键字从左表(表2)返回所有的行,即使左表(表1)中没有匹配。
    
    select 列 from 表1 right join 表2 on 表1的列=表2的列;
    

    3.6.4 full outer join(外连接)

    --full outer join 关键字只要左表(表1)和右表(表2)其中一个表中存在匹配,则返回行.(左右表数据全部返回)
    
    PS: 没有匹配到时,无法对应的列返回null,有值的列正常显示
    PS: MySQL中不支持 FULL OUTER JOIN。
    
    select 列 from 表1 full outer join 表2 on 表1的列=表2的列;
    

    3.7 union(合并结果集)

    UNION:用于合并两个或多个 SELECT 语句的结果集。
    UNION ALL:与UNION操作符类似,默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    PS:使用UNION时的前提条件:

    (1)相同列
    (2)列的数据类型要相似(比如同类型长度不同)
    (3)顺序也要相同

    --UNION
    SELECT 列1 FROM 表1 UNION SELECT 列2 FROM 表2;
    
    --UNION ALL
    SELECT 列1 FROM 表1 UNION ALL SELECT 列2 FROM 表2;
    
    PS:结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
    PS:只能在最后使用一个ORDER BY命令,是将两个查询结果合在一起之后,再进行排序!
    

    3.8 select into(复制表数据)

    PS:从一个表复制数据,然后把数据插入到另一个新表中,插入时自动创建新表。

    --复制所有的列插入到新表中
    SELECT * INTO 新表 FROM 旧表;
    
    --只复制希望的列插入到新表中
    SELECT 列1,列2... INTO 新表 FROM 旧表;
    
    --复制多个表中的数据插入到新表中
    SELECT 旧表1.列1, 旧表2.列1, 旧表2.列2
    INTO 新表
    FROM 旧表1 LEFT JOIN 旧表2 ON 连接条件;
    
    PS:MySQL 数据库不支持 SELECT INTO 语句,但支持 INSERT INTO SELECT 。
    PS: 新表将会使用 SELECT 语句中定义的列名称和类型进行创建。我们可以使用 AS 子句来定义新表的列名称。
    

    3.9 insert into select(复制表数据)

    PS:从一个表复制数据,然后把数据插入到另一个已存在的表中。

    --从一个表中复制所有的列插入到另一个已存在的表中
    INSERT INTO 已存在的表2 SELECT * FROM 要复制数据的表1;
    
    --只复制希望的列插入到另一个已存在的表中
    INSERT INTO 已存在的表2 (表2的列1,表2的列2...)
    SELECT 列1,列2... FROM 要复制数据的表1;
    
    PS:两个表结构不一样时,也可以使用第二种方式复制指定列数据
    

    转载自:有梦想的肥宅

  • 相关阅读:
    leetcode_138复制带随机指针的链表
    minSTL
    LLVM
    STL基础_迭代器
    mysql数据库表清空后id如何从1开始自增
    explain用法和结果分析
    MySQL多表查询与子查询
    数据结构与算法笔记
    MySQL数据库的SQL语言与视图
    mysql忘记密码解决方案
  • 原文地址:https://www.cnblogs.com/cy-8593/p/12559290.html
Copyright © 2020-2023  润新知