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;

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




原文地址:https://www.cnblogs.com/doudou-taste/p/7290354.html