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;