sql查询

一 、子查询

1、定义:子查询是 嵌套 在其他查询中的查询,子查询可以用在select查询语句的任何地方/

2、下面是子查询的两种应用方式

(1)在where 子句中 ,配合in ,not in 操作符 ,进行过滤

(2)作为计算字段使用子查询,在select字句中

    作为计算字段时,子查询是与外部查询相关的,子查询要使用完全限定名,  需要重点关注子查询的执行次数(与外部表的查询检索出的数据 个数 相关)

   举例:把左边的表count_1  变成右边的表 

                    

      

1 select  year,
2 (select amount from count_1 a where month = 1 and a.year = b.year) m1,
3 (select amount from count_1 a where month = 2 and a.year = b.year) m2,
4 (select amount from count_1 a where month = 3 and a.year = b.year) m3,
5 (select amount from count_1 a where month = 4 and a.year = b.year) m4
6 from count_1 b
7 group by year  (注:此语句也可以不写,而是在select 语句中 加 distinct关键字 ,即select distinct year ......)


第二种方法
1 select  year,
2 sum(case when month=1 then amount else 0 end) m1,
3 sum(case when month=2 then amount else 0 end) m2,
4 sum(case when month=3 then amount else 0 end) m3,
5 sum(case when month=4 then amount else 0 end) m4
6 from count_1 b
7 group by year  

3、用子查询建立和测试查询技巧—逐渐增加子查询

  一般步骤:

    (1)建立和测试最内层的查询

    (2)用  硬编码数据  建立和测试外部结构

二 、 联结(join)

1、定义:表a 与 表b  联结,即是将 表a的每一行   与 表b 的每一行 配对,当没有联结条件时,返回笛卡尔积

     在where字句中 建立 联结条件,以在运行时构造相应的关系(临时表),应该保证所有的联结都有where子句

2、on 和 where 的区别

  on 作用于连接过程中,以外连接为例,会返回想要的所有内容,不符合连接条件的会被赋予空值

  where 作用于连接之后生成的续表,不符合过滤条件的全部过滤掉

3、表 可以用 as关键字  取 别名,但是表别名 只在查询执行的过程中使用,不返回客户端(即不会显示在结果中)

4、4种不同联结

  (1)等值连接

    在where子句中 添加 等值条件

    等值连接的联结条件:

        如果是两张表的主、外键(主键 的所有值是不重复的),可以直接将两个表的相关信息连接到一起,连接的结果真实,可以直接使用

        如果是其他的非主、外键的列,则连接的结果往往可能出现异常的,不符合实际的情况,或者存在大量重复的信息,往往还需要在where子句中 添加其他过滤条件

  (2)自连接

    在单条查询语句中 多次 使用 同一张表

  (3)外连接

    left ourer join 左外连接

    right outer join 右外连接

    outer oin 全外连接

三 、组合查询(union)

  1、定义:union 将多条select查询语句组成一个整体,并指示mysql 执行每个select语句,将所有输出合成单个结果集

  2、需要组合查询的两种基本情况

    (1)在单个查询中从不同的表返回类似结构的数据

    (2)对单个表执行多个查询,按单个查询返回数据

  3、union规则

    (1)按照一列,每两个select 语句间用 union连接

    (2)每个查询包含相同的列、表达式和聚集函数(顺序可不同)

    (3)列数据类型必须兼容,列数据类型不必完全相同,但必须保证DBMS可以隐含的转换为相同

    (4)union 自动去除重复的结果,如何不需要去重,可以使用union all

  4、排序

    一个组合查询只能有一个 order by 子句,位于最后一个selece语句的后面,

四、更新表 update

  1、可以更新某个记录的某个列的值、或者多列值;也可以更新多个记录

               update tablename 

    set 

      where

  set 子句 可以使用子查询

  

  2、重命名

    alter tablename

    rename newname

五 、 视图

  1、定义:一个虚拟的表,不包含数据,只包含一个查询,在使用时 动态的检索数据

    优点: (1)极大的减化了复杂的查询

        (2)一次性编写基础的sql ,多次使用

  2、视图的创建和删除

    创建视图

    create view 视图名称 as  查询语句

    删除视图

    drop view 视图名称

    更新视图

    create or replace view 视图名称

  3、更新视图

    由于视图本身并不保存数据,视图的更新,其实是对基表的操作。并非所有的视图都是可更新的,在分组、联结、子查询、并、聚集函数、distinct,导出计算列等情况下不能更新视图

  

  3、其他

    (1)如果从视图检索数据时使用了一条where子句,那么这条where子句将自动和视图本身的where子句组合在一起

 

六、存储过程

  1、定义:为了以后使用,而保存的一条或多天 mysql语句的集合。 可视为——批文件(跑批) 

  2、优点

    (1)简化操作

    (2)方便统一管理(可使应用程序、程序员都使用标准的操作),防止错误  

    (3)简化对变动的管理,存储过程的内容对使用人员可以是黑箱,当底层变化时,仅需要改动存储过程即可,不影响使用者的使用

    (4)提高性能

    缺点:

    (1)编写复杂

    (2)需要更严格 的管理,普通人员只有使用权限;mydql将编写 和 使用 区分开了

  3、调用存储过程

    (1)调用语句

    call 存储过程的名称( a,

              @b

              );

    注:a为需要传入的值,b 为存储输出结果的变量,mysql中变量都必须以@开始; 

       调用过程类似函数需要传入实参的过程,只不过存储过程还需要传入接收结果的变量

    (2)查询返回的结果: 直接select查询接收结果的变量

      select @b;

  4、创建存储过程(本质上:存储过程是 一种函数 ,可以接收参数,函数体用begin ...end 包围)

    (1)创建语句

    create procedure 存储过程名称(

                  in/out/inout 变量名 变量类型,

                  )

    begin

      mysql语句

    end;

  注意事项:在命令行中创建存储过程时,由于过程体内的语句会用到语句分隔符‘ ;’ ,使得存储过程无法编写成功。所以,在编写之前要改变语句分隔符,如下

        delimiter //        将语句分隔符改为 //

        定义存储过程

           delimiter ;      将语句分隔符改回 ;

    (2)其他规定

        --  :过程体内行注释

        comment '注释内容':紧跟参数列表之后,为整个存储过程添加注释

        

  5、存储过程参数

    (1)参数变量类型

        传入参数:in

        传出参数:out

        传入传出参数 :inout

        将检索值存入传出变量 :  into 传出变量(参数)

  6、删除存储过程

    drop procedure if exists 存储过程名称;  

  7、检查存储过程

    show create procedure 存储过程名称;    

   

原文地址:https://www.cnblogs.com/wl413911/p/11470067.html