DAY 1

SQL

  • 搜索
  • 问题
  • 自我预习
  • 考试

关系型数据库

数据查询语言DQL

Select
Where
Group by, Having
Order by

数据操作语言DML

Delete
Update
Insert

数据定义语言DDL

Create
Alter
Drop
TRUNCATE

数据控制语言DCL

GRANT
REVOKE

事务处理语言TCL

BEGIN TRANSACTION
COMMIT
ROLLBACK

指针控制语言CCL

DECLARE CURSOR
FETCH INTO

练习1

  1. 查询EMP表中EMPNO为7369,7499,7521,7566的数据,并将查询结果中COMM为NULL的数据用1来显示
select empno,ename,job,mgr,hiredate,sal,comm,deptno 
from emp 
where empno=7369 or empno = 7521 or empno = 7566;

or

select empno,ename,job,mgr,hiredate,sal,nvl(comm,1),deptno 
from emp 
where empno in (7369,7521,7566);

NVL空判断

select empno,ename,job,mgr,hiredate,sal,comm,deptno 
from emp 
where empno=7369 or empno = 7521 or empno = 7566;
select empno,ename,job,mgr,hiredate,sal,nvl(comm,1),deptno 
from emp 
where empno=7369 or empno = 7521 or empno = 7566;

INSERT

INSERT INTO DEPT1
SELECT DEPTNO, DNAME, LOC
 FROM DEPT

添加其他表中的数据

UPDATE

UPDATE table
SET column1 = new value
WHERE column2 = old value;

添加已存在数据

UPDATE EMP2 SET ENAME =
    (Select ENAME
      FROM EMP
      Where EMPNO=7934)
WHERE EMPNO =7934;

DELETE

DELETE FROM Table WHERE Column1= Value;

一般情况下,删除时where必须存在。
否则为删除全部数据。

SQL Coding 标准

  • SQL所有的关键字都大写.
  • 每当出现语句中断时,需要从新的一行开始.
  • 别名用一般用大写字母表示.
  • 如果有子查询的话,子查询语句需要缩进
  • 遵守项目制定的相关coding规定

WHERE条件

  • 如果查询的条件中的值时字符串的话,需要使用单引号
  • 如果查询的条件中的值为null的话,需要IS NULL 或者 IS NOT NULL来判断
  • 如果查询的条件中的值为日期的话,需要使用单引号

BETWEEN AND

在上下界范围内查找

SELECT * 
FROM DEPT 
WHERE DEPTNO BETWEEN 5 AND 25;

IN

在一定范围内查找

SELECT * FROM DEPT 
WHERE DEPTNO IN (10,20,30);

NOT IN

在一定范围外查找

SELECT * FROM DEPT 
WHERE DEPTNO NOT IN (10,20,30);

AND

与操作

 SELECT EMPNO, ENAME, MGR, DEPTNO
 FROM EMP
 WHERE EMPNO=7499
 AND DEPTNO=30;

OR

或操作

SELECT EMPNO, ENAME, MGR, DEPTNO
FROM EMP
WHERE EMPNO=7499
OR DEPTNO=30;

LIKE模糊查询

SELECT column1, column2
FROM table_name
WHERE column1 
LIKE ‘Cond%';

通配符

  • 通配符“”表示匹配单个字符。即在查询语句中,一个“”只能表示匹配一个字符
  • 通配符“%”表示匹配0个或者多个字符。即一个“%”可以表示0个字符,也可以表示一个字符,也可以表示两个或者更多的字符。

ORDER BY排序

  • 对数据表中指定的某一列进行排序,也可以对数据表中指定的多个列进行排序操作
  • 如果ORDER BY 子句后面的关键字是ASC,则对查询的结果执行升序操作;如果ORDER BY 子句后面的关键字是DESC,则对查询的结果执行降序操作
  • 默认情况下时升序排序
SELECT column1,column2
FROM table1
WHERE condition
ORDER BY column1 [ASC| DESC],[column2 [ASC| DESC]],…

order by 按照先后顺序显示排序优先级

练习2

根据条件写出下面的查询语句:

查询EMP表的员工信息,要求满足以下条件

(1) 员工的名字以SM or SC开头

(2) 雇佣时间在1980-07-15到1987-07-15之间
(3)按照部门号升序,工资降序方式排序

(1)

SELECT * FROM emp WHERE ename like 'SM%' OR ename like 'SC%';

(2)

SELECT * FROM emp WHERE hiredate BETWEEN to_date('1980-07-15','yyyy-mm-dd') and to_date('1987-07-15','yyyy-mm-dd');

(3)

SELECT * FROM emp ORDER BY deptno,sal desc;

练习3

根据条件写出下面的查询语句:

查询EMP的员工工作(JOB)和MGR信息,要求满足以下条件

(1) 员工编号在7369和7876之间
(2)MGR的信息不重复

(1)

SELECT job,mgr FROM emp 
WHERE empno 
BETWEEN 7369 AND 7876;

(2)

SELECT distinct mgr,job 
FROM emp WHERE empno 
BETWEEN 7369 AND 7876;

JOIN

多表连接时使用别名,可以

  • 区分具有相同名称但是在不同表中的列
  • 限定多个表的列名称

定义别名后只能使用别名。

INNER JOIN

d INNER JOIN e ON d.deptno=e.deptno

主表条件用where,从表条件可以用and

SELECT a.EMPNO
             ,a.ENAME
             ,a.DEPTNO
             ,b.DNAME
FROM   emp a, 
             dept b
WHERE a.DEPTNO = b.DEPTNO
AND a.DEPTNO = 10;
SELECT a.EMPNO
             ,a.ENAME
             ,a.DEPTNO
             ,b.DNAME
FROM   emp a
 JOIN     dept b
ON a.DEPTNO = b.DEPTNO
AND a.DEPTNO = 10;
SELECT a.EMPNO
             ,a.ENAME
             ,a.DEPTNO
             ,b.DNAME
FROM   emp a
 JOIN     dept b
ON a.DEPTNO = b.DEPTNO
WHERE a.DEPTNO = 10;

OUTER JOIN 外连接

FROM a
LEFT JOIN b

a为主表
b为从表
左外连接时保留全部主表数据,
右外连接时保留所有从表数据;

GROUP BY

select count(*),job from emp group by job;

查询某个job的员工数。

当查询中存在group by子句时,select列表(或是having子句)中只能存在分组函数,或是出现在group by子句中的字段

select count(*),job,deptno from emp group by job,deptno order by deptno;

HAVING

限制分组

select count(*),job,deptno from emp group by job,deptno having deptno>10 order by deptno;

练习1

获取EMP表中列ENAME,SAL以及MGR对应的信息,要求满足下面的条件.
(1) LOC在CHICAGO
(2) SAL在1500以上
(3)请使用下面两种方法完成
WHERE a.col1=b.col2,
a JOIN b ON a.col1=b.col2

(1)

SELECT e.ename,e.sal,e.mgr FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE d.loc like 'CHICAGO' and e.sal<1500;

(2)

SELECT e.ename,e.sal,e.mgr FROM emp e,dept d WHERE e.deptno = d.deptno AND d.loc like 'CHICAGO' AND e.sal<1500;

练习2

查询员工以及对应部门的相关信息
要求:
(1)显示EMP表所有员工信息
(2)请使用LEFT JOIN和(+)两种方式完成

(1)

SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

(2)

SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno(+);

练习3

获取(EMP表)中所有的员工及其对应的部门(DEPT表)的相关信息.
要求:
(1)员工名称中必须以大写字母A开头,并且大写字母N结尾
(2)如果对应部门不存在,则显示该部门不存在

请使用LEFT JOIN和(+)两种方式完成

(1)

SELECT e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,nvl(to_char(d.deptno),'不存在')
FROM emp e 
LEFT JOIN dept d 
ON e.deptno=d.deptno 
WHERE e.ename LIKE 'A%N';

(2)

SELECT e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,nvl(to_char(d.deptno),'不存在')
FROM emp e,dept d 
WHERE e.deptno=d.deptno AND
e.ename LIKE 'A%N';
上一篇:MySQL ---存储过程和触发器


下一篇:oracle学习笔记5:pl/sql流程控制语句