第三天.SQL语言基础
SQLSERVER,ACCESS都用SQL结构化查询语言,这是数据库中不可少的一部分,当然ORACLE也强支持!
sqlplus
connect scott/tiger 登陆
create table abc(a varchar2(10),b char(10)); 新建一个表
alter table abc add c number; 向表里添加一个字段
drop table abc; 删除表里的所有信息
alter table abc drop column c; 删除表里的一个字段
insert into e(eid,ename) values('','');只能插入一条记录。
insert into e(eid,ename) select id,name from d;把D表中的结果集插入到当前表中,类型,字段匹配。
create table name(t char(10))创建一个新表。
create table t as (select ID,NAME from e);把E表中的ID,NAME字段和对应的记录复制到新表T中。后面的括号可以不加。
connect tt/tt11 登陆
select * from scott.dept; 查询某用户下的表,但是没有权限
conn scott/tiger 登陆
grant select on dept to tt;受权给TT,可以操作DEPT表的SELECT
remoke select on dept from tt;收回SELECT权限
insert into abc(a,b,c) values('c','b','a'); 插入一条记录
insert into abc values('c','b','a');
update abc set a='a',b='b' where c='c'; 更新记录
delete from abc; 删除表中的所有记录
delete from abc where c='c'; 删除WHERE条件的记录
常用系统函数:
1、字符
length
select left('abcdef') from dual;查它的字符数
select lengthb('fdafa ');查询它的字节数
select ltrim(' fadf ') from dual;删除左边空格
rtrim,trim分别删除右边和两边的字符;
如果定义的字段为定长的,这时候如果字符不够则会补空格;
SUBSTR
select substr('abcdefg',2,3) from dual;取指定第几个到第几个的字符
ORACLE中不支持LEFT,RIGHT函数
2、日期
select sysdate from dual;表示当前时间
alter session set nls_date_format='dd-mon-yyyy hh:mi:ss' 设定日期格式
select current_date from dual;查询上面指定格式的日期
select next_day(sysdate,'星期三') from dual;查询当前下个星期,指定星期数的那个日期
3、转换
select to_char(sysdate,'yyyy-mm-dd') from dual;把日期转换为指定格式的字符串
to_date:转换成日期格式
to_number:转换为数字型
4、聚集函数
sum:select sum(price) from books:查询价格的总值
avg:平均值
max:select max(price) from books;查询价格的最大值
min:查询最小值
count:总共多少记录,行数count(*),count(price),一般查询出的结果是一样的,但有些情况是不一样的,当某字符允许有空值的时候就会出现差别
5、其它
user:select user from dual;查询当前登陆账号,conn tt/tt11登陆
select sum(decode(sex,'男',1,0)) 男人数,sum(decode(sex,'女',1,0)) 女人数 from e;查询男人数和女人数的个烽
select a1,nvl(a2,'没有输入') from aa;但询a2字段如果为空值就显示“没有输入”
select * from aa where a2 is null;查询A2为空的记录
select * from aa order by a1 desc;按降序排列,ASC为升序.
select distinct a1 from aa;只显示重复的一条,distinct
分组语句
select sum(price*qty) from books;查询全部总金
select pub,sum(price*qty) from books group by pub;分组查询每个出版社的总金,前面的PUB和后面的PUB一定要对应
SUM聚集函数不能在WHERE中出现
模糊查询
select a1 from where a1 link 'a_';以A开头的任意单个字符结尾的
LINK 'A%':以多个结尾字符结尾的
LINK '%A%':只要包含A就能查出来
表的连接
查询二个或二个以上的表
select eid 编号,ename 姓名,sex 性别,id 所在部门 from e;
内连接(两个表完全匹配)
select eid 编号,ename 姓名,sex 性别,d.id 所在部门 from e,d where e.id=d.id;如果两个表中都有ID这个字段,这里就要在字段列表中表名.字段
select eid 编号,ename 姓名,sex 性别,d.id 所在部门 from e join d on e.id=d.id;和上一条语句一样,但标准是这一种格式
外连接(左连接,右连接)
左外连接:
select eid 编号,ename 姓名,sex 性别,d.id 所在部门 from e,d where e.id=d.id(+);以左边的记录为准,左边的记录全部显示,右边显示符合条件的记录
右外连接:where e.id(+)=d.id;与左连接相反
子查询
select * from e where id in(select id from d);这是无关子查询,从D里找E
select * from e where id in(select id from d where id=e.id and id='03');后面那个子查询不能使用*,这样会出现错误
select * from e where exists(select id from d);是否存在;这两个后成可以用*
select * from e where not exists(select id from d);查询不存在的记录
补充
selec eid,ename from e union select id,name from d;把E表和D表中的结果集合并到一起来,如果有重复的记录则只显示一条
select id from e intersect select id from d;返回两者都匹配的记录(ORACLE中独有的)