Oracle-Sql基本语法

1、SQL

1 sql句的所有表名、字段名全部小写;系保留字、内置函数名、sql保留字大写。

2 接符orinand以及=<=>=等前后加上一个空格。

3 对较为sql句、程、函数加上注明算法、功能。

4 多表,使用表的名来引用列。

2数据操纵语(DML)-用来操数据中数据的命令

2.1     select

构:

SELECT * | {[DISTINCT] column | expression [alias],…}

FROM     table

[WHERE condition(s)]

[ORDER BY {column, expr, alias} [ASC|DESC]];

1查询全部列

SELECT * FROM departments;

2查询特定列

SELECT department_id, department_name FROM departments;

3有数学运算符(+-*/)查询

SELECT last_name, salary + 300 FROM employees;

4)使用

SELECT last_name AS name FROM employees;

5 使用接符”||”合并列

SELECT last_name || “ is a ” || job_id AS emp FROM employees;

6 使用DISTINCT去掉重复行

SELECT DISTINCT department_id FROM employees;

 

2.2     insert

1 直接插入一行记录

INSERT INTO Persons VALUES (‘Gates’,’Bill’,’10’,’Beijing’);

2 指定列插入记录

INSERT INTO Persons (LastName, Address) VALUES (‘Wilson’,’Beijing’);

3 使用select into select插入数据

INSERT INTO test2 (id,testname) SELECT SEQ_TEST.NEXTVAL,testname FROM test1

2.3     update

1 常用的

UPDATE table1 SET state = ‘1’ WHERE year = ‘2012’;

2 使用update set from更新

UPDATE table2 SET (t2Name) = (SELECT t1Name FROM table1 WHERE table2.id = table1.id);

2.4     delete

1 基本用法

DELETE FROM courses WHERE courseName = ‘Java’;

2.5     where子句

1)一般条件筛选

SELECT ename, job FROM emp WHERE ename = ‘JAMES’;

2)使用BETWEEN示某一内的记录

SELECT ename, sal FROM emp WHERE sal BETWEEN 1000 AND 1500;

3)使用IN取匹配列表记录

SELECT empno, ename, sal, mgr FROM emp WHERE mgr IN (79, 44, 78);

4)使用LIKE行通配查询

SELECT ename FROM emp WHERE ename LIKE ‘_A%’;

5查询包含空记录

SELECT ename, mgr FROM emp WHERE mgr IS NULL;

6 ANDOR运算符

SELECT empno FROM emp WHERE sal > 100 AND job = ‘CLERK’;

注:运算符

小括号>所有比运算符>NOT>AND>OR

2.6     ORDER BY子句

SELECT ename, deptno, sal FROM emp ORDER BY deptno, sal DESC;

2.7     GROUP BY子句

SELECT departmentId, count(*) FROM emp GROUP BY departmentId;

注:聚合函数有avg()max()min()sum()count()

2.8     HAVING子句

SELECT customer, SUM(orderPrice) FROM orders GROUP BY customer HAVING SUM(orderPrice)<2000;

2.9     LEFT JOINRIGHT JOININNER JOINFULL JOIN

SELECT * FROM a;

No            Name

1000       

2000        李四

3000        王五

SELECT * FROM b;

No            Commodity

1000        电视

2000        像机

4000        自行

SELECT a.*, b.* FROM a LEFT JOIN b ON a.No = b.No;

No            Name     No          Commodity

1000               1000      电视

2000        李四       2000      像机

3000        王五       null        null

SELECT a.*, b.* FROM a RIGHT JOIN b ON a.No = b.No;

No            Name     No          Commodity

1000               1000      电视

2000        李四       2000      像机

null          null        4000      自行

SELECT a.*, b.* FROM a INNER JOIN b ON a.No = b.No;

No            Name     No          Commodity

1000               1000      电视

2000        李四       2000      像机

SELECT a.*, b.* FROM a FULL JOIN b ON a.No = b.No;

No            Name     No          Commodity

1000               1000      电视

2000        李四       2000      像机

3000        王五       null        null

null          null        4000      自行

2.10  UNIONUNION ALL

SELECT * FROM student;

Id             Name     Score

1                            Aaron    78

2                            Bill         76

3                            Cindy    89

4                            Damon  90

5                            Ella        73

6                            Frado     61

7                            Gill        99

8                            Hellen   56

9                            Ivan      93

10            Jay        90

SELECT * FROM student WHERE id < 4 UNION SELECT * FROM student WHERE id > 2 AND id < 6;

Id             Name     Score

1                            Aaron    78

2                            Bill         76

3                            Cindy    89

4                            Damon  90

5                            Ella        73

SELECT * FROM student WHERE id < 4 UNION ALL SELECT * FROM student WHERE id > 2 AND id < 6;

Id             Name     Score

1                            Aaron    78

2                            Bill         76

3                            Cindy    89

3                            Cindy    89

4                            Damon  90

5                            Ella        73

2.11ANY(SOME)

SELECT * FROM student WHERE age < ANY (20,22,25,27);

2.12ALL

SELECT * FROM student WHERE age > ALL(20,22,25,27);

2.13IN(NOT IN)

       SELECT * FROM persons WHERE lastName IN (‘Ada’,’Carter’);

2.14EXISTS(NOT EXISTS):返回真/

        A

              ID          NAME

1                A1

2                A2

3                A3

B

ID          AID       NAME

1            1            B1

2            2            B2

3            2            B3

SELECT ID,NAME FROM A WHERE EXIST(SELECT * FROM B WHERE A.ID = B.AID);

果:

1                A1

2                A2

分析如下:

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=)
--->SELECT * FROM B WHERE B.AID=
1有返回真所以有数据
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
--->SELECT * FROM B WHERE B.AID=
2有返回真所以有数据
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
--->SELECT * FROM B WHERE B.AID=
3无返回真所以没有数据
NOT EXISTS 就是反
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)

3       A3

2.15、函数的使用

SELECT TO_CHAR(sal, ‘$99.999’) AS SALARY,NVL(job,’NO JOB!’)

FROM emp

WHERE UPPER(ename) = ‘SCOTT’

AND createDate >= TO_DATE(‘2012-10-25’,’yyyy-MM-dd’);

 

select value,lead(value,1) over(order by vtime) value2,

vtime,lead(vtime,1) over(order by vtime) vtime2 from leadtest

3数据定义语(DDL)-用来建立数据、数据库对象和定列的命令

3.1create

1建一个表空

create tablespace tablespaceName datafile ‘f:\oracle\oradata\aa.dbf’ size 2000M;

2建一个用

create user userName identified by password default tablespace tablespaceName;

3)授权给新用

grant connect, resource to userName;

4建一个用

create table table1 (

              no          varchar(15)         not null,

              name     varchar(50),

              age        number(3),

              state      char(1)

;

5建一个索引

create index indexName on table1(no);

6 建一个存储过

CREATE OR REPLACE PROCEDURE procedureName

IS

BEGIN

insert into test2(username,password) (select username,password from test);

END;

用存储过程:

call procedureName();

如果常需要特定操作,那么可以建立存储过程,可以化开维护

安全性高。

7建一个自定函数

CREATEORREPLACEFUNCTIONfunctionName(v_nameinvarchar2)

RETURNVARCHAR2

IS

BEGIN

return(v_name||' hello');

END;

自定函数用:

selectfunctionName(username) fromtestt

8建一个视图

CREATEORREPLACEVIEWviewNameAS

SELECTt.yh_mc,d.bm_mcFROMyh_xxbt,dm_bmgldwheret.bm_dm=d.bm_dm;

使用视图的好

后会有非常复逻辑视图可以用来方便理解,可以当作中间层简逻辑

基于安全考,可以针对特定的视图赋给户权限,而不是户赋给一个或几个表的限,这样可以避免操作更新数据的不安全因素

9建一个触

Createorreplacetriggeryh_xxb_delete_log

Beforeinsertorupdateordelete

Onyh_xxb

Begin

Insertintotest_log(Who,when) Values( user, sysdate);

End;

器的触

deletefromyh_xxbtwheret.yh_dm='001100'

3.2alter

1 表添加一列

alter table employ add(weight number(38,0));

2)表修改列

alter table employ modify(weight number(13,2));

3)表修改列名称

alter table emp rename column weight to weight_new;

4)表除列

alter table emp drop column weight_new;

5)表修改表名

alter table emp rename to emp_new;

3.3drop

1除表空

drop tablespace tablespaceName;

2 除用

drop user userName;

3 除表

drop table tableName;

4数据控制(DCL)-用来控制数据库组件的存取可、限等的命令

4.1grant

grant create table to userName;

4.2revoke

revoke create table from userName;

 

充知点:

1 看当前用下所有表占用的空情况:

Select segment_name, tablespace_name, bytes, blocks from user_segments

2 按用户查看所占用的数据大小:

Select owner, SEGMENT_TYPE, sum(BYTES)/1024/1024 as SIZE_M from dba_segments group by owner, SEGMENT_TYPE;

3TOPLIMITROWNUM

    一个表userinfo,一个自增userId,一个字段userName.

    3.1查询其中前10记录

       1SqlServer数据

Select top 10 * from userinfo;

2 oracle数据

select * from userinfo where rownum <= 10;

注:rownumoracle数据果集之后再加上去的一个列。

所以Select * from userinfo where rownum > 10不出果的。

3 Mysql数据

Select * from userinfo limit(0,10);

3.2查询10—20记录

1 SqlServer数据

Select top 10 * from userinfo where userId in(select top 20 userId from userinfo) order by userId desc;

Select top 10 * from userinfo where userId >

(select max(userId) from (select top 10 userId from userinfo order by userId) a)

2 oracle数据

select * from (select rownum as num, u.* from userinfo u where rownum <= 20) where num >= 10;

3Mysql数据

    Select * from userinfo limit(10,10);

 

 

1

Oracle常用方法

abs(m) m绝对值

mod(m,n) mn除后的余数

power(m,n) mn次方

round(m[,n]) m四舍五入至小数点后n位的n缺省0

trunc(m[,n]) m截断n位小数位的n缺省0

 

字符函数:

initcap(st) 返回st将每个单词的首字母大写,所有其他字母小写

lower(st) 返回st将每个单词的字母全部小写

upper(st) 返回st将每个单词的字母全部大写

concat(st1,st2) 返回stst2st1的末尾(可用操作符"||"

lpad(st1,n[,st2]) 返回右对齐st,stst1的左st2填充直至n,st2的缺省空格

rpad(st1,n[,st2]) 返回左对齐st,stst1的右st2填充直至n,st2的缺省空格

ltrim(st[,set]) 返回st,st从左边删set中字符直到第一个不是set中的字符。缺省,指的是空格

rtrim(st[,set]) 返回st,st从右边删set中字符直到第一个不是set中的字符。缺省,指的是空格

replace(st,search_st[,replace_st]) 将每次在st中出search_streplace_st,返回一个st。缺省search_st

substr(st,m[,n]) n=返回st串的子串,从m位置开始,取n个字符缺省,一直返回到st末端

length(st) ,返回st中的字符数

instr(st1,st2[,m[,n]]) ,返回st1从第m字符开始,st2n次出的位置,mn的缺省值为1

 

转换函数:

nvl(m,n) 如果m值为null,返回n,返回m

decode(var,1,value1,2,value2,3,value3,last) 如果var等于1返回value1,等于1返回value2,等于3返回value3,返回last

to_char(m[,fmt]) m从一个数值转换为指定格式的字符串fmt缺省fmt度正好能容所有的有效数字

to_number(st[,fmt]) st从字符型数据转换成按指定格式的数,缺省格式串的大小正好整个数

 

函数:

avg([distinct/all] n) n的平均

count([all] *) 返回查询内的行数包括重复和空

count([distinct/all] n) 非空的行数

max([distinct/all] n) 列或表达式的最大

min([distinct/all] n) 列或表达式的最小

stdev([distinct/all] n) 列或表达式的准偏差,忽略空

sum([distinct/all] n) 列或表达式的

variance([distinct/all] n) 列或表达式的方差,忽略空

 

日期函数:

>

add_months(d,n) 日期dn个月

last_day(d) 包含d的月份的最后一天的日期

month_between(d,e) 日期de的月份数,e先于d

new_time(d,a,b) a区的日期和时间db区的日期和时间

next_day(d,day) 比日期d晚,由day指定的周几的日期

sysdate 当前的系日期和时间

greatest(d1,d2,...dn) 出的日期列表中最后的日期

least(d1,k2,...dn) 出的日期列表中最早的日期

to_char(d [,fmt]) 日期dfmt指定的格式转变成字符串

to_date(st [,fmt]) 字符串stfmt指定的格式成日期,若fmt忽略,st要用缺省格式

round(d [,fmt]) 日期dfmt指定格式舍入到最近的日期

trunc(d [,fmt]) 日期dfmt指定格式截断到最近的日期

附:

日期格式:

--------------------------------

格式代 例或可取的范

--------------------------------

DD 月某一天 13

DY    三个大写字母表示的周几 SUN...SAT

DAY    完整的周几,大写英文 SUNDAY...SATURDAY

MM 月份 112

MON     三个大写字母表示的月份 JAN...DEC

MONTH 完整 JANUARY,...DECEMBER

RM 月份的罗马数字 I,...XII

YYYYYY 两位,四位数字年

HH:MI:SS   :分:秒

HH12HH24  以1224时显

MI      分

SS      秒

AMPM    上下午指示符

SP      后SP要求拼写出任何数字段

TH      后TH表示添加的数字是序数 4th,1st

FM 缀对月或日或年,禁止填充

 

练习题

1

Emp 工表

Ename   varchar2(30)       姓名

Empno   number(5)          

Deptno  number(5)          

Job        varchar2(20)       工种(manager-理,clerk-)

Hiredate Date                   雇佣日期

Comm.   Number(6,2)       佣金

Sal         number(6,2)        薪金

 

Dept

Dname  varchar2(30)       名称

Deptno  number(5)          

Loc         varchar2(50)       位置

 

1 找出佣金高于薪金60%工信息

2 找出部门为10的所有理和部门为20的所有的信息

3 找出收取佣金的工的不同工作

4 找出各月最后一天受雇的所有

5 查询只有首字母大写的所有工的姓名

6 查询所有工姓名的前三个字符

7 查询员工的姓名、工作和薪金,按工作降序排列,工作相同按薪金升序排列

8 查询每年2月份雇佣的工信息

 

1 select * from emp where comm. > sal*0.6;

2 select * from emp where(deptno=10 and job=’manager’) or (deptno=20 and job=’clerk’)

3 select distinct job from emp where comm. > 0;

4 select * from emp where hiredate = last_day(hiredate);

5 select ename from emp where ename = initcap(ename);

6 select substr(ename,1,3) from emp;

7 select ename,job,sal from emp order by job desc,sal asc;

8 select * from emp where to_char(hiredate,’MM’)=’02’;

 

 

2 以下三个表的关系:

S (SNO,SNAME)学生表。SNO 学号,SNAME 姓名

C (CNO,CNAME,CTEACHER)程表。CNO 为课程号,CNAME 为课程名,CTEACHER

SC(SNO,CNO,SCGRADE)选课表。SCGRADE

 

1 找出’liming’教授程的所有学生的姓名。

2 找出没有’liming’教授程的所有学生的姓名。

3 找出没有程号’1’的所有学生。

4 列出有二以上(含两)不及格程的学生姓名及其平均成

5 找出即学过语文又学数学的所有学生。

6 找出修了所有程的学生。

7 找出程超2的学生学号。

8 找出程超2的学生学号及姓名。

9 找出修人数大于3的各科的最高成列表(示科目号、成字段)

10找出比数学高的所有学生的学号及文、数学成

11查询选修了程的学生人数。

1)select * from S,C,SC where sc.sno=s.sno and sc.cno=c.cno and c.cteacher='liming'
select * from s join sc ons.sno = sc.sno join c on sc.cno = c.cno where c.cteacher = 'liming'
Select * FROM S Where Sno IN (Select Sno FROM C, SC Where C.Cno = SC.Cno AND CTEACHER = 'liming')
2)Select S Name FROM S Where Sno NOT IN( Select SC.Sno FROM SC,C WhereSC.CNO=C.CNO AND CTEACHER='liming')
3)Select SName FROM S Where Sno NOT IN( Select Sno FROM SC Where CNO='1')
4)select count(*),S.sname,avg(SCGRADE) from S,SC where S.SNO=SC.SNO and SCGRADE<60 group by sname havingcount(*)>=2
5)Select S.SNO,S.SNAME FROM S,(select sc.sno from sc inner join c on sc.cno=c.cno where c.cname in('yuwen','shuxue') group by sc.sno having count(*)=2)SC Where S.SNO=SC.SNO
6)Select S.SNO,S.SNAME FROM S,(SelectSC.SNOFROMSC,CWhereSC.CNO=C.CNOGROUPBYSNOHAVINGCOUNT(*)=(selectcount(*) fromc) )SCWhereS.SNO=SC.SNO
7)SelectSno  FROMSCGROUPBYSnoHAVINGCOUNT(Cno)>2
8)SelectSNo,SNAMEFROMSWhereSnoIN(SelectSno  FROMSCGROUPBYSnoHAVINGCOUNT(Cno)>2)
9)Selectcno,max(scgrade) asmaxstoreFROMSCWherecnoIN (SelectcnoFROMSCGROUPBYcnoHAVINGCOUNT(sno)>3) groupbycnoorderbycno
10)select * from (selects.sno, sc.SCGRADEfroms, sc, cwheres.sno = sc.snoandsc.cno = c.cnoandc.cname = 'yuwen') t1, (selects.sno, sc.SCGRADEfroms, sc, cwheres.sno = sc.snoandsc.cno = c.cnoandc.cname = 'shuxue') t2wheret1.sno = t2.snoandt1.SCGRADE > t2.SCGRADE
11)Select COUNT(DISTINCT Sno) FROM SC

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值