select d.dname 部门名称,count(e.empno) 人数
from dept d left outer join emp e
on (d.deptno = e.deptno)
group by d.dname
set linesize 长度; ---设置每行显示的长度
set pagesize 行数; ---设置每页显示的行数
@d:\demo.txt ----打开某个文件,并执行
@d:\demo -----*.sql文件不需要输入后缀
conn 用户名/密码 [AS SYSDBA] ---- 登陆命令
show user; ---显示当前连接的是哪一个用户
select * from tab; ---得到本用户下的所有表
desc 表名称; ---显示表结构
/ ---表示继续执行上一次的操作命令
NUMBER(4); ---表示数字,长度4位的整型
VARCHAR2(10); ---表示的是字符串,可容纳10个字符
NVARCHAR2(10); ---表示的是字符串,可容纳10个中文字符,20个英文字符
DATE; ---表示日期类型,默认格式是 13-2月-12
NUMBER(7,2); ---表示的是小数,其中小数位占最多2位,整数位最多5位
Sql(Structured Query Language,结构查询语言)
Structured : 结构化
Query : 查询;询问
Language : 语言
大体分类:
DML (Data Manipulation Language ,数据操作语言) ---用于检索或者修改
DDL (Data Definition Language , 数据定义语言) ---用于定义数据的结构,如创建,修改
DCL (Data Control Language, 数据控制语言) ---用于定义数据库用户的权限
SELECT *|列名 别名 FROM 表名称 ----标准查询语句,尽量使用别名点列名的方式操作,方便
SELECT {DISTINCT} *| 具体的列名 别名 FROM 表名称; ---消除重复列值,如果查询多列,这必须保证多列都有重复的值;Distinct :截然不同的,完全分开的
SELECT '编号:'||empno||'姓名:'||name||'年龄:'||age FROM EMP; ---字符串连接
SELECT 12*SAL-12+1/AGE FROM EMP; ---支持四则运算 +,-,*,/
SELECT {DISTINCT}*|具体的列 列名 FROM 表名称 {WHERE 条件(s)} ---Where子句限定查询
---逻辑运算符:<,>,=,>=,<=,
SELECT * FROM emp WHERE comm IS NOT NULL; ---查询comm列不为空的数据
SELECT * FROM emp WHERE comm IS NULL; ---查询comm列为空的数据
SELECT * FROM emp WHERE sal>1500 AND comm IS NOT NULL; --查询条件连接符
SELECT * FROM emp WHERE sal>1500 OR comm IS NOT NULL; ---查询条件或连接符,可以连接多个条件
SELECT * FROM emp WHERE NOT (sal>1500 AND comm IS NOT NULL); ---Not取反,不是或者不在这个范围内
SELECT * FROM emp WHERE sal>1500 AND sal<300 ----指定范围查询
SELECT * FROM emp e WHERE e.sal BETWEEN 1500 AND 3000; --指定范围查询
SELECT * FROM emp e WHERE e.hiredate BETWEEN '1-1月 -81' AND '31-12月 -81'; ---指定时间范围查询
SELECT * FROM emp IN(7369,7499,7521); ---In 范围查询,也可以是字符串,日期。。
SELECT * FROM emp NOT IN(7369,7499,7521); ---Not In 范围查询
----字符模糊查询,'%':可以匹配任意长度字符的内容; '_':可以匹配一个字符的内容
SELECT * FROM emp WHERE ename LIKE '_M%'; ---Like模糊查询,可以是日期,数字,字符串,。。。
SELECT * FROM emp WHERE empno <> 7369; //<> ,不等于
SELECT * FROM emp WHERE empno != 7369; //!=,不等于
-----------------ORDER BY 子句 排序------------------------
SELECT {DISTINCT}*|具体的列 别名 FROM 表名称 {WHERE 条件(s)} {ORDER BY 排序字段1,排序字段2 ASC|DESC} ---排序语句一般放在最后执行
--ASC 表示升序
--DESC 表示降序
function_name(column|expression[arg1,arg2...])
参数说明:
* function_name: 函数名称
* column: 数据库列名
* expression : 字符串或计算表达式
* arg1,arg2 : 在函数中使用参数
单行函数分离:
* 字符函数:接受字符输入并且返回字符或数值
* 数值函数: 接受数值输入并返回数值
* 日期函数: 对日期型数据进行操作
* 装换函数: 从一种数据类型转换为另一种数据类型
* 通用函数: NVL函数,Decode 函数
SELECT UPPER('amith') FROM DUAL; ---UPPER将小写字母转换成大写
SELECT LOWER('HELLO!') FROM DUAL; ---LOWER将大写字母转换成小写
SELECT INITCAP('hello!') FROM DUAL; ---将每个单词的第一个字母大写,其后小写
SELECT CONCAT('Hello','World!') FROM DUAL; --- CONCAT字符串连接函数,连接几个字符串
SELECT SUBSTR('hello',1,3) FROM DUAL; ---从第1个字符开始截取,截取3个字符,从0或者1开始都是一样的。
SELECT SUBSTR('hello',-3,3) FROM DUAL; ---从倒数第三个开始截取,截取三个字符
SELECT LENGTH('hello') FROM DUAL; ---求出字符长度
SELECT REPLACE('hello','l','x') FROM DUAL; ---字符串替换,把所有l,替换成x
SELECT INSTR(''CORPORATE FLOOR'',''OR'', 3, 2) FROM DUAL;----字符串查找 源字符''CORPORATE FLOOR'', 目标字符串''OR'',起始位置为3,取第2个匹配项的位置;
SELECT ROUND(897.536) FROM DUAL; ---四舍五入
SELECT ROUND(783.321,2) FROM DUAL; ---四舍五入保留两位小数
SELECT ROUND(789.536,-2) FROM DUAL; ---对整数进行四舍五入,结果:800
SELECT TRUNC(789.536) FROM DUAL; ---截取整数,不会进行四舍五入
SELECT TRUNC(789.536,2) FROM DUAL; ---截取两位小数,不会进行四舍五入 结果:789.53
SELECT TRUNC(789.536,-2) FROM DUAL; ---截取整数,不会进行四舍五入,结果700
SELECT MOD(10,3) FROM DUAL; ---取余数,结果:1
日期函数的规律:
* 日期 - 数字 = 日期
* 日期 + 数字 = 日期
* 日期 - 日期 = 数字(天数)
SELECT SYSDATE FROM DUAL; ---求出当前日期, 30-3月-12
SELECT MONTHS_BETWEEN(sysdate,hiredate) FROM emp; --求出给定范围的月数
SELECT ADD_MONTHS(SYSDATE,4) FROM DUAL; ---求出增加后的月数
SELECT NEXT_DAY(SYSDATE,'星期一') FROM DUAL; ---求出下一个星期一是几号
SELECT LAST_DAY(SYSDATE) FROM DUAL; ---求出本月的最后一天是几号
* 年:yyyy
* 月: mm
* 日: dd
SELECT e.name,TO_CHAR(e.hiredate,'yyyy') 年,
TO_CHAR(e.hiredate,'mm') 月,
TO_CHAR(e.hiredate,'dd') 日
From emp e; ---TO_CHAR取日月年
SELECT e.ename,TO_CHAR(e.hiredate,'yyyy-mm-dd') FROM emp e; ---TO_CHAR把日期装换成2012-03-30
SELECT e.ename,TO_CHAR(e.hiredate,'fmyyyy-mm-dd') FROM emp e;---TO_CHAR把日期装换成2012-3-30,fm去掉前导0
SELECT empno,ename,TO_CHAR(sal,'99,999') FROM emp; ---格式化数字,9代表一位数字,结果:1,235..12,356
SELECT empno,ename,TO_CHAR(sal,'$99,999') FROM emp; ---以美元符号显示,结果:$23,567
SELECT e.ename,TO_CHAR(e.sal,'L99,999') FROM emp e; ---以本地金钱标识符显示,结果:¥23,567
SELECT TO_NUMBER('123') FROM DUAL; ---把字符串转换成数字
SELECT TO_DATE('2012-09-03') FROM DUAL; ---字符串转换成日期,结果:03-9月-12
SELECT empno,ename,(sal+NVL(comm,0))*12 FROM emp;---如果某列为空,则整个表达式的值都为空,所以加NVL判断
---如果为空,则是0,对于Null值必须使用NVL判断
SELECT DECODE(1,1,'内容是1',2,'内容是2',3,'内容是3') FROM DUAL; ---使用Decode进行判断,可以使列或者表达式
SELECT dept_name FROM dept d,emp,e WHERE d.deptno = e.empno
select e.empno,e.ename,d.deptno,d.dname,d.loc
from emp e,dept d
where e.deptno(+)=d.deptno; ---(+)在左表示右连接,表示根据右侧所有的列,查出左侧的列,没有以空列填充
select e.empno,e.ename,d.deptno,d.dname,d.loc
from emp e,dept d
where e.deptno=d.deptno(+); ---(+)在右表示左连接,表示根据左侧所有的列,查出右侧的列,没有以空列填充
select * from emp cross join dept; ---交叉连接,会产生笛卡尔积
select * from emp natural join dept; --自动关联字段
select * from emp e join dept d using(deptno); ---直接关联的操作列
select * from emp e join dept d on(e.deptno = d.deptno); --on子句,用户自己编写连接的条件
select * from emp e right outer join dept d on(e.deptno = d.deptno); --右连接查询
select * from emp e left outer join dept d on(e.deptno = d.deptno); --左外连接查询
常用组函数:
COUNT();求出全部的记录数
MAX();求出一组中的最大值
MIN(); 求出最小值
AVG(); 求出平均值
SUM();求和
分组函数只能在分组语句中使用,不能在Where后使用
分组统计
SELECT {DISTINCT} *|查询列1 别名1,查询列2 别名2,....
FROM 表名称1 别名1,表名称2 别名2....
{WHERE 条件(s)}
{GROUP BY 分组条件 {HAVING 分组条件}}
分组求和
select d.dname 部门名称,count(e.empno) 人数
from dept d left outer join emp e
on (d.deptno = e.deptno)
group by d.dname
分组求平均工加Having条件代替Where
select d.dname 部门名称,avg(e.empno) 平均工资
from dept d left outer join emp e
on(d.deptno = e.deptno)
group by d.dname
having avg(e.empno)>7700
分组函数统计,多条件
select job 工作,round(sum(sal)) 月工资合计 from emp
group by job
having sum(sal) > 5000 and job <> 'SALESMAN'
order by 月工资合计
分组函数嵌套统计
select max(avg(sal)) from emp
group by deptno
select * from table1 where length(字段)>2 ---返回字段的长度
--好啊!