岩兔站是学过SQL Server的,Oracle其实很少接触,但是因为工作需要必须要学习一下,一边学习一边整理。希望能帮到初学Oracle的同学。
管理表
创建表
使用CREATE TABLE 语句创建表,创建表时通常需要设置4个属性,包括表名、数据类型、约束及表的参数设置。
语法
CREATE TABLE table_name ( clumn_name datatype [column_level_constraint] ... [,table_level_constraint]) [parameter_list];
常见数据类型
CHAR(n) | 存储固定长度的内容 |
VARCHAR2(n) | 存储可变长度字符串 |
NUMBER(p,s) | 可存储0、正数和负数。p表示精度,s表示刻度 |
DATE | 存储日期和时间 |
TIMESTAMP(n) | 表示时间戳,是DATE数据类型的扩展 |
RAW(n)/LONG RAW | 存储可变长的二进制数据 |
示例:创建用户表
CREATE TABLE user( id NUMBER(6,0) PRIMARY KEY, name VARCHAR(20));
修改表
增加列
ALTER TABLE user ADD(phone_number VARCHAR2(20));
修改列名和字段类型
ALTER TABLE user RENAME CLUMN name TO first_name; ALTER TABLE user MODIFY first_name CHAR(25);
删除列
ALTER TABLE user DROP(phone_number);
删除表
DROP TABLE user;
数据操作
数据插入
使用INSERT INTO语句进行单条插入:
语法: INSERT INTO table_name [(column1[,column2...])] VALUES (value1[,value2...]); 示例: INSERT INTO user VALUES ('岩兔站','男');
将查询结果插入表中
INSERT INTO user SELECT * from user_profile;
多表插入
语法: INSERT INTO table1 (column1[,column2...]) INTO table2 (column1[,column2...]) ... subquery; 示例: INSERT [ALL] INTO table1 (name,gender) INTO table2 (first_name,gender) AS SELECT name,gender FROM user;
数据修改
利用UPDATE语句进行内容修改,如:
UPDATE user SET age = age+1;
删除数据
利用DELETE语句进行内容修改,如:
DELETE FROM user WHERE id = 2;
数据查询
无条件查询
--查询所有字段 SELECT * FROM user; --查询指定字段 SELECT name,gender FROM USER; --别名查询 SELECT name new_name FROM USER; --使用函数和运算 SELECT UPPER(name),salary*0.8 FROM user;
条件查询
查询条件 | 运算符 |
关系运算符 | =, <, >, <=, >=, <>, != |
确定范围 | BETWEEN AND, NOT BETWEEN AND |
确定集合 | IN, NOT IN |
字符匹配 | LINE, NOT LINE |
空值判断 | IS NULL, IS NOT NULL |
逻辑操作 | NOT, AND, OR |
示例:
SELECT * FROM user WHERE age >= 18; SELECT * FROM user WHERE age BETWEEN 18 AND 30; SELECT * FROM user WHERE id in (1,3,5); --查询第二个字母为s的所有用户 SELECT * FROM user WHERE name LIKE '_s%'; SELECT * FROM user WHERE age IS NOT NULL; SELECT * FROM user WHERE age BETWEEN 18 AND 30 AND name LIKE '_s%';
查询排序
使用ORDER BY语法,可同时使用DESC和ASC进行降度和升序排列。
SELECT * FROM user ORDER BY id DESC; SELECT * FROM user ORDER BY id ASC;
查询统计
包括COUNT,AVG,MAX,MIN,SUM等聚集函数。
--查询总数,平均,最大,最小年龄 SELECT COUNT(*),AVG(age),MAX(age),MIN(age) FROM user;
分组查询
使用GROUP BY语句进行分组,HAVING子句限制分组的返回结果,WHERE子句对表中的记录进行过滤
--以部门进行分组并查询平均年龄 SELECT dept_id,count(*),avg(age) FROM user GROUP BY dept_id --进行条件限制:在所有男性用户中,查询平均年龄大于10岁的部门 SELECT dept_id,count(*),avg(age) FROM user where gender = '男' GROUP BY dept_id HAVING avg(age) > 18;
多表查询
两个有关联的表进行统一查询,语法为:
SELECT t1.column,t2.column[,...] FROM t1,t2[,...] WHERE condition;
如:有用户表和部门表,用户表中只储存部门id,部门表中储存部门名称,如果要得到用户名和部门的集合,可以用以下语句:
SELECT u.name,d.dept_name FROM user u,dept d WHERE u.dept_id = d.id;
视图创建与管理
视图是从数据表中虚拟出来的表,它实际上并不存在的。视图可以将多个表进行关联,并且生成一个新“表”,以方便查询和调用。
创建视图
语法:
CREATE [OR REPLACE] view [(alias[,...])] AS Subquery;
例:如果不存在视图则创建,如果存在则修改
CREATE OR REPLACE newview (id,name,gender) AS SELECT user_id,first_name,gender FROM user;
删除视图
删除视图后,原始数据不受影响
DROP VIEW view_name;
数据格式转换
Oracle中有很多数据类型,不同类型之间如何转换呢?主要包括to_data()、to_char()、to_number()等。
示例:
SELECT to_date('2018-05-25','yyyy-mm-dd'); 25-5月-18 SELECT to_char(sysdate,'yyyy-mm-dd'); --2018-05-25 SELECT to_number('$123.45','$9999.99'); --123.45
总结
基本上所有数据库的语法都大同小异,掌握了Oracle的语法,会很容易学会SQL Server或MySQL。
以上列举的只是最基础的语法,但是能满足多数情况下的需求,岩兔站也是边学边写,等学到了新的语法,会再更新上。
有什么疏漏或错误的,欢迎留言指正,咱们共同进步。