本文是我学习《Oracle.10G.数据库系统教程.中科院培训老师讲授》视频教程的笔记,有需要视频者,请留下邮箱。
目录
1、SQL语言概述、分类
2、各种语言常见语句写法
3、常用查询语句的使用
4、常用系统函数及其应用
5、分组语句
6、模糊查询
7、表的连接
8、子查询
1、SQL语言概述、分类
语言分类
1、DDL 数据定义语言
1)CREATE
2)ALTER
3)DROP
2、DCL 数据控制语言
1)GRANT
2)REVOKE
3、DML 数据操作语言
1)SELECT
2)INSERT
3)DELETE
4)UPDATE
2、各种语言常见语句写法
1、DDL 数据定义语言
1)CREATE
CREATE TABLE abc(a varchar2(10), b char(10));
2)ALTER
ALTER TABLE abc ADD c number;
ALTER TABLE abc DROP COLUMN c;
2、DCL 数据控制语言
1)GRANT
GRANT SELECT ON dept TO tt; --授权
2)REVOKE
REVOKE SELECT ON dept FROM tt; --收回权限
3、DML 数据操作语言
1)SELECT
SELECT * FROM abc;
2)INSERT
INSERT INTO abc(a,b) VALUES ('abc', 'xy');
INSERT INTO abc VALUES ('bcd', '123');
4)UPDATE
UPDATE abc SET b='ttt';
UPDATE abc SET b='YYY' WHERE a='abc';
3)DELETE
DELETE FROM abc WHERE a='abc';
4、常用系统函数及其应用
常用系统函数
1、字符
length,ltrim,replace,rtrim,substr,trim
2、日期
Sysdate,current_date,next_day
3、转换
To_char,to_date,to_number
4、聚集函数
Sum,avg,max,min,count
5、其他
user,decode,nvl
1、字符
SELECT LENGTH('ABCDEF') FROM dual; --6
SELECT LENGTH('ABC好EF') FROM dual; --6
SELECT LENGTHB('ABC好EF') FROM dual; --7
LENGTH 字符数
LENGTHB 字节数
SELECT LENGTHB(' ABC好EF') FROM dual; --8
SELECT LENGTH(LTRIM(' ABC好EF')) FROM dual; --6
可变长和定长字符串什么区别?
给定一个长度(字符数的上限)以后,没有写满的时候,
可变长的会自动把未用的空间节省出来,
定长的用空格来补。
UPDATE aa SET a3='aa';
SELECT LENGTH(A2), LENGTH(A3) FROM aa;
SELECT SUBSTR('abcdefg',2,3) FROM dual; --bcd
SELECT SUBSTR('abcdefg',1,3) FROM dual; --abc
SELECT SUBSTR('abcdefg',LENGTH('abcdefg')-3,3) FROM dual; --efg
斌:其实下面SQL就可以(不加长度,则到字符串的末尾):
SELECT SUBSTR('abcdefg',-3) FROM dual; --efg
2、日期
SELECT sysdate FROM dual; --当前时间
SELECT current_date FROM dual; --当前时间
ALTER SESSION SET NLS_DATE_FORMAT='dd-mon-yyyy hh:mi:ss'; --设置时间格式
斌:注意hh表示12小时制,h24表示24小时制。
SELECT NEXT_DAY(sysdate, '星期三') FROM dual; --下一个星期三的这个时间
斌:比如现在是20:35:20,那么会得到下一个星期三的20:35:20。
如果今天是星期三,那么返回七天后的20:35:20。
3、转换
SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh:mi:ss') FROM dual;
SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss') FROM dual;
SELECT TO_DATE('12-3月-04') FROM DUAL;--0004-03-12
斌:常用下面SQL
SELECT TO_DATE('20110801203935', 'YYYYMMDDHH24MISS') FROM dual; --2011-08-01 20:39:35
SELECT TO_NUMBER('00333') FROM DUAL; --333
4、聚集函数
SELECT * FROM books;
SELECT MAX(price) FROM books; --查看价格最大值
SELECT MIN(price) FROM books; --查看价格最小值
SELECT SUM(price) FROM books; --查看价格和值
SELECT avg(price) FROM books; --查看价格平均值
SELECT count(price) FROM books; --查看price的行数
SELECT COUNT(*) FROM books; --查看表books的行数
斌:注意不是查询共有多少种不同的价格,
查询共有多少种不同的价格用下面的SQL:
SELECT COUNT(*) FROM (SELECT DISTINCT price FROM books);
一个表中字段的行数和表的行数可能不一致,
因为不统计null。
所以,
查看表的行数:
SELECT COUNT(*) FROM tableName;
另外,查看表的的列数:
SELECT COUNT(*) FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = UPPER('tableName');
WHERE不能和聚集函数结合。
5、其他
SELECT user FROM dual; --用户名
SELECT SUM(DECODE(SEX,'男',1,0)) 男人数,
SUM(DECODE(SEX,'女',1,0)) 女人数
FROM e;
SELECT a1,nvl(a2,'未输入') a2 FROM aa;
SELECT * FROM aa WHERE a2 IS NULL;
SELECT * FROM aa WHERE a2=NULL; --错误
SELECT * FROM aa WHERE a2 IS NOT NULL;
SELECT * FROM aa ORDER BY a1 ASC; --按a1升序
SELECT * FROM aa ORDER BY a1 DESC; --按a1降序
SELECT DISTINCT a1 FROM aa; --不重复显示a1
SELECT ALL a1 FROM aa;
5、分组语句
SELECT * FROM books;
SELECT sum(price*qty) FROM books;
SELECT sum(price*qty) FROM books GROUP BY pub;
SELECT put, sum(price*qty) FROM books GROUP BY pub;
SELECT put, sum(price*qty) FROM books GROUP BY pub, book_name;
SELECT put, sum(price*qty) FROM books WHERE price>30 GROUP BY pub, book_name;
SELECT put, sum(price*qty) FROM books GROUP BY pub HAVING sum(price)>30;
SELECT * FROM aa;
SELECT a1, count(a1) FROM aa GROUP BY a1 HAVING COUNT(a1)>1;
--查哪条重复
6、模糊查询
SELECT * FROM aa WHERE a1 LIKE 'a_';
SELECT * FROM aa WHERE a1 LIKE 'a%';
SELECT * FROM aa WHERE a1 LIKE '_a';
SELECT * FROM aa WHERE a1 LIKE '%a';
SELECT * FROM aa WHERE a1 LIKE '%a%';
SELECT * e WHERE ename LIKE '张%';
SELECT * FROM e;
SELECT * FROM d;
7、表的连接
SELECT eid 编号, ename 姓名, sex 性别, id 所在部分 FROM e;
SELECT eid 编号, ename 姓名, sex 性别, d.name 所在部分 FROM e,d
WHERE e.id=d.id;
SELECT eid 编号, ename 姓名, sex 性别, d.name 所在部分 FROM e JOIN d
ON e.id=d.id;
SELECT eid 编号, ename 姓名, sex 性别, d.name 所在部分 FROM e,d
WHERE e.id=d.id(+);
--左外连接
SELECT eid 编号, ename 姓名, sex 性别, d.name 所在部分 FROM e,d
WHERE e.id(+)=d.id;
--右外连接
8、子查询
无关子查询 相关子查询
SELECT * FROM e;
SELECT * FROM e WHERE eid='002';
SELECT * FROM e WHERE id IN (SELECT id FROM d);
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 EXISTS (SELECT id FROM d WHERE id=e.id);
SELECT * FROM e WHERE NOT EXISTS (SELECT id FROM d WHERE id=e.id);
SELECT * FROM e WHERE NOT EXISTS (SELECT * FROM d WHERE id=e.id);
SELECT eid, ename FROM e
UNION
SELECT id, name FROM d;
SELECT id FROM e
INTERSECT
SELECT id FROM d;
--返回两者都匹配的行
INSERT INTO e(eid, ename) SELECT id,name FROM d;
CREATE TABLE ttt AS (SELECT * FROM e);
CREATE TABLE ttt AS SELECT e.id,e.name FROM e WHERE eid='001';