zoukankan      html  css  js  c++  java
  • sql必知必会-总结篇

    总结:
    1.全书总览:数据查询、新增、删除;表的新增、更新操作;视图、存储过程、事务、索引的描述,高级sql功能:约束、触发器、索引
    2.特色:术语简明定义,讲述最简单化。简而全面。
    3.长进的地方:内联结、外联结、组合更加清晰;
    4.对一些技术或者语句的使用更加贴近业务层面,所有的数据特殊操作都是针对实际的业务场景去设计实现的。
    5.得突破自己一贯的只知道总结,没有自己的思想,或者无法达到与作者进行交流的层面;

    一、查询:

    1.最简单的查询:
    select * from table_name;
    select * from table_name order by feild desc;

     2.过滤查询:where
    select * from table_name where feild >0;
    select * from table_name where feild <>0;
    select * from table_name where feild !=0;
    select * from table_name where feild is null;
    select * from table_name where not feild is null;
    select * from table_name where feild1>0 and feild2<>0;
    select * from talbe_name where feild1>0 or feild2<>0;
    select * from table_name where feild1 in(1,2);
    select * from table_name where feild1 like 'wyd_';
    select * from table_name where feild2 like 'wyd%';


    2.1聚合函数过滤:count avg max min

    3.分组查询:group by having having 是对分组后的数据进行过滤,而where是对未分组前的数据进行过滤
    //搜索大三年级中张老师带的学生中成绩大于80的学生信息,并按成绩进行降序排列
    select * from student where grade='3' group by teacherName='张老师' having score>80 order by score desc;


    4.子查询:作为子查询的select语句只能查询单列(将一条sql查询到的值作为另一条sql的过滤条件值)

    5.联结:
      使用联结的意义:将对应的重复信息分隔到另一张表去,省去了数据重复,也便于更新,防止了因为过多的重复导致的更新不完全。


    //比如说一个班级的多个学生对应一个班主任老师,如果在每个学生的数据后面都要跟着班主任老师的信息,这就造成数据冗余,
    而且对班主任老师的信息更新也会变得非常复杂。而单独一表放班主任信息,使用一个关联字段去关联,这样就很科学。

    5.1内联结:等值联结,包含自联结和多表联结,属于多表查询的范畴,目的在于将两张表通过关联值将A表中每行对应B表中每行,

    5.1.1自联结: 两表都是同表,通过起别名进行区分,
    //查询出221班与春哥同年龄的同学信息;
    select id,name,old from student where old=(select old where name='春哥');
    select s1.id,s1.name,s1.old from student s1,student s2 where s1.old=s2.old and s2.name='春哥';
    #注意,在使用自联结时,要明确查询的是哪张表的数据,不然会返回两张表的所有值,即会重复数据

    5.1.2多表联结: 这个就不多说了,就是where条件关联。
    5.2.外联结:包含左外联结、右外联结、全外联结 ,与内联结相对应,是不等值联结,意为即使关联表中不存在关联数据,也会返回,只不过是返回一串空。
    而左外和右外则对应相对于join位置的表,表示锁定的表即使没有关联内容也显示。
    //查询学生信息及对应的学生成绩,(有同学临时有事没去考试,嘿嘿嘿)

    6.组合查询:union 在简单的业务中使用看着复杂,但在复杂的业务中使用却显得无比简单易懂。

    #注意两select对应列数一致,对应列含义不同可以,但基本数据类型一致,('yyyy-mm-dd'和'dd-mm-yyyy'是可以的)
    #注意order by 只放在最后一条select语句中,但排序的是所有查询到的数据。
    #查询到的是第一条sql和第二条sql数据的组合,是上下两行关系,不像联结那样并列一行;
    select id,old from student union select id,score from score order by student_id;

    二、插入
    insert-select 组合:
    insert into student(id,name,old)
    select * from student; //可以进行多行插入,查询到多少就插入多少。
    三、更新
    update student set name='张晨鹏',old='21' where id='1' ; //where条件必须写,不然会全部更新
    四、删除:
    delete from student where id='1' ; //where 条件必须写,不然会全部删除数据,不过只是删除数据,不是表
    如果要删除表所有数据, 使用:truncate table table_name 效率更高。
    五、表结构:新增、更新、删除
    create table student(
    id number not null primary key,
    name varchar2 not null,
    old number not null default(20) check(old>0 and old<25),--这里的default条件有问题
    inputdate date not null default (sysdate)
    )

    alter table student add score number not null;
    drop table student;
    六、视图、存储过程、事务处理

    视图:
    1.视图同表一样,也是数据库中一种对象,但它不像表数据那样,是实际存储在物理存储中的,而是从table 中
    通过select查询到的数据的组合,也可以说是对查询语句的封装。(虚拟的表)
    2.视图的意义:将一些复杂关联关系组合到的数据的这种关系保存下来,方便下次去查,(比如你大姨家夫侄子的老婆的舅舅这种
    非常绕的组合关系,),另一方面,权限问题,可以对只有查看权限的用户,将一些敏感信息如密码等从表中屏蔽掉,只让他看
    到一些普通信息。 (原话是隐藏复杂的sql关联,简化复杂的联结,过滤不想要的数据 )
    3.视图的创建:
    create view view_test as select id,name from student;
    create view view_test2 as select * from score where score >=60;

    存储过程:
    1、存储过程:一个业务场景的实现,可能涉及到多条sql操作,为保证每次实现这个场景是,所有sql语句都准确执行,将这些sql
    语句封装了起来。
    2、编写存储过程比较复杂,没学???就没讲好么……
    3、执行存储过程
    excute addNewStudent(8,'红军','22','88'); //新增一个同学,录入基本信息和成绩。

    事务处理:
    事务:指一组sql语句;
    回退:指撤销已执行的指定sql的过程;
    提交:指将未存储的sql语句结果写入数据库表;
    保留点:一个事务可能很多sql,在其中又添加标记位置,可以指定回退到标记位置;

    开启事务:set transaction;
    回退:rollback;
    设置保留点:savepoint point1;
    提交:commit;

    游标:关于游标,不想学啊不想学,用不到啊用不到。
    结果集:由sql查询所检索出的结果。
    在结果集的基础上添加游标,可以根据需要滚动或浏览其中的数据

    1.创建游标:
    declare cursor stuCursor is
    select s1.id,s1.name,s2.score from student s1,score s2 where s1.id=s2.studentid and s2.score>60;
    2.打开游标:
    open cursor stuCursor;
    3.使用游标:fetch
    4.关闭游标:close stuCursor;
    #游标关闭后不能再使用,下次使用时不需要再声明,直接打开使用;

    七、sql高级特性: 约束、索引、触发器

    约束:管理如何插入或处理数据库数据的规则;

    #引用完整性:即有关联性的表,将主表信息删除后,附表中有关的信息也应该删除掉(级联删除)
    1.主键约束:唯一标识表中一行数据,不可变性,非空,唯一性,主键不更新修改
    alter table student add constraint primary key (id);
    2.外键约束:附表中一列,值必须为主表中主键,保证了引用完整性
    创建表时创建:student_id number not null references student(id),
    已有表创建:alter table score add constraint foreign key(student_id) references student(id);
    3.唯一性约束:unique
    4.检查约束:check

    索引:为提高普通列的搜索效率,添加索引。

    索引的意义:索引是因为其他列存储时是无序的,(就好比没有按a-z排序),提高了检索的效率,但降低了插入和更新效率
    索引的创建: create index student_id_ind on score(student_id);
    索引的实效性:索引的效率随着表数据的增加而变化,可能过几个月后索引就没那么好用了,需要重新修改;
    #有些字段无需添加索引,像省别,就那么几十个,

    触发器:跟sql语句相关联,比如在执行insert、update语句之前或者之后要执行什么操作。
    //将所有录入的英文名首字母大写。
    新建触发器:
    create trigger student_name
    after inert or update
    for each row
    bigin
    update student set name=upper(name) where id =:old.id
    end;

    约束比触发器效率快,约束能做到的就用约束




  • 相关阅读:
    Web探索之旅 | 第二部分第三课:框架和内容管理系统
    Web探索之旅 | 第二部分第二课:服务器语言
    Web探索之旅 | 第二部分第一课:客户端语言
    Web探索之旅 | 第一部分:什么是Web?
    C++探索之旅 | 第一部分第三课:你的第一个C++程序
    C++探索之旅 | 第一部分第二课:C++编程的必要软件
    Python探索之旅 | 第一部分第三课:初识Python的解释器
    C++探索之旅 | 第一部分第一课:什么是C++
    C#对接JAVA系统遇到的AES加密坑
    typescript入门,可以一起探讨提点意见互相学习。
  • 原文地址:https://www.cnblogs.com/doudou-taste/p/7290354.html
Copyright © 2011-2022 走看看