第二节SQL语句------》SQL查询语句
2.1SQL语句----》简单查询
2.1.1什么是简单查询
我们对一张数据表的查询操作就称为简单查询。使用简单查询时,里面只有两个基本子句,SELECT和FROM,需要记住简单查询的语法。
FROM子句优先于SELECT子句执行,以确定数据的来源
SELECT 子句控制的只是显示的数据列,所有数据源在FROM子句中定义。
2.1.2简单查询的语法
1.在书写SQL语句的过程中,遵循一个习惯:固定的语法全部大写,可变的内容全部小写,目的是为了更容易排查问题。
2.编写SQL时,可以不区分大小写,因为SQL解析时,不区分大小写。
3.例如: select * from emp; ===== SELECT * FROM emp;
这个2 个语句是一样的,都可以执行,但是最好按照第二种写
4.FROM子句优先于SELECT子句执行,以确定数据的来源
5.SELECT ----》限定字段 FROM----》数据表----》数据来源
1.select和from
Select和from是简单查询中的两个主要字句,执行顺序为先1.from,在2.select。
2.SELECT 执行内容
1.FROM 表名;
1)select语法
A.语法格式:SELECT [DISTINCT] * | 列名1【别名1】,列名 【别名2】。。。| 计算过程| 统计函数
SELECT [DISTINCT] *
-----》*表示数据表中的所有数据(所有字段)
SELECT [DISTINCT] 列名1,列名2
----》表示选择数据表中的指定的列名1,列名2
Distinct可以去重,只有两行数据完全一样时才是重复的,才能被去重。
SELECT [DISTINCT] 列名1【别名1】,列名2 【别名2】。。。列名n【别名n】
----》表示选择数据表中的指定的列名1,列名2,列名n----》别名用的少
SELECT [DISTINCT] 计算过程
-------》表示计算过程
SELECT [DISTINCT] 统计函数
-------》表示统计字段的值
B.SELECT 子句控制的只是显示的数据列,
2)from语法
A.语法格式: FROM table_name 【别名】;
------》FROM子句后定义数据来源
B.所有数据源在FROM子句中定义
3)分号;-----表示结束
SQL语句中,通常用分号;标记结束。
为了更容易编写SQL 语句,我们可以将不同的子句写入不同的行
SQL> SELECT *
2 FROM emp;
4)例如
A查看emp表中的所有数据
语句:
SELECT *
FROM emp;
执行结果:可以查看到emp数据表中的14行数据记录
B查看公司员工姓名、编号、薪资
语句:
SELECT ename,empno,sal
FROM emp;
分析过程:1.确定数据来源----》emp数据表
2.确定需要的字段-----》ename,empno,sal
C 通过别名查找公司员工的姓名,员工编号,薪资
语句:
SELECT ename name,empno num,sal money
FROM emp;
查询数据的字段为ename,empno,sal,显示结果以别名显示name,num,money
给ename列的数据添加别名name,empno和sal同理。,别名显示在表头的位置,但是不建议使用字段的别名,因为别名只是在当前SQL中显示的效果,和我们查询到的数据没有关系。
D查看公司的岗位有哪些
语句:
SELECT job
FROM emp;
-----》显示job字段的所有数据
语句
SELECT DISTINCT job
FROM emp;
-----》仅显示工作岗位由哪些-----》去重
E查看公司的所有员工姓名,工作,年薪
语句
SELECT ename,job,sal*12 sal_year
FROM emp;
F查看公司的所有员工姓名,部门编号,年薪
(年薪构成为15薪,每个月有200车补,100餐补,35话补)
语句
SELECT ename, deptno, sal*15+(200+100+35)*12 sal_year
FROM emp;
G给emp表添加别名 e
SQL> SELECT e.ename
2 FROM emp e;
2.查询常量
使用SELECT子句时,也可以查询常量,常量用‘ ’,单引号标记出来。
定义的常量字段需要使用引号标记起来,目的是于表中的字段作区分。
格式:SELECT ‘常量‘,列名 from 表名;
SELECT ename
FROM emp;
SQL> SELECT ‘name’,ename
2 FROM emp;
3.使用字符串拼接
使用SELECT语句时,也可以使用字符串拼接,可以将多个字段拼接为一个字段
就是使用|| (双竖线)这个符号进行字符串的拼接
练习1:
SELECT 'name is ’ || ename || ',work is ’ || job
FROM emp;
练习2:
SELECT 'name is ’ || ename || ',work is ’ || job 别名
FROM emp;
练习3:
SELECT ename || job infor
FROM emp;
练习3:
SQL> SELECT ename || ’ ’ || job infor
2 FROM emp;
2.2SQL语句----》限定查询(过滤)
1.2.1什么是限定查询
在语句中添加限定条件,限定查询到的数据行,也属于简单查询
1.2.2.Where子句
在限定查询中,引入where子句,SQL的语法就会发生改变。
在有了限定条件后,执行顺序发生改变先执行from语句,在执行where语句,最后执行select语句
3 select 1 from 2 where
WHERE 子句通过后面定义的条件判断,最终决定被查询到的数据行,在分组前对数据进行条件过滤
1)基本语法
SELECT [DISTINCT] * | 列名1【别名1】,列名2 【别名2】。。。。| 计算过程 | 统计函数
FROM 数据表1 【别名1】
【WHERE 限定条件1,限定条件2。。。。;】
在使用了GROUP BY 分组时 where后面不允许使用统计函数
以分号;结束
2) 功能描述
在进行限定查询的时候,首先需要根据FROM 确定要使用的数据来源,而后利用一些条件(关系运算,工资大于小于的条件)从所有数据行中筛选除所需要的内容,从而实现最终的数据行的筛查。
多条件进行判断也可以利用逻辑运算进行整合,(与或非)
WHERE 子句不能使用SELECT中的别名,因为它的执行顺序要早于SELECT 子句
不能使用聚合函数
3)where子句中常用的判断符
A.与或非
WHERE +条件1【AND|OR】条件2----》(与操作,非操作,或操作)
a)与操作-----》 AND
b)或操作------》OR
c)非操作------》NOT
B.关系运行符
>(大于) <(小于) >=(大于等于) <=(小于等于)
= (等于) <>(不等于) !=(不等于)
C.其他判断符
BETWEEN A AND B -----》在A到B之间,包含A和B本身,用于指定范围区间,可以针对所有数据类型,但是在number和date中使用。
Where 列名 between A and B
IN ,NOT IN ------》在/不在-----》范围查询
Where 列名 IN/NOT IN (指定内容1,指定内容2,指定内容3。。。。)
指定内容又叫作种子内容。
在使用IN /NOT IN 指定内容(种子内容)不能为null,因为NOT IN 与null联合使用的结果是将所有非空行显示出来,在这种情况下就会出现逻辑问题。
Oracle检测发现NOT IN 与 NULL 结合时,会对sql进行优化,不查询,直接结束。
LIKE ------》模糊查询
‘%’ (百分号):匹配任意字符任意次
‘_’(下划线) : 匹配任意字符单次
Where 列名 like ‘%字符’ where 列名 like ‘_字符’
IS NULL,IS NOT NULL -------》判断为空/判断非空, 在数据库中可以是任何值
Where 列名 is null / is not null
4)例如
同一个查询,可以通过不同的sql语句的语法实现,但是效率可能不同
A.查询出工资大于1000的所有雇员的信息
— >确定数据表:emp
----》确定字段:*
-----》确定已知条件: sal > 1000
SELECT *
FROM emp
WHERE sal > 1000;
B.查询出姓名为smith的所有信息
1)使用字符串进行判断时,必须使用引号,否则就会报错
类似这样的报错:ORA-00904: “SMITH”: invalid identifier
2)练习
SQL> SELECT *
2 FROM emp
3 WHERE ename = ‘SMITH’;
SQL> SELECT *
2 FROM emp
3 WHERE ename=‘SMITH’;
3)出现 -----》no rows selected —》表示没有获取到相应的信息
4)SQL在解析SQL语法时不区分大小写,SELECT ,FROM WHERE这些不区分大小写。
但是在数据表中存放的数据是有大小写的,所有我们在编写条件时一定要注意大小写。
C.查询出工资在1000到1500之间的所有非销售人员的编号,姓名,职位,工资
----->确定数据表:emp
------》确定字段:empno,ename job sal
------》确定已知条件:sal>=1000 sal<=1500 job !=’ SALESMAN’
SQL> SELECT ename,job,sal,empno
2 FROM emp
3 where sal>=1000 AND sal<=1500 AND job<>‘SALESMAN’;
这个性能差,执行的了三个关系运算
SQL> SELECT *
2 FROM emp
3 WHERE sal BETWEEN 1000 AND 1500;
这个语句性能高,执行一个逻辑运算,包含边界值
D.查询出所有不是办事员的员工信息
----->确定数据表:emp
------》确定字段:*
------》确定已知条件: job !=’CLERK’
SQL> SELECT *
2 FROM emp
3 WHERE job != ‘CLERK’;
SQL> SELECT *
2 FROM emp
3 WHERE NOT job = ‘CLERK’;
E.查询出所有是办事员的员工信息
SQL> SELECT *
2 FROM emp
3 WHERE job = ‘CLERK’;
这个语句中只有一次关系运算,使用等值比较
SQL> SELECT *
2 FROM emp
3 WHERE NOT job != ‘CLERK’;
这个语句性能差,使用了一次关系运算和逻辑运算,效率较低
G.查询出职位是办事员或销售人员的信息
SQL> SELECT *
2 FROM emp
3 WHERE job = ‘CLERK’ OR job = ‘SALESMAN’;
H.查询出所有在1981年的入职的员工信息
-----》确定字段: *
-----》确定条件:hiredate 入职日期
-----》确定1981年的区间—》1981年1月1日到1981年12月31日
日期的区间如何描述----》按照数据表的模式来—>01-JAN-81 31-DEC-81
SQL> SELECT *
2 FROM emp
3 WHERE hiredate BETWEEN ‘01-JAN-81’ AND ‘31-DEC-81’;
SQL> SELECT *
2 FROM emp
3 WHERE hiredate LIKE ‘%81’;
I.查询佣金为空的雇员信息
在数据中存在null时,任何对null进行的关系运算结果均为null
SQL> SELECT *
2 FROM emp
3 WHERE comm IS NULL;
J.查询有佣金的雇员信息
SQL> SELECT *
2 FROM emp
3 WHERE comm IS NOT NULL;
K.查询雇员姓名以字母A开头的所有员工的信息
SQL> SELECT *
2 FROM emp
3 WHERE ename LIKE ‘A%’;
L.查询雇员姓名中第二字母为A员工的信息
SQL> SELECT *
2 FROM emp
3 WHERE ename LIKE ‘_A%’;
M.查询雇员姓名中包含A字母的员工的信息
SQL> SELECT *
2 FROM emp
3 WHERE ename LIKE ‘%A%’;
注意:进行模糊查询时,若%中间为空,‘%%’----》表示查询所有雇员的数据信息,where的作用就没有了。
N.查询雇员薪资中包含000的员工的信息
SQL> SELECT *
2 FROM emp
3 WHERE sal LIKE ‘%000%’;
O.查询雇员编号为7369,7566,7788 ,9999的雇员信息
SQL> SELECT *
2 FROM emp
3 WHERE empno=7369 OR empno=7566 OR empno=7788 OR empno=9999;
效率低
SQL> SELECT *
2 FROM emp
3 WHERE empno IN (7369,7566,7788,9999);
效率高
P.查询雇员编号不是7369,7566,7788 ,9999的雇员信息
SQL> SELECT *
2 FROM emp
3 WHERE empno NOT IN (7369,7566,7788,9999);
SQL> SELECT *
2 FROM emp
3 WHERE empno !=7369 AND empno !=7566 AND empno !=7788 AND empno !=9999;
效率低
Q.错误查询----》NOT IN 与NULL 结合
SQL> SELECT *
2 FROM emp
3 WHERE mgr NOT IN (7369,7566,7788,NULL);
5)调优
数据库运行语句,从时间可以体现出来性能的区别,数据库的性能是从查询语句推断出来的,查询语句的效率高低会映射到数据库上。
数据库文件存放在fs(文件系统)和raw(裸设备)上就不一样,这是在数据库层面讨论的,查询速度就会有明显提升。
数据库性能差还是通过查询来看,如果换了fs或者raw,查询速度就会提升,但是如果查询语句差,即使使用fs或者raw也还是差的
数据库优化----》从sql语句优化,高性能sql语句和低性能sql语句区别很大,
添加索引,修改Oracle参数,提升,
Sql调优,----》数据库调优----》设备调优 成本最低的是sql,成本最高的是设备调优。
2.总结
SQL语法总结如下:
SELECT [DISTINCT] * | 列名1【别名1】,列名2【别名2】.。。。。| 计算过程 | 统计函数
FROM 数据库表 【表别名】
WHERE 限定条件1,限定条件2;
限定条件: 逻辑运算: and or not
关系运算:< > <= >= != <>
判断符: between。。。 and 。。。----》指定连续区间范围查询
In /not in -----》指定种子数据范围查询
Is null / is not null------》判断null
Like-------》指定匹配模式模糊查询
2.3SQL语句----》查询排序
也属于简单查询
2.3.1.什么是查询排序
对查询的结果进行排序操作
在默认情况下,Oracle会根据数据的ID或其他因素对查询的数据进行排序,但 Oracle自己定义的排序是不严谨的。
在使用排序的操作,我们需要引入 ORDER BY 子句
2.3.2ORDER BY 子句
执行顺序是先执行FROM,在执行WHERE,然后执行SELECT ,最后执行ORDER BY子句
3 Select 1from 2 where 4 oder by
ORDER BY 永远在最后执行,也就是说排序是在所有数据都筛选完成之后降序的数据处理
1)基本语法
SELECT [DISTINCT] * | 列名1【别名1】,列名2 【别名2】。。。。| 计算过程 | 统计函数
FROM 数据表1 【别名1】
【WHERE 限定条件1,限定条件2。。。。】
【ORDER BY 排序字段1 【ASC|DESC】, 排序字段2【ASC|DESC】……】;
以分号;结束
2)功能描述
如果不指定升/降序,默认是升序(从小到大—ASC),DESC表示降序,从到小
ORDER BY 可以使用SELECT 子句中的别名,因为ORDER BY 的执行顺序晚于SELECT子句执行的,因此可以使用。
2)例如
A.查询所有的雇员信息,要求雇员工资从低到高排序(升序)
SQL> SELECT *
2 FROM emp
3 ORDER BY SAL;
B.查询所有的雇员信息,要求雇员工资从高到低排序(降序),若工资相同,则按照雇佣日期有早到晚排序(升序)
SQL> SELECT *
2 FROM emp
3 ORDER BY sal DESC , hiredate ASC;
C.查询所有部门编号为10的和20的雇员信息,要求按照工资由高到低排序,(降序)如果工资相同,按照雇佣日期有早到晚排序 (升序)
SQL> SELECT *
2 FROM emp
3 WHERE deptno IN (10,20)
4 ORDER BY sal DESC,hiredate ASC;
D.查询每个雇员的编号,姓名,年薪,并且按照年薪由高到低排序
SQL> SELECT empno,ename,sal*12 SAL_YEAR
2 FROM emp
3 ORDER BY SAL_YEAR DESC;