oracle:
在数据库中,SQL语句本身是不区分大小写的,但是为了增加可读性,通常会将关键字与非关键字
按照大小写区分开来增加可读性
在SQL Developer中,需要连续执行多条SQL语句时,每条语句可以在结尾时用";"来分割多条SQL语句,
这样他们是可以同时执行多条舍得,但是";"不是SQL本身必须的东西!也可以选中要执行的某条SQL,
单独执行。
SELECT SYSDATE FROM dual;
1:number类型
ORACLE中所有的数字都是使用NUMBER类型,的NUMBER类型的长度定义中包括两部分:
长度及精度,其中长度包含精度。
sal NUMBER(6,2)
意思是有一个字段,总共6位数字,其中小树占两位,最大表示9999.99
若不指定精度,则表示一个整数
字符串类型
CHAR与VARCHAR2
CHAR:定长字符串,最大支持2000字节,无论实际数据多长,都会将数据补充若干空格,达到
该字段实际制定的长度.
优点:查询效果好,缺点:浪费磁盘空间
VARCHAR2:ORACLE提供的变长字符串类型,其他数据库只支持VARCHAR类型。最大支持4000字节,
数据多长就保存多长,用多少占多少,
优点:磁盘空间利用好.缺点:查询效率低.
日期类型
DATE:占用7个字节,用于存放一个日期数据,7个字节分别存储:世纪,年,月,日,时,分,秒
所以保存时间的精度最多到秒。秒以下的精度保存不了,想保存需要使用其他日期类型。
DDL语句(数据定义语言,这一类SQL语句用于增删改数据库对象)
创建表employee的语法:
CREATE TABLE employee_lb(
id NUMBER(4),
name VARCHAR2(20),
gender CHAR(1),
birth DATE,
salary NUMBER(6,2),
job VARCHAR2(20),
deptno NUMBER(2)
);
desc employee_lb;
DEFAULT关键字,可以在创建表的时候,为某个字段指定默认值。数据库中,无论字段的数据类型是
什么,默认值都是NULL。可以使用DEFAULT单独指定。
在数据库中,字符串字面量使用单引号括起来,并且字符串内容是区分大小写的!
NOT NULL约束
当表中某个字段使用NOT NULL修饰后,该字段在任何情况下值不能为空。
删除表employee
DROP TABLE employee_lb
CREATE TABLE employee_lb(
id NUMBER(4),
name VARCHAR2(20) NOT NULL,
gender CHAR(1) DEFAULT 'M',
birth DATE,
salary NUMBER(6,2),
comm NUMBER(6,2),
job VARCHAR2(30),
manager NUMBER(4),
deptno NUMBER(2)
);
desc employee_lb;
修改表
1:修改表名
RENAME old_name TO new_name
RENAME employee_lb TO myemp_lb ;
2:修改表结构
2.1:追加新字段
ALTER TABLE table_name ADD(
hired DATE
)
ALTER TABLE myemp_lb ADD(
hiredate DATE
);
DESC myemp_lb;
向表中添加字段,只能被追加到表的最后,不能在现有表的字段之间插入新字段
2.2;删除表中字段
ALTER TABLE table_name DROP(col_name)
例如
ALTER TABLE myemp_lb
DROP(hiredate)
当表中有数据时,会将删除的字段在每条记录对应的值都删除,若表中数据量大时会耗时
修改表中现有字段
可以修改字段的类型,长度,默认值。
建议在表中没有数据时进行,尽量不修改类型,若修改长度,尽量不要缩小
ALTER TABLE table_name
MODIFY (col_name TYPE [DEFAULT dev_
将JOB字段添加默认值'CLERKk'
ALTER TABLE myemp_lb
MODIFY (job VARCHAR2(40) DEFAULT 'CLERK')
DML:数据操作语言
用于增删改表中数据的
1:添加数据
INSERT INTO table_name
[(col1,col2,...)]
VALUES
(val1,val2,...)
INSERT INTO myemp_lb
(id,name,salary,deptno)
VALUES
(1,'JACK',4000,20)
SELECT*FROM myemp_lb
插入日期类型数据:
建议使用TO_DATE函数
INSERT INTO myemp_lb
(id,name,job,birth)
VALUES
(1003,'donna','MANAGER',
TO_DATE('2009-09-01','YYYY-MM-DD')
);
CREATE TABLE emp_lb(
empno NUMBER(4,0),
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4,0),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2,0)
);
CREATE TABLE dept_lb(
deptno NUMBER(2,0),
dname VARCHAR2(14),
loc VARCHAR2(13)
);
INSERT INTO emp_lb
VALUES
(7369,'SMITH','CHERK',7902,TO_DATE('1980-12-17','YYYY-MM-DD'),800,NULL,20);
INSERT INTO emp_lb
VALUES
(7499,'ALLEN','SALESMAN',7698,TO_DATE('1981-2-20','YYYY-MM-DD'),1600,300,30);
INSERT INTO emp_lb
VALUES
(7521,'WARD','SALESMAN',7698,TO_DATE('1981-2-22','YYYY-MM-DD'),1250,500,30);
INSERT INTO emp_lb
VALUES
(7566,'JONES','MANAGER'7839,TO_DATE('1981-4-2','YYYY-MM-DD'),2975,NULL,20);
INSERT INTO emp_lb
VALUES
(7654,'MARTIN','SALESMAN',7698,TO_DATE('1981-9-28','YYYY-MM-DD'),1250,1400,30);
INSERT INTO emp_lb
VALUES
(7698,'BLAKE','MANAGER',7839,TO_DATE('1981-5-1','YYYY-MM-DD'),2850,NULL,30);
INSERT INTO emp_lb
VALUES
(7782,'CLARK''MANAGER',7839,TO_DATE('1981-6-9','YYYY-MM-DD'),2450,NULL,10);
INSERT INTO emp_lb
VALUES
(7788,'SCOTT','ANALYST'7566,TO_DATE('1987-4-19','YYYY-MM-DD'),3000,NULL,20);
INSERT INTO emp_lb
VALUES
(7839,'KING','PRESIDENT',NULL,TO_DATE('1981-11-17','YYYY-MM-DD'),5000,NULL,10);
INSERT INTO emp_lb
VALUES
(7844,'TURNER','SALESMAN',7698,TO_DATE('1981-9-8','YYYY-MM-DD'),1500,0.00,30);
INSERT INTO emp_lb
VALUES
(7876,'ADAMS','CLERK',7788,TO_DATE('1987-5-23','YYYY-MM-DD'),1100,NULL,20);
INSERT INTO emp_lb
VALUES
(7900,'JAMES','CLERK',7698,TO_DATE('1981-12-3','YYYY-MM-DD'),950,NULL,30);
INSERT INTO emp_lb
VALUES
(7902,'FROD','ANALYST',7566,TO_DATE('1981-12-3','YYYY-MM-DD'),3000,NULL,20);
INSERT INTO emp_lb
VALUES
(7934,'MILLER','CLERK',7782,TO_DATE('1982-1-23','YYYY-MM-DD'),1300,NULL,10);
SELECT * FROM emp_lb
INSERT INTO dept_lb
VALUES
(10,'ACCOUNTING','NEW YORK');
INSERT INTO dept_lb
VALUES
(20,'RESEARCH','DALLAS');
INSERT INTO dept_lb
VALUES
(30,'SALES','CHICAGO');
INSERT INTO dept_lb
VALUES
(40,'OPERATTONS','BOSTON');
DML操作
2:修改表中数据
语法
UPDATE table_name
SET col1=new_val1,col2=new_val2...
[WHERE condition]
UPDATE myemp_lb
SET gender='F',salary=7000
WHERE name='ROSE'
UPDATE语句会修改表中记录中指定字段的值,UPDATE通常要使用WHERE子句来限定要修改的记录,
否则就是整张表每条记录都会被修改,若使用了WHERE,则只会修改满足WHERE条件的记录。
SELECT * FROM myemp_lb
3:删除表中数据
语法:
DELETE FROM table_name
[WHERE condintion]
同样的,若不添加where子句会将表中的所有数据删除,等同于清空表中操作。通常不会这样做
添加WHERE子句后,只会删除表中*满足WHERE条件的记录
DELETE FROM myemp_lb
WHERE id=1
SELECT * FROM myemp_lb
DELETE FROM myemp_lb
WHERE id=3
DELETE FROM myemp_lb
WHERE id=4
SELECT * FROM myemp_lb
SELECT ename,sal,job,deptno
FROM emp_lb
SELECT ename
FROM emp_lb
SELECT
CONCAT(CONCAT(ename,'的工资是:'),sal)
FROM
emp_lb
使用"||"也可以连接字符串,通常使用它来代替CONCAT函数
SELECT ename||':'||sal
FROM emp_lb
LENGTH(char)函数
用于返回给定字符串的长度(字符量)
SELECT ename,LENGTH(ename)
FROM emp_lb
UPPER(char),LOWER(char),
INITCAP(char)
将字符串转换为全大写,全小写,首字母大写(其中可以使用空格分隔多个单词,
那么每个单词首字母都会大写).
DUAL:伪表,为了满足SELECT语法要求使用当我们查询的数据不来自任何一张表时,
可以使用伪表代替FROM子句中的内容,伪表仅仅会查出一条结果
SELECT UPPER('Heloworld'),
LOWER('HELLOWORLD')
INITCAP('HELLO WORLD')
FROM dual
SELECT * FROM emp_lb
WHERE ename=UPPER('jones')
SELECT * FROM emp_lb
TRIM,LTRIM,RTRIM
TRIM:去除给定字符串中两边重复的给定字符
LTRIM,RTRIM可以单独去除左边或者右边的字符
SELECT
TRIM('e' FROM 'eeeeeeliteeeee')
FROM dual
SELECT
LTRIM('eeeeliteee','e')
FROM dual
SELECT
RTRIM('eeeelliteeee','e')
FROM dual
LPAD,RPAD补位函数
SELECT LPAD(sal,10,'s')
FROM emp_lb
SUBSTR(char,offer,len)
从给定字符串的给定位置开始,连续截取len个字符
offert可正可负,若是负数,则是从倒数字符开始截取
len必须是个>=0的数字,若截取的字符数量超过实际可以截取的字符数量时,则截取到字符串末尾。
在数据库中,下标从1开始!
SELECT
SUBSTR('Thinking in java',-7,4)
FROM dual
SELECT
SUBSTR('Thinking in java',7,4)
FROM dual
INSTR(CHAR1,CHAR2[,N,M,])
查看char2在char1中的位置
n:从char1的第几个字符开始查找(不写则为1)
m:查找第几次出现(不写则为1)
SELECT
INSTR('thinking in java','in',4,2)
FROM dual
数字函数
ROUNT(n,m)
对n进行四舍五入操作,保留小数点后m位,若m为0,则是保留到整数位,若为负数,
则是保留十位以上的数字
SELECT ROUND(45.678,2) FROM dual
SELECT ROUND(45.678,0) FROM dual
SELECT ROUND(45.678,-2) FROM dual
TRUNC函数,与ROUND的区别在于,仅保留指定位数,不做四舍五入操作
SELECT TRUNC(45.678,2) FROM dual
SELECT TRUNC(45.678,0) FROM dual
SELECT TRUNC(45.678,-1) FROM dual
MOD(m,n)求余数,若n为0,则直接返回
SELECT MOD(sal,1000) FROM emp_lb
CELL与FLOOR函数
用于对给定的小数向上取整数与向下取整数
SELECT CEIL(4.5),FLOOR(4.5)
FROM dual
日期相关的关键字
1:SYSDATE
SYSDATES实际上对应ORACLE内部的一个函数,返回的是一个DATE类型的当前系统时间的值
INSERT INTO student
VALUES
(1,'张三',SYSDATE)
2:SYSTIMESTAMP关键字与SYSDATE一样,只不过返回的是一个时间戳类型的当前系统时间的值
日期类型的数据是可以进行运算的,两个日期类型的值相减,差为相差的天数。
给日期的值加上一个数字,相当于累加了天
输入一个生日,查询到今天为止活了多少天?
SELECT
SYSDATE-TO_DATE('1993-05-23','YYYY-MM-DD')
FROM dual
每个员工的入职时间
SELECT
SYSDATE-hiredate
FROM emp_lb
TO_CHAR()可以将给定的DATE按照指定的日期格式转换为字符串
SELECT ename,TO_CHAR(hiredate,'YYYY-MM-DD')
FROM emp_lb
SELECT
TO_CHAR(
TO_DATE('98-05-30','RR-MM-DD'),'YYYY-MM-DD')
FROM dual
按照yyyy年mmm月dd日显示当前系统时间
SELECT
TO_CHAR(
SYSDATE,'YYYY"年"-MM"月"-DD"日"')
FROM dual
返回所在月的最后一天
SELECT LAST_DAY(SYSDATE) FROM dual
SELECT LAST_DAY('20-2月-09') FROM dual
计算职员入职20周年纪念日
SELECT ename,ADD_MONTHS(hiredate,20*12)
FROM emp_lb;
查看每个员工入职多少个月
SELECT ename,MONTHS_BETWEEN(SYSDATE,hiredate)
FROM emp_lb
查询下个周三是几号
SELECT
NEXT_DAY(SYSDATE,4) as "NEXT_WEDN"
FROM dual
SELECT
LEAST(SYSDATE,TO_DATE('2008-10-10','YYYY-MM-DD')
)
FROM dual
1981年入职的都有谁?
SELECT ename,hiredate
FROM emp_lb
WHERE
EXTRACT(YEAR FROM hiredate)=1981
CREATE TABLE student_lb
(id NUMBER(4),name CHAR(20),gender CHAR(1));
INSERT INTO student_lb VALUES(1000,'李莫愁','F');
INSERT INTO student_lb VALUES(1001,'林平直',NULL);
INSERT INTO student_lb(id,name) VALUES(1002,'张无忌');
SELECT * FROM student_lb
当判断一个字段的值是否为NULL时,不能使用"="判断,而是使用IS NULL或者IS NOT NULL.
UPDATE student_lb
SET gender='M'
WHERE gender IS NULL
SELECT * FROM student_lb
NULL的运算
NULL与字符串连接,等于什么都没干。
NULL与数字运算,结果还是NULL
查看每个员工的收入情况
SELECT ename,sal,comm,sal+comm
FROM emp_lb
NVL(exp1,exp2)函数
若exp1为NULL,则函数返回exp2,否则就返回exp1的值
作用,建一个NULL值替换为一个非NULL值
SELECT
ename,sal,comm,sal+NVL(comm,0)
FROM emp_lb
查看每个员工的奖金情况,若该员工有奖金,则表示“有奖金”,没有这显示“没有奖金”
NVL2(exp1,exp2,exp3)
若exp1的值不为NULL,则返回exp2,若为NULL则返回exp3
SELECT
ename,comm,
NVL2(comm,'有奖金','没有奖金')
FROM emp_lb
实现NVL相同的功能:
SELECT
ename,sal,comm,NVL2(comm,sal+comm,sal)
FROM emp_lb