1.列拼接运算
--标准SQL的做法
SELECT CONCAT(CONCAT(CONCAT(CONCAT(A.PNAME,'-'),A.PNUMBER),'-'),A.PMONEY)
FROM PERSON A;
--Oracle的列拼接
SELECT A.PNAME || '-' || A.PNUMBER || '-' || A.PMONEY
FROM PERSON A;
2.逻辑运算
--条件查询,基于三个关键字的操作NOT(非->否定) AND(与->并且) OR(或->或者)
--查询工资2000以上且活着的人
SELECT *
FROM PERSON A
WHERE A.PMONEY>=2000
AND A.PSTATE='1';
--查询工资5000以下的活着的人,或者女性员工
SELECT *
FROM PERSON A
WHERE (A.PMONEY<5000 AND A.PSTATE='1') OR A.PSEX='2';
3.重复数据的剔除问题:(关键字DISTINCT)
重复数据:查询结果中所有列的内容,所有列拼接到一个,是同一个字符串,我们人认为两行数据是重复的
--查询名字中有 老 这个字的员工
--应用场景:基于集合运算的子查询
SELECT DISTINCT A.PNAME,A.PSEX,A.PSTATE
FROM PERSON A
WHERE A.PNAME LIKE '%老%'
4.定长字符串和可变长字符串的区别:
定长字符串 CHAR(6):
对于定长字符串,如果定义长度(6)超过了实际字符个数(3),剩余部分,系统自动补充空格。
可变长字符串 VARCHAR2(6):
对于可变长字符串,定义长度(6)超过了实际字符个数(3),多余部分自动忽略。
5.字符串类型测试:
(1)表结构
CREATE TABLE CHARTEST
(
CID NUMBER PRIMARY KEY,
C1 CHAR(10),
C2 NCHAR(10),
C3 VARCHAR2(10),
C4 VARCHAR2(10 CHAR)
C5 NVARCHAR2(10)
)
(2)测试用例
①以字符0..9填充各列,此时采用的字符是ISO-8859-1的字符集
INSERT INTO CHARTEST(CID,C1,C2,C3,C4,C5)
VALUES(1,'0123456789','0123456789','0123456789','0123456789','0123456789');
②以10个中文填充上述各列
INSERT INTO CHARTEST(CID,C1,C2,C3,C4,C5)
VALUES(2,'一二三','一二三四五六七八九零','一二三','一二三四五六七八九零','一二三四五六七八九零');
③数据未被灌满时的长度计算
INSERT INTO CHARTEST(CID,C1,C2,C3,C4,C5)
VALUES(3,'123','123','123','123','123');
(3)N字头的字符串类型,在客户端显示的时候,经常出现最后一位无法显示的问题,原因在于:数据库编码格式是UTF-8,客户端一般是GBK,在进行字符集转换时,出现的问题。
(4)字符串类型说明
总体两大体系,两大分类
两大体系:N字头(所有类型都是以字符为单位计算长度)
非N字头(默认以字节为单位计算长度,特殊的是VARCHAR2,既可以一字节为单位计算长度、格式是varchar2(len),又可以以字符为单位计算长度、格式是VARCHAR2(LEN CHAR))
两大分类:定长字符串和可变长字符串
当列没有被灌满时,定长字符串按照定义长度补充空格,变长字符串忽略剩余部分
(5)应用中的建议:
对于长度可变的列,定义列时候,以VARCHAR2(LEN CHAR)格式,比如人的名字
对于长度不变的列,同时该列永远不会出现中文,且永远可以灌满,那么用
CHAR(LEN)速度更快,比如:性别定义时候---CHAR(1),
在比如:民族CHAR(2) 01--汉族 02--满族
N字头体系的字符串类型,没必要用。
6.主键值的数据库托管问题:
(1)自增列 -- MySQL SQLServer DB2
(2)独立对象管理主键值 --- 序列
7.序列:
当前主流的大部分数据库对于主键都是采用自增列方式实现,Oracle认为,在大数据量高并发的情况下,自增列性能和安全性不理想,因此没有采用该方法,而是通过一个独立的序列对象,完成主键的自增。
8.关于序列的坑:
(1)序列语法:需要将每个关键字的含义全部记住
CREATE SEQUENCE S_TABLENAME
MINVALUE 1 --最小
MAXVALUE 10000 --最大
START WITH 1 --开始
INCREMENT BY 1 --步长
CACHE 20; --缓存
CYCLE; --循环
(2)序列的两个属性
NEXTVAL --- 每执行一次获取一个流水号
CURRVAL --- 每次获取序列的当前值
(3)当序列创建完毕,没有调用过NEXTVAL属性,直接调用CURRVAL属性 -- 报错
(4)Oracle中序列创建完毕以后,是么时候被调入内存。
当第一次调用该序列的NEXTVAL属性时候,被调入内存
(5)当NEXTVAL和CURRVAL同时出现在SELECT语句中,会?
谁在前谁在后?区别?有么有影响?
答案:当两个同时出现在SELECT子句中,获取的都是NEXTVAL之后的值,谁在前谁在后无影响,因为先调用NEXTVAL后调用CURRVAL
(6)在一个SELECT语句中,对同一序列,多次调用NEXTVAL,会?
都是一个值
在当前值的基础上,增加一个步长,将增加后的值同时传递给本语句中的所有NEXTVAL
9.带有序列的INSERT
(1)表结构
CREATE TABLE DEPT
(
DID NUMBER NOT NULL PRIMARY KEY,
DNAME VARCHAR2(10 CHAR) NOT NULL,
DMEMO VARCHAR2(500)
);
(2)创建序列
CREATE SEQUENCE S_DEPT;
(3)插入语句
INSERT INTO DEPT(DID,DNAME,DMEMO)
VALUES(S_DEPT.NEXTVAL,'软件开发部','赔钱');
COMMIT;
(4)注意事项:序列只保证向前递增,不保证从1开始,也不保证不出现断号。在必须连号的业务中不能使用序列。
(5)序列应用的扩展:现在希望像DEPT表中录入如下数据
部门名称:软件开发 + 流水号 + 部
部门备注
INSERT INTO DEPT(DID,DNAME,DMEMO)
VALUES(S_DEPT.NEXTVAL,'软件开发'||(S_DEPT.CURRVAL)||'部','赔钱');
10.UPDATE的语法
(1)UPDATE的语法规律
UPDATE 表名
SET 列名1=列值1,列名2=列值2,...,列名N=列值N
WHERE 条件列表(一般都是主键列=某个指定的值)
11.分账户管理专题:
(1)Oracle对数据,采用逻辑与物理双重隔离方式进行管理.
(2)数据指定用户所有,每个用户的数据如果不给其他用户授权,其他用户无法访问。
(3)在物理实现上:系统可以为每个用户配备独立的表空间(就是一个大文件),用户所有数据就存储在表空间中,多个用户之间表空间尽可能的独立,这样一个用户的文件如果损毁,对其他用户没有影响
(4)创建用户科学的方法是如下过程:
①创建该用户存储数据用的表空间
②创建用户,并为用户指定存储数据用的表空间
图形界面和命令来操作
12.必须记住的问题:
(1)DROP DELETE TRUNCATE 的区别
①DELETE 删除表中的数据,表结构保留
②TRUNCATE 删除表中的数据,表结构保留
③DROP 将表结构连同表中数据一并删除
(2)DELETE 与 TRUNCATE 的区别如下:
①DELETE对数据是虚拟删除,只是将数据打上一个标记,让数据不可见,因此数据是存在的,表所属用户的表空间没有被回收
②TRUNCATE将表中的数据做物理删除,因此原先在数据表空间可以回收利用
③DELETE是可以被恢复的,而TRUNCATE不可以被恢复。
④DELETE执行完毕,可以通过事务进行回滚;而TRUNCATE绕过事务,自然无法回滚,相应的速度要快于DELETE。