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:两个表结构不一样时,也可以使用第二种方式复制指定列数据
转载自:有梦想的肥宅