sql必知必会-总结篇

it2022-05-05  96

总结: 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


最新回复(0)