SQL 基础
SQL(Structured Query Language , 结构化的查询语言),用来实现关系运算中的查询.
只要是关系型数据库SQL语言就是一套标准的语言
-
SQL语言分类
-
1.查询语言
用于检索数据库中存储的行,可以使用SQL中的Select语句编写查询
2.数据操作语言(DML)
insert 添加
update 修改
delete 删除
merge 合并
3.数据定义语言(DDL)
create 创建数据结构的时候使用
alter 修改数据库结构
drop 删除数据库结构
rename 修改表名
truncate 截断表(删除表中所有数据)
4.数据控制语言(DCL)
grant 授予其他用户/角色 数据结构的操作权限
revoke 收回权限
5.事物控制(TCL)
将修改的数据永久的保存到表中
commit 永久性保存
rollback 回滚 取消所做的修改
savepoint 设置保存点,可以回滚到指定位置
编写SQL语句的规则
1.SQL关键字不区分大小写
2.对象名和列名不区分大小写
3.列中的值区分大小写
SCOTT用户
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
DEPT部门表
EMP 员工表
BONUS
SALGRADE
SQL> desc dept;
名称 是否为空? 类型
----------------------------------------- -------- --------------------
DEPTNO NOT NULL NUMBER(2) 部门编号
DNAME VARCHAR2(14) 部门名称
LOC VARCHAR2(13) 部门地址
SQL> desc emp
名称 是否为空? 类型
----------------------------------------- -------- --------------
EMPNO NOT NULL NUMBER(4) 员工编号
ENAME VARCHAR2(10) 第三方
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
select * from table_name;
select : 用于指定要检索的列(用于展示的列)
* : 表示所有列
from : 用于指定检索的表
table_name : 查询的表名
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
where : 用于指定条件语句,如果条件语句返回为true,返回当前行数据,如果为false,这不会显示
expression : 表示条件语句
=
<>,!=
>=
<=
<
between…and : 在两个值之间
in 匹配列表中的值
like 模糊查询
null 检查空
时间类型比较
1.以Oracle默认时间格式查询(dd-MM月-yy)
SQL> select ename,sal,hiredate from emp where hiredate> '01-1月-82';
ENAME SAL HIREDATE
---------- ---------- --------------
SCOTT 3000 19-4月 -87
ADAMS 1100 23-5月 -87
MILLER 1300 23-1月 -82
2.时间转换将字符串转换成时间格式
to_date(‘1982-01-01’,‘yyyy-MM-dd’) 将字符串转换成时间类型
SQL> select ename,sal,hiredate from emp where hiredate >to_date('1982-01-01','yyyy-MM-dd');
ENAME SAL HIREDATE
---------- ---------- --------------
SCOTT 3000 19-4月 -87
ADAMS 1100 23-5月 -87
MILLER 1300 23-1月 -82
between...and...
SQL> select ename,sal,hiredate from emp where sal between 1100 and 3000;
ENAME SAL HIREDATE
---------- ---------- --------------
ALLEN 1600 20-2月 -81
WARD 1250 22-2月 -81
JONES 2975 02-4月 -81
MARTIN 1250 28-9月 -81
BLAKE 2850 01-5月 -81
CLARK 2450 09-6月 -81
SCOTT 3000 19-4月 -87
TURNER 1500 08-9月 -81
ADAMS 1100 23-5月 -87
FORD 3000 03-12月-81
MILLER 1300 23-1月 -82
已选择11行。
SQL> select ename,sal,hiredate from emp where sal >= 1100 and sal<= 3000;
ENAME SAL HIREDATE
---------- ---------- --------------
ALLEN 1600 20-2月 -81
WARD 1250 22-2月 -81
JONES 2975 02-4月 -81
MARTIN 1250 28-9月 -81
BLAKE 2850 01-5月 -81
CLARK 2450 09-6月 -81
SCOTT 3000 19-4月 -87
TURNER 1500 08-9月 -81
ADAMS 1100 23-5月 -87
FORD 3000 03-12月-81
MILLER 1300 23-1月 -82
已选择11行。
like "%": 0个到多个字符 "_"单个字符
SQL> select ename,sal,hiredate from emp where ename like 'S%';
ENAME SAL HIREDATE
---------- ---------- --------------
SMITH 800 17-12月-80
SCOTT 3000 19-4月 -87
SQL> select ename,sal,hiredate from emp where ename like '__A%';
ENAME SAL HIREDATE
---------- ---------- --------------
BLAKE 2850 01-5月 -81
CLARK 2450 09-6月 -81
ADAMS 1100 23-5月 -87
-
逻辑操作符
-
1.and : 条件都为true才为true 否则都为false
2.or : 如果任意一个条件为true都为true,否则返回false
3.not : 条件是false,返回true,如果条件是true就返回false
如果在select 语句中同时包含group by,having 以及order by,则必须将order by 放在最后
查询部门编号20 工种为CLERK
SQL> select ename,job,deptno from emp where deptno = 20 and job='CLERK';
ENAME JOB DEPTNO
---------- --------- ----------
SMITH CLERK 20
ADAMS CLERK 20
岗位,MANAGER 工资高于2500
SQL> select ename,job,deptno from emp where sal>2500 or job='MANAGER';
ENAME JOB DEPTNO
---------- --------- ----------
JONES MANAGER 20
BLAKE MANAGER 30
CLARK MANAGER 10
SCOTT ANALYST 20
KING PRESIDENT 10
FORD ANALYST 20
已选择6行。
工种为CLERK,部门编号不是10,30,40
SQL> select ename,sal,hiredate from emp where deptno not in(10,30,40) and job = 'CLERK'
2 ;
ENAME SAL HIREDATE
---------- ---------- --------------
SMITH 800 17-12月-80
ADAMS 1100 23-5月 -87
Order By 子句,对行进行排序
select <cloumn1,…> from table_name
where expression
order by column1[,column2…] [asc | desc]
order by : 表示按列名进行排序
asc 升序(默认)
desc 降序
查询部门编号30,安装工资升序排序
SQL> select ename,sal,comm from emp where deptno = 30 order by sal asc;
ENAME SAL COMM
---------- ---------- ----------
JAMES 950
WARD 1250 500
MARTIN 1250 1400
TURNER 1500 0
ALLEN 1600 300
BLAKE 2850
已选择6行。
多行排序
SQL> select ename,sal,comm from emp where deptno = 30 order by sal asc,comm desc;
ENAME SAL COMM
---------- ---------- ----------
JAMES 950
MARTIN 1250 1400
WARD 1250 500
TURNER 1500 0
ALLEN 1600 300
BLAKE 2850
已选择6行
如果在select语句中同时包含group by,having以及order by ,则必须将order by 放在最后
group by 分组
select <cloumn1,…> from table_name
group by column1[,column2…]
多列分组
SQL> select job,deptno,count(1) from emp group by job,deptno order by deptno;
JOB DEPTNO COUNT(1)
--------- ---------- ----------
CLERK 10 1
MANAGER 10 1
PRESIDENT 10 1
ANALYST 20 2
CLERK 20 2
MANAGER 20 1
CLERK 30 1
MANAGER 30 1
SALESMAN 30 4
已选择9行。
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
1 7369 SMITH CLERK 7902 1980-12-17 800 20
2 7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
3 7521 WARD SALESMAN 7698 1981-2-22 1250 500 30
4 7566 JONES MANAGER 7839 1981-4-2 2975 20
5 7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
6 7698 BLAKE MANAGER 7839 1981-5-1 2850 30
7 7782 CLARK MANAGER 7839 1981-6-9 2450 10
8 7788 SCOTT ANALYST 7566 1987-4-19 3000 20
9 7839 KING PRESIDENT 1981-11-17 5000 10
10 7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
11 7876 ADAMS CLERK 7788 1987-5-23 1100 20
12 7900 JAMES CLERK 7698 1981-12-3 950 30
13 7902 FORD ANALYST 7566 1981-12-3 3000 20
14 7934 MILLER CLERK 7782 1982-1-23 1300 10
部门编号分组
10 20 JOB 30
CLARK SMITH CLERK ALLEN
KING JONES MANAGER WARD
MILLER SCOTT ANALYST MARTIN
ADAMS CLERK BLAKE
FORD ANALYST TURNER
JAMES
根据部门编号工种分组
20 JOB
SMITH CLERK ADAMS CLERK
JONES MANAGER
SCOTT ANALYST FORD ANALYST
**having 子句过滤组 **
显示平均工资高于2000的部门编号,平均工资,最高工资…
SQL> select deptno,avg(sal) from emp group by deptno having avg(sal) >2000;
DEPTNO AVG(SAL)
---------- ----------
20 2175
10 2916.66667
只保留工资大于1000的行,根据部门分组,保留部门平均工资高于2000的行
SQL> select deptno,avg(sal) from emp where sal > 1000 group by deptno having avg(sal)>2000 order by deptno;
DEPTNO AVG(SAL)
---------- ----------
10 2916.66667
20 2518.75
使用 distinct 来检索唯一的列值
去除列中的重复值
SQL> select job,count(1) from emp group by job;
JOB COUNT(1)
--------- ----------
CLERK 4
SALESMAN 4
PRESIDENT 1
MANAGER 3
ANALYST 2
SQL> select distinct job from emp;
JOB
---------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
使用运算符:
(+,-,*,/)
SQL> select ename,sal*(1.2) from emp;
ENAME SAL*(1.2)
---------- ----------
SMITH 960
ALLEN 1920
WARD 1500
JONES 3570
MARTIN 1500
BLAKE 3420
CLARK 2940
SCOTT 3600
KING 6000
TURNER 1800
ADAMS 1320
ENAME SAL*(1.2)
---------- ----------
JAMES 1140
FORD 3600
MILLER 1560
已选择14行。