Oracle的SQL語法
SQL基本語法
一、 基本語句
//DDL 資料定義語言
--1.建立表的語法
create table tb_dengji(
did number primary key,
dname varchar2(20) not null,
usex varchar2(2) not null check(usex='男' or usex='女'),
dfid number not null,
dyj float not null,
drz date default sysdate not null,
dtf date null
);
--2.修改表的語法
Alter table tbname
--3.刪除表
Drop tabletbname
//DML 資料操作語言
--4.插入資料的語法
insert into tbname(sid,sname,sex)
values(2,'李飛','女')
重點:1).插入日期型別的值 (日期資料型別的預設格式為“DD-MON-RR” )
1.使用日期的預設格式 :
INSERT INTOorder_master VALUES('o001', '12-5月-05', 'V002', 'c', '25-5月-05');
2.使用TO_DATE函式轉換 :
INSERT INTOmy_table (date_col) VALUES (TO_DATE('2005-10-18', 'YYYY-MM-DD'));
3.或寫為 date’2013-2-22’
2). 插入來自其它表中的記錄
INSERT INTO<table_name> [(cloumn_list)]
SELECT column_names FROM<other_table_name>;
--5.查詢語法
select * from tbname
注意:儘量不使用*,要什麼取什麼,它會降低效能,佔用多餘記憶體。
--利用現有的表建立表
CREATE TABLE <new_table_name> AS
SELECTcolumn_names FROM <old_table_name>;
CREATE TABLE newitemfile2 AS SELECT * FROM itemfile WHERE 1 = 2;
--6.修改語法
update tbname set sex='男' where sname='張揚'
update tbnameset sid=3, sex='女' where sname='張揚'
--7.刪除語法
delete from tbname where sname='李飛'
二、 模糊查詢
--查詢姓名裡面含有'S'的僱員資訊
select * from emp where enamelike '%S%'
SELECT SName AS 學員姓名,SAddress As 地址 FROM Students WHERE SAddressIN ('北京','廣州','上海')
三、排序
--按薪水的高低進行排序
select * from emp order bysal desc;--降序排列
select * from emp order by sal asc;--升序排列
四、偽表(dual)、偽列(rownum每行的唯一標號,rowid實體地址)
--偽表dual的概念
select 'a' from dual
注意:rownum不能單獨使用‘=’、‘>=‘、‘>’比較符,且rownum>6 and rownum<9與rownum>=6這都是不允許的,但rownum>=6 and rownum<9這是可行的。
Select * from(
Select a.*,rownum rn from emp a
)x where x.rn>3 and x.rn<8;//此時x表裡的rn列不再是偽劣;
五、連線
1.union
select 'a' from dual
union
select 'b' from dual;--行合併
2.inner join、leftjoin、right join、fulljoin
SELECTS.SName AS 姓名, CS.CourseNameAS 課程, C.Score AS 成績
FROMStudents S
INNER JOIN Score C ON (S.SCode = C.StudentID)
INNERJOIN Course CS ON (CS.CourseID =C.CourseID)
六、聚合函式
Count()、sum()、max()、min()、avg()
--||在oracle中是連線字元的意思 ‘a’||’b’ => ‘ab’
七、nvl()
nvl(condition,value);此方法:若condition為空,則值用value的值來填充。
八、子查詢
--查詢Student表中最大和最小的Sbirthday日期值。
select a.sbirthday from( --floor(sysdate-sbirthday)用來求兩個日期間相差的天數
select floor(sysdate-sbirthday) tdate,sbirthday fromstudent)a
join(select max(floor(sysdate-sbirthday))mindate,min(floor(sysdate-sbirthday)) maxdate from student)b
on a.tdatein(b.mindate,b.maxdate);
--以班號和年齡從大到小的順序查詢Student表中的全部記錄。
select * from(
select a.*,to_number(to_char(sysdate,'yyyy'))-to_number(to_char(sbirthday,'yyyy'))as age from student a
) b order by b.class desc,b.age desc;