【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.相同列;

         

    •  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;

       

posted @ 2021-08-27 10:21  Phoenixy  阅读(29)  评论(0编辑  收藏  举报