Oracle简单查询
作者:gqk
本章内容:
- 基本查询语句
- 算数运算符
- 空值问题
- 列的别名
- 字符串链接
- 查询消除重复行
- Oracle常用数据类型
- Where过滤
- 模糊查询
- 排列子句
1,基本查询语句:
数据库查询语句是我们学习的重点,在实际开发中数据库查询无处不在:
查询某张表的某几列(自定义列查询):
语法:
SELECT 列名1,列名2,...FROM 表名
查询表的所有列
语法:
SELECT * FROM 表名
查询用户下的所有表:
SELECT tbale_name FROM user_tables; SELECT table_name FROM tabs;
2,算数运算符:
--算数运算符 SELECT 5+3,5-3,5*3,5/2 FROM dual;
--虚表 SELECT 'hello,world',100 FROM dual;
--查询员工编号,姓名,工资,新工资(=原始工资上浮25% =》衍生列 计算列) SELECT employee_id,last_name,salary,salary*1.25 FROM employees;
查询:--员工编号,姓名,工资,奖金金额,实发工资(工资+奖金)??
3,空值问题:包含空值的数学表达式结果一定为空
在Oracle中空值null和空字符串是等价的,空值不是空格或者0
SELECT 5+NULL FROM dual; SELECT 5-NULL+3 FROM dual; SELECT 5+'' FROM dual;
4,列的别名:
列别名使用方式:
- AS 别名
- 空格 别名
--列别名 SELECT employee_id, last_name, salary, salary * 1.25 new_sal FROM employees; SELECT employee_id, last_name, salary, salary * commission_pct AS "Comm", salary + salary * commission_pct "my-money" FROM employees;
双引号可以强制原始大小写执行:
5,字符串链接:
把列和列,列和字符链接在一起用“||”
--拼接字符串 SELECT 'hello'||'world' FROM dual; SELECT 'hello'||1234 FROM dual; SELECT 999||1234 FROM dual; SELECT '100'+'200' FROM dual; --员工的姓和名拼接为一列 SELECT first_name||'.'||last_name AS ename FROM employees;
6,查询消除重复行
在SELECT 语句中使用DISTINCT 关键字删除重复行:
--重复行 SELECT DISTINCT department_id FROM employees; SELECT DISTINCT department_id,job_id FROM employees;
7,Oracle常用的数据类型
1、字符类型
• CHAR:一个定长字符串,当位数不足自动用空格填充来达到其最大长度。如非NULL的CHAR(12)总是包含12字节信息。CHAR字段最多可以存储2,000字节的信息
• VARCHAR2:目前这也是VARCHAR 的同义词。这是一个变长字符串,与CHAR 类型不同,它不会用空格填充至最大长度。VARCHAR2(12)可能包含0~
• CLOB:(Character Large Object)在Oracle9i及以前的版本中, 这种数据类型允许存储最多4GB的数据, 在Oracle 10g及以后的版本中允许存储最多(4GB)×(数据库块大小)字节的数据。CLOB包含要进行字符集转换的信息。这种数据类型很适合存储纯文本信息。
2、数字类型:
NUMBER:该数据类型能存储精度最多达38位的数字。每个数存储在一个变长字段中,其长度在0~22字节之间。Oracle的NUMBER类型精度很高, 远远高于许多编程语言中常规的FLOAT和DOUBLE类型。
NUMBER( p,s ) p表示精度(总长度) s表示小数位置且四舍五入
NUMBER(10,3) 10是总长度,3是小数位数的长度
3、日期类型
• DATE:一个7字节的定宽日期/时间数据类型。其中总包含7个属性,包括:世纪、世纪中哪一年、月份、月中的哪一天、小时、分钟和秒。
• TIMESTAMP:一个7 字节或12.字节的定宽日期/时间数据类型。它与DATE 数据类型不同,因为TIMESTAMP 可以包含小数秒(fractional second);带小数秒的TIMESTAMP 在小数点右边最多可以保留9位。
4、二进制及大文本数据
• BLOB: (binary large object)在Oracle9i及以前的版本中, 这种数据类型允许存储最多4GB的数据, 在Oracle 10g及以后的版本中允许存储最多(4GB)×(数据库块大小)字节的数据。BLOB包含不需要进行字符集转换的“二进制“数据,如果要存储电子表格、字处理文档、图像文件等就很适合采用
注意:ORACLE中没有boolean类型:
8,Where过滤
就是按照条件检索查询数据:
比如:查询本月的手机话费
百度我们感兴趣的信息
预定乘坐的飞机,火车票
比较运算符:
--查询90号部门的员工
--查询工资超过10000的员工
--查询姓King的员工(字符串比较区分大小写)
--查询员工编号,姓名,工资,新工资(只看新工资超过10000的员工)
--查询所有在90年以前入职的员工
--查询所有不是50号部门的员工
判断一下sql的输出结果:
FROM employees
WHERE department_id=NULL;
FROM employees
WHERE department_id<>NULL;
特殊比较运算符:
--查询没有部门的员工 SELECT * FROM employees WHERE department_id IS NULL; --查询有部门的员工 SELECT * FROM employees WHERE department_id IS NOT NULL; --查询工资在5000~10000之间的员工 SELECT * FROM employees WHERE salary BETWEEN 5000 AND 10000; --查询工资不在5000~10000之间的员工 SELECT * FROM employees WHERE salary NOT BETWEEN 5000 AND 10000; --查询部门为10,20,50号的员工 SELECT * FROM employees WHERE department_id IN (10,20,50); --查询部门不是10,20,50号的员工 SELECT * FROM employees WHERE department_id NOT IN (10,20,50);
9,模糊查询:
练习:
--查询first_name以S开头的员工 SELECT * FROM employees WHERE first_name LIKE 'S%'; --查询last_name以s结尾的员工 SELECT * FROM employees WHERE last_name LIKE '%s'; --查询last_name以M开头且第三个字母是u的员工 SELECT * FROM employees WHERE last_name LIKE 'M_u%'; --查询email中包含EN的员工 SELECT * FROM employees WHERE email LIKE '%EN%'; --查询job_id倒数第5个字符是下划线的员工 SELECT * FROM employees WHERE job_id LIKE '%\_____' ESCAPE '\'; SELECT * FROM employees WHERE last_name LIKE '%\%%' ESCAPE '\';
练习:
--查询工资超过5000且last_name以s结尾的员工 SELECT * FROM employees WHERE salary>=5000 AND last_name LIKE '%s'; --查询部门是10,20,以及没有部门的员工 SELECT * FROM employees WHERE department_id IN (10,20) OR department_id IS NULL;
排序问题:
练习:
--查询员工编号,姓名,工资,新工资,部门编号 --按工资升序 SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY salary; --按工资降序 SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY salary DESC; -- SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY new_sal DESC; -- SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY salary*1.5 DESC; -- SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY 3 DESC; --查询员工编号,姓名,工资,入职日期,部门编号 --按部门升序,工资降序,入职日期升序 SELECT employee_id,last_name,salary,hire_date,department_id FROM employees ORDER BY department_id,salary DESC,hire_date; --排序表达式可以不是列列表中的列 SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY job_id; --查询50号部门的员工,按工资降序 SELECT * FROM employees WHERE department_id=50 ORDER BY salary DESC;
伪列:
--rownum伪列 SELECT ROWNUM,employee_id,last_name,salary FROM employees WHERE department_id=50; --查询某表中的前5条数据(TOP N查询) SELECT ROWNUM,employees.* FROM employees WHERE ROWNUM<=5; --查询某表中的第6到第10条数据 --查询工资最高的前5名员工 select rownum ,last_name,salary from employees where rownum <6 order by salary desc(错误的) select * from (select rownum,last_name,salary from employees order by salary desc) where rownum <6; --rowid伪列 SELECT ROWID,ROWNUM,employees.* FROM employees;