zoukankan      html  css  js  c++  java
  • Oracle学习(二)SQL高级--表数据相关

    SQL高级语句

    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 * fromwhere rownum <= 条数

    like(模糊查询)

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

    in(指定多个值)

    select * fromwherein(值1,值2...);

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

    select * fromwherebetween 值1 and 值2

    as(别名)

    selectas 别名 from

    join(连接)

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

    inner join(内连接)

    --inner join 关键字在表中存在至少一个匹配时返回行。(取A、B交集)
    PS:inner join 与 join 是相同的。 selectfrom 表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数据总数 (即每条数据都要与另一张表做一次关联)

    left join(左连接)

    --如果右表中没有匹配,则结果为 null。(取左表全部数据,不管此时右表能否对应上,左表可以存在一对多的情况)

    PS:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
    PS:LEFT JOIN 关键字从左表(表1)返回所有的行,即使右表(表2)中没有匹配。 selectfrom 表1 left join 表2 on 表1的列=表2的列;

     right join(右连接)

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

    full outer join(外连接)

    --full outer join 关键字只要左表(表1)和右表(表2)其中一个表中存在匹配,则返回行.(左右表数据全部返回)

    PS: 没有匹配到时,无法对应的列返回null,有值的列正常显示
    PS: MySQL中不支持 FULL OUTER JOIN。 selectfrom 表1 full outer join 表2 on 表1的列=表2的列;

    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命令,是将两个查询结果合在一起之后,再进行排序!

     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 子句来定义新表的列名称。

    insert into select(复制表数据)

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

    --从一个表中复制所有的列插入到另一个已存在的表中
    INSERT INTO 已存在的表2 SELECT * FROM 要复制数据的表1;
    
    --只复制希望的列插入到另一个已存在的表中
    INSERT INTO 已存在的表2 (表2的列1,表2的列2...) 
    SELECT 列1,列2... FROM 要复制数据的表1;
    
    PS:两个表结构不一样时,也可以使用第二种方式复制指定列数据
  • 相关阅读:
    【FZYZOJ】细菌 题解(最短路)
    oracle 开发 第02章 查询
    oracle 开发 第01章 简介
    rhel配置163、epel、rpmforge的yum源
    linux 手动清除缓存
    查看linux内核版本和发行版本
    linux下安装rlwrap
    linux下安装vncserver
    Nagios 安装
    linux mutt发送报表
  • 原文地址:https://www.cnblogs.com/riches/p/11245420.html
Copyright © 2011-2022 走看看