一、SQL SELECT 语句
- select 语句用于表中选取数据,结果被储存在一个结果表中(称为结果集)
- select 语法:
select column_name(列名) from table_name(表名);
select * from column_name(列名);
- 可以不区分大小写,可换行书写,关键词不能简写或分开跨行书写;
- 结束必须以分号结尾;
在这里为什么定义为列名、表名,你可以想象数据库类似于excl,一个库里有很多表,数据库里的表类似于excl中的sheft(可重命名),每张表里的类似于一个巨大的表格,列名类似于表格的第一行,数据放在对应的字段之下。为了便于理解,我放一张理想的数据库中的表:
1.描述表的结构:
desc emp(表名)
number(7,2)前面的7表示总共允许7个字符长,称为宽度。 后面2是保留小数点后面两位,称为精度。 一般说来,长度要包含精度,但不包含小数点,比如number(7,2)能表示的最大数是99999.99。但是也有少数数据库的长度包含了小数点的。
VARCHAR2(10)
- CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2 (10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。
- CHAR的效率比VARCHAR2的效率稍高。
- 目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL
- NULL是一个不确定,未赋值,未知的值,不存在,null不等于0或空白,任何数字与null进行运算,结果都为空
2.查看emp表的内容:
select * from emp;
特性:
- SQLPLUS字符日期左对齐,数字右对齐;默认标题为大写
select ename,sal,job,hiredate,comm from emp;
- 支持运算符;(加减乘除以及括号)
select ename,sal,sal+1000,sal-1000,sal/2,(sal+1000)*2 from emp;
- 支持查看空值;
select * from emp where ename='JONES';
- 列别名,列标题,用空格间隔,也可用as增加可读性。可加引号保持原样(在输入时,SQL自动将小写转成大写字母,使用引号可以避免系统将小写转成大写)
- 连接运算符:
select ename||sal from emp;
select ename|| ' "s sal is '||sal from emp;
select ename||q'['s sal is]'||sal from emp;
注:q’[]’:指定引号界定符,增加可读性和可用性;
- 去除重复行
select distinct job from emp;
二、限制与排序
-
where限制语句
where子句放在from子句后,字符,日期使用单引号引起来,字符区别大小写,日期格式敏感
注:引号的使用
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号
语法:
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
注:
!=^=<>
-between…and … 即>= and <=
in(a,b,c,d…) 即=a or =b or =c
like是模糊查询,利用%或_
%表示0或任意长度的任意字符串
_表示1位任意字符
is null 过滤为空值
is not null 过滤非空的 -
关系运算:
要求查出基本工资高于1500的所有雇员信息
select * from emp where sal > 1500;
查询出所有职位是办事员的雇员信息:
select * from emp where job='CLERK';
查询基本工资在1500-3000的职员所有信息:
select * from emp where sal>=1500 and sal<=3000;
select * from emp where sal between 1500 and 3000;
查询职位是办事员,或者是销售员的全部信息
select * from emp where job='CLERK' or job='SALEMAN';
查询职位是办事员,或者是销售员的全部信息,并要求这些雇员的工资大于 1200
select * from emp where (job='CLERK' or job='SALEMAN') and sal>1200;
select * from emp where job='CLERK' OR JOB='SALEMAN' AND SAL>1200;
查询所有不是办事员的雇员信息
select * from emp where job!='CLERK';
select * from emp where job<>'CLERK';
select * from emp where NOT JOB ='CLERK';
求反:
select * from emp where not sal between 1500 and 3000;
判断空值:
空值并不代表0或空字符串
查询所有领取奖金雇员的信息
select * from emp where comm is not null;
select * from emp where not comm is null;
指定范围的操作:
IN 操作符表示指定一个范围,如果在使用IN 操作符,查询范围存在NULL ,不影响查询;
select * from emp where comm in(300,500,null);
NOT IN 表示不在指定范围,在使用该操作符过程中,若查询范围存在NULL,则不有任何查询结果
select * from emp where empno not in (7369,7566,null);
模糊查询
- %表示0或任意长度的任意字符串
_表示1位任意字符
%%表示查询所有信息
查询雇员姓名中以字母 A 开头的全部雇员信息
select * from emp where ename like ‘A%‘;
查询雇员姓名中第二个字母是 A 的全部雇员信息
select * from emp where ename like '_A%';
匹配姓名中不含A的职员的所有信息:
select * from emp where ename not like '%A5';
数据排序
-
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果希望按照降序对记录进行排序,可以使用 DESC 关键字。
可以指定多个排序的字段
默认升序
降序需要手工指定
有需要的时候才进行排序查询所有职员信息并按工资排序
select * from emp order by sal;
降序:
select * from emp order by sal desc;
查询所有雇员信息,按照工资降序排列,工资相同,则按雇佣日期从早到晚排列:
select * from emp order by sal desc,hiredate asc;