二、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:两个表结构不一样时,也可以使用第二种方式复制指定列数据

转载自:有梦想的肥宅

原文地址:https://www.cnblogs.com/cy-8593/p/12559290.html