【SQL】 增删改查之 查询
SQL 结构化查询语言(Structured Query Language)
- SELECT - 从数据库中提取数据
- SELECT 查询
-- 查询全部数据 SELECT * FROM 表名;
-- 只查询列名数据 ,多个列名用‘,’隔开 SELECT 列名1,列名2,... FROM 表名; - DISTINCE 去重
-- 个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值 select DISTINCT 列名 from table_name;
- WHERE 条件查询
/* 运算符 描述 = 等于 <> 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 != > 大于 < 小于 >= 大于等于 <= 小于等于 */ select * from 表名 where 列名 = '字段值'; -- BETWEEN 在某个范围内 select * from 表名 where 列名 BETWEEN 'value1' AND 'value2'; -- LIKE 搜索某种模式 [%:通配符 替代0个或多个字符 , _:通配符 替代1个字符] select * from 表名 where 列名 LIKE '%关键字%'; -- IN 指定针对某个列的多个可能值 select * from 表名 where 列名 IN ('value1','value2','value3')
- WHERE 多条件查询
-- AND 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录 select * from 表名 where 列名1 = 'value1' and 列名2 = 'value2' -- OR 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录 select * from 表名 where 列名1 = 'value1' or 列名2 = 'value2'
- ORDER BY 排序
-- asc 升序 默认排序可省略,列名可多个 使用,隔开 select * from 表名 ORDER BY 列名1 ASC; -- desc 降序 select * from 表名 ORDER BY 列名1 DESC;
- GROUP BY 分组
-- 注意:对于过滤条件,可以先用where再用group by或者是先用group by再用having;因为where子句在选择之前过滤数据,而having子句在选择之后过滤数据 -- where子句作用于表和视图,having作用于组 select 列名 from 表名 where 条件 GROUP BY 字段; -- 或者 having 用于过滤group by 的聚合,过滤条件需要配合聚合函数使用,常用的聚合函数:count() , sum() , avg() , max() , min() select 列名 from 表名 GROUP BY 列名 HAVING 过滤条件; -- group by + with rollup 在最后新增一行,来记录当前列里所有记录的总和 select 列名,count(列名)from 表名 GROUP BY 列名 WITH ROLLOP;
- SELECT TOP/LIMIT/ROWNUM 规定返回记录数
-- SQL Server / MS Access 语法 select TOP 个数 percent * from 表名; -- MySQL 语法 select * from 表名 LIMIT 个数; -- Oracle 语法 select * from 表名 where ROWNUM <= 个数;
- JOIN 链接
--JOIN连接时,on和where 的区别 on 生成临时表时使用,不区条件是否为真,都会返回记录 where 生成临时表后使用,过滤条件不为真的数据 A inner join B 取交集。 A left join B 取 A 全部,B 没有对应的值为 null。 A right join B 取 B 全部 A 没有对应的值为 null。 A full outer join B 取并集,彼此没有对应的值为 null。
- INNER JOIN:如果表中有至少一个匹配,则返回行
-- 内连接,又叫等值连接,只返回两个表中连接字段相等的行; INNER JOIN 与 JOIN 是相同的。(inter 可省略) select 表1.列,表2.列,…… from 表1 INTER JOIN 表2 on 表1.相同列 = 表2.相同列;
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
-- 在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN; LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。 select 表1.列,表2.列,…… from 表1 LEFT JOIN 表2 on 表1.相同列 = 表2.相同列;
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
-- 在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN;RIGHT JOIN 关键字从右表(access_log)返回所有的行,即使左表(Websites)中没有匹配。 select 表1.列,表2.列,…… from 表1 RIGHT JOIN 表2 ON 表1.相同列 = 表2.相同列;
- FULL JOIN:只要其中一个表中存在匹配,则返回行
-- FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果 select 表1.列,表2.列,…… from 表1 FULL JOIN 表2 ON 表1.相同列 = 表2.相同列;
- INNER JOIN:如果表中有至少一个匹配,则返回行
- UNION 合并两个或多个 SELECT 语句
-- UNION 选取不同的值 select 列1 from 表1 UNION select 列1 from 表2 order by 列1; -- UNION ALL 选取重复值 select 列1 from 表1 UNION ALL select 列1 from 表2 order by 列1; -- 带有where 的UNION ALL select 列1,列2 from 表1 where 列2 = 'value' UNION ALL select 列1,列2 from 表2 order by 列2 = 'value' order by 列1;
- SELECT INTO 从一个表复制数据,然后把数据插入到另一个新表中
-- MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 。拷贝表结构及数据: create table 新表 AS select * from 旧表; -- SQL SELECT INTO 语法 select * INTO新表 from 旧表; -- 仅复制需要的列到新表 select 列1,列2 INTO 新表 from 旧表; -- 复制带条件的数据到新表 select * INTO 新表 from 旧表 where 列 = 'value'; -- 复制多个表中的数据插入到新表中 select a.列1,b.列2,c.列3 INTO 新表 a from 旧表 b left join 表3 c on b.列0 = c.列0; -- SELECT INTO 语句可用于通过另一种模式创建一个新的空表。只需要添加促使查询没有数据返回的 WHERE 子句即可: select * INTO新表 from 旧表 where 1=0;
- INSERT INTO SELECT 从一个表复制数据,然后把数据插入到一个已存在的表中。
-- 目标表中任何已存在的行都不会受影响 -- 表结构相同 insert into 表2 select * from 表1; -- 表结构不同 insert into 表2(列1,列2,……) select 列1,列2,…… from 表1;
- SELECT 查询
-------------------------------------------------------------------------------------
如果万事开头难 那请结局一定圆满 @ Phoenixy
-------------------------------------------------------------------------------------