SQL

(更新至2016.10.14r)SQL语法知识巩固

2016-08-29  本文已影响132人  是蓝先生

2016.10.14r

1.什么是数据持久层?
持久层,又叫数据访问层。是和数据库直接打交道的层,所有增删改查的操作全在这个层里。

数据持久层是位于业务逻辑层和数据库之间,用于存储数据的一个模块。把数据持久层单独作为J2EE体系的一个层提出来的原因就是能够在对象-关系数据库之间提供一个成功的企业级映射解决方案,尽最大可能弥补这两种范例之间的差异,其目的是通过持久层的框架将数据库存储从服务层中分离出来是,自己接触到的持久层框架主要是,直接自己编写JDBC等SQL语句;

JDBC的全称是Java DataBase Connectivity,即Java数据库连接。它是一套行业标准的API,可以在Java应用程序中与关系型数据库建立连接,并执行相关操作,例如Oracle,DB2等主流数据库产品。

2.PL/sql与普通sql的区别?
普通sql它不面向过程,即前一条语句与后一条语句无关。
PL/SQL,Oracle对SQL标准的扩充,增加了面向过程的功能,所以可以用来编写存储过程、存储函数、触发器等等。

3.数据库优化之——i/o开销和cpu开销分别是什么?过大时如何解决?

解决方法是:使用绑定变量


2016.10.12r

1.如何将某个字段中的值清空?如何删除某个表中的字段?
UPDATE table_name set filed_name='';
Alter TABLE table_name DROP COLUMN field_name;
Alter TABLE table_name DROP (field_name1,field_name1);同时删除两个字段。

2.oracle的执行计划中表的链接方式有几种,分别适用在什么情况下?
在日常基于数据库应用的开发过程中,我们经常需要对多个表或者数据源进行关联查询而得出我们需要的结果集。那么Oracle到底存在着哪几种连接方式?

3.数据库的性能优化方法有哪些?
(1)传统的有:

(2)其他方法:


2016.10.10r

1.事务型数据库与分析型数据库的特征及二者区别?

两者所面向的目标不一样。


2016.10.7r

国庆假就这样快结束了,真不知道后面自己能够去哪里。不过始终保持乐观吧,总在变的更好一点。

1.关于乐观锁和悲观锁的区别?
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据(包括读或者写数据)的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

2.如何命令启动数据库?
net start mysql

3.oracle中如何查看执行计划?
explain plan for select t.*, t.rowid from A5 t where t.l = '101214' and t.k like '%8号' order by i ;


2016.9.29r

中午等外卖的时候看到两个问题,一是数据库事务,二是EM算法,于是随便查了一下。

下午快四点,自己中期答辩结束,后面自己还是要细化一点,不然真的一点创新没有,缺乏思考。


(更新至2016.10.14r)SQL语法知识巩固

2016.9.23r更新

今天去面金蝶的数据库支持岗位,问了很多数据库开发方面的问题,这里再整理学习一下。


2016.9.22r更新

以后关于sql的知识点就都在这里更新了,今天早上做了数据库支持的一些题目,有以下知识点需要注意。

那么使用select和set赋值的区别在于
返回一行值时用select和set均可以,返回多行时只能用select。

1.png

2016.9.20r更新

问题:如果数据库中某张表的数据量很大,那么在建表的时候就要去考虑查询优化的问题,有什么办法?

可以建立索引、建立分区表、设计并行查询,增快查询速度。
(主要讲建立索引为什么可以增快查询速度)
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。
那么在任何时候都应该加索引么?或者有什么缺点?
这里有几个反例:


2016.9.19r更新


1、根据原始表,找出有重复

购买行为的用户id,产品代码,行为类型(申购,认购,定投等)

#其中知识点:
-直接select distinct * 可以筛去所有重复的记录;
-统计每一条重复记录出现的次数,直接用:
    select xx,xx,xx,xx,count(*) from table group by xx,xx,xx,xx

--由于导入到数据库之后,所有的数据不知道怎么全增加了两倍,所以先去重并放入ceshi_temp1表中
/*create table ceshi_temp1 as
(select distinct * from ceshi);*/

--找出多次购买的用户id,和基金代码
--create table ceshi_temp2 as
select cus_id,jjdm from ceshi_temp1
where ywdm in ('120','122','139','137')
group by cus_id,jjdm
having count(cus_id)>=2;

--根据有多次购买行为的用户id,反过来找出所有的购买行为信息
select a.cus_id, a.jjdm, a.ywdm,count(*)
from ceshi_temp1 a,
     ceshi_temp2 b
where a.cus_id =b.cus_id
group by a.cus_id, a.jjdm, a.ywdm
order by a.cus_id

2、group by 和 over partition by的区别
二者均是统计函数,但 over partition by能够更详细的展现筛选出来的函数的明细。

NAME DEPT SALARY
A         10     1000
B         10     2000
C         20     1500
D         20     3000
E         10     1000   
用over partition by 我就可以查询到每位员工本来的具体信息和它所在部门的总工资:
select name,dept,salary,sum(salary) over (partition by dept) total_salary from salary;  
name       dept         salary      tatal_salary
A        10        1000        4000
B        10        2000        4000
E        10        1000        4000
C        20        1500        4500
D        20        3000        4500

用goup by 就没办法做到这点,只能查询到每个部门的总工资:
select dept,sum(salary) total_salary from salary group by dept
dept        total_salary
10        4000
20        4500
上一篇下一篇

猜你喜欢

热点阅读