版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37527943/article/details/85011302
导读
1.简单单表查询
2.查询子句之ORDER BY:排序
3.查询子句之WHERE:条件子句
数据库脚本文件:
后缀:sql
注释:--
可以把各个对象的创建(表,序列等),以及数据的添加放到一个脚本中
执行脚本:
方式1:start 脚本路径 注意:start后面要跟一个空格
方式2:@脚本路径 注意:@后面不需要空格
从脚本的上面到下面逐行执行,一行出错,后面继续执行
如果执行脚本错误,建议先删除用户,重新创建后再执行脚本
管理员删除用户:DROP USER 用户名 CASCADE;
简单单表查询
语法:
1)SELECT 列名1,列名2,...,列名n
FROM 表名;
从某张表查询指定的列
注意:
1.执行流程
FROM,确定数据来源-->SELECT,确定哪些列
2.如果查询的是一个表的全部列,可以用*代替,
查询出来的列顺序与定义时一直,可读性不高,不建议使用
3.查询时,数值型,日期型可以做算术运算,+,-,*,/
eg3:查询每个员工如果加薪1000后的薪资
SELECT id,salary+1000
FROM s_emp;
4.关于空值:代表的是未知的,不确定的,没有值
空值运算后结果还是空值
空值转换函数:
数值型列:NVL(列,数值) :如果这个列值为空,则用这个数值代替
文本型列:NVL(列,'文本'):如果这个列值为空,则用这个文本代替
eg4:求每个员工包含提成后的月工资总额
SELECT id,salary*(1+NVL(commission_pct,0)/100)
FROM s_emp;
5.查询时可以给查询的列或表达式取别名
SELECT 列名 [AS] 别名,列名...
FROM 表名;
别名如果需要保持原来的大小写,或者别名中包含一些特殊字符,比如空格可以用双引号括起来
eg5:求每个员工包含提成后的月工资总额,取别名为sal
SELECT id,salary*(1+NVL(commission_pct,0)/100) AS sal
FROM s_emp;
SELECT id,salary*(1+NVL(commission_pct,0)/100) AS "sal"
FROM s_emp;
6.查询某个列时,查询去重后的结果,distinct
eg6:查询公司的所有部门名,相同的只保留一份
SELECT DISTINCT name
FROM s_dept;
查询补充:
可以直接查询一个常量或者常量表达式:
SELECT 1+2 FROM dual;(查询结果就是1+2的结果3)
此时,为了满足SELECT...FROM...,FROM 后面跟的dual,可以称它为虚表
SELECT sysdate FROM dual;
sysdate:当前系统时间,date类型
所以dual的作用就是查询某些表达式的结果或者某些函数的作用
查询子句之ORDER BY:排序
语法:
SELECT ...
FROM ...
ORDER BY 列名 ASC|DESC,列名 ASC|DESC ...;
注意:
1.执行流程:FROM->SELECT,此时确定了结果集->ORDER BY把数据改变位置,排序
2.ASC:升序,DESC:降序,省略默认是升序
3.按照多列排序,首先先按照第一列排序,如果第一列相等再按第二列排序...
4.null值默认为最大
5.ORDER BY子句永远在查询的最后,排序永远是最后执行
eg1:查询每个员工的编号,名字,部门编号,并按照部门编号升序排序
SELECT id,first_name,dept_id
FROM s_emp
ORDER BY dept_id ASC;
SELECT id,first_name,dept_id
FROM s_emp
ORDER BY dept_id DESC;
SELECT id,first_name,dept_id
FROM s_emp
ORDER BY dept_id;
eg2:查询每个员工的编号,名字,部门编号,薪资,要求按照部门编号升序排序,
如果部门相同,则按照薪资降序排序
SELECT id,first_name,dept_id,salary
FROM s_emp
ORDER BY dept_id ASC,salary DESC;
查询子句之WHERE:条件子句
语法:
SELECT
FROM
WHERE 条件
ORDER BY;
注意:
1.执行流程:FROM,确定表->WHERE,确定表的行->SELECT,确定列,结果集确定->ORDER BY,排序
2.WHERE子句紧跟在FROM子句之后
3.WHERE筛选,逐行判断,如果当前行条件满足,则结果集中包含,否则不包含
4.条件中的运算符:
比较运算符:
>,>=,<,<=,=(等于),!=,<>(不等于)
BETWEEN...AND...:在...和...之间, 闭区间
IN, IN(点值1,点值2,...)
IS NULL:是空的,空代表未知的,不确定的,不能用=判断
LIKE:用来模糊查询的
通配符:
%:可以代表任意的0个或多个字符
_:可以代表任意1个字符
如果需要%,_表示原本的含义,可以利用escape指定转义字符
eg:查询以_a开头的名字
SELECT first_name
FROM s_emp
WHERE first_name LIKE '\_a%' escape '\';(表示以_a开头的名字,转义字符只对其后紧挨着的一个字符有效)
NOT BWTWEEN...AND...:不在...和...之间
NOT IN
IS NOT NULL:不是空的
NOT LIKE
逻辑运算符:
NOT:非 取反
AND:与,都成立,结果才成立
OR:或,只要有一个成立,结果就成立
优先级:NOT>AND>OR
拼接:||
eg1:查询出所有薪资高于1200的员工编号,薪资
SELECT id,salary
FROM s_emp
WHERE salary>1200;
eg2:查询薪资在1100到1450之间的所有员工编号,名字,薪资
SELECT id,first_name,salary
FROM s_emp
WHERE salary BETWEEN 1100 AND 1450;
eg3:查询部门编号为41或44或45的所有员工编号,部门编号
SELECT id,dept_id
FROM s_emp
WHERE dept_id IN(41,44,45);
eg4:查询没有提成的员工的编号,名字
SELECT id,first_name
FROM s_emp
WHERE commission_pct IS NULL;
eg5:查询以a结尾的名字
SELECT id,first_name
FROM s_emp
WHERE first_name LIKE '%a';
'B%':以B开头的
'%b%':包含b的
'_b%':第二个字符是b
'_b':长度是2,第二个字符是b
eg6:查询薪资低于1000或者薪资高于1500的所有员工id,薪资
SELECT id,salary
FROM s_emp
WHERE salary<1000 OR salary>1500;
eg7:查询在41或44号部门,并且薪资高于1100的员工id,薪资
SELECT id,dept_id,salary
FROM s_emp
WHERE (dept_id=41 OR dept_id=44) AND salary>1100;
eg8:查询每个员工的姓名,显示的格式为:名,姓
SELECT first_name||','||last_name
FROM s_emp;