一、DML、DDL、DCL
SQL语句分为以下三种类型:
DML: Data Manipulation Language 数据操纵语言
DDL: Data Definition Language 数据定义语言
DCL: Data Control Language 数据控制语言
1.DML用于查询与修改数据记录,包括如下SQL语句:
INSERT:添加数据到数据库中
UPDATE:修改数据库中的数据
DELETE:删除数据库中的数据
SELECT:选择(查询)数据
SELECT是SQL语言的基础,最为重要。
2,DDL用于定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句:
CREATE TABLE:创建数据库表
ALTER TABLE:更改表结构、添加、删除、修改列长度
DROP TABLE:删除表
CREATE INDEX:在表上建立索引
DROP INDEX:删除索引
3.DCL用来控制数据库的访问,包括如下SQL语句:
GRANT:授予访问权限
REVOKE:撤销访问权限
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点
LOCK:对数据库的特定部分进行锁定
二、基本SQL——select语句
1.格式
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table;
2.注意事项
SQL 语言大小写不敏感。
SQL 可以写在一行或者多行
关键字不能被缩写也不能分行
各子句一般要分行写。
使用缩进提高语句的可读性。
3.算术运算符的优先级
乘除的优先级高于加减。
同一优先级运算符从左向右执行。
括号内的运算先执行。
4.空值的定义
空值是无效的,未指定的,未知的或不可预知的值
空值不是空格或者0。
包含空值的数学表达式的值都为空值
5.列的别名
重命名一个列。
便于计算。
紧跟列名,也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。
6.连接符
把列与列,列与字符连接在一起。
用 ‘||’表示。
可以用来‘合成’列。
7.字符串
字符串可以是 SELECT 列表中的一个字符,数字,日期。
日期和字符只能在单引号中出现。
每当返回一行时,字符串被输出一次。
8.删除重复行
在 SELECT 子句中使用关键字 ‘DISTINCT’ 删除重复行。
9.显示表结构
DESC[RIBE] tablename
10.过滤
使用WHERE 子句,将不满足条件的行过滤掉。
WHERE 子句紧随 FROM 子句。
11.字符和日期
字符和日期要包含在单引号中。
字符大小写敏感,日期格式敏感。
默认的日期格式是 DD-MON月-RR。
12.比较运算
区别于Java语言的有:
等于 =(不是==)
赋值 :=
不等于 <>(也可以是!=)
其他比较运算:
BETWEEN...AND...:在两个值之间(包含边界)
IN(set):等于值列表中的一个
LIKE:模糊查询
IS NULL:空值
13.LIKE运算
使用 LIKE 运算选择类似的值
选择条件可以包含字符或数字:
% 代表零个或多个字符(任意个字符)。
_ 代表一个字符。
回避特殊符号的:使用转义符。例如:将[%]转为[\%]、[_]转为[\_],然后再加上[ESCAPE ‘\’] 即可将%和_转换成原本的意义。
--表示以'IT_'开头的job_id
job_id LIKE 'IT\_%' escape '\';
14.逻辑运算符
AND:逻辑与
OR:逻辑或
NOT:逻辑非
15.order by子句
ORDER BY {column, expr, alias} [ASC|DESC];
ASC(ascend): 升序。默认为升序
DESC(descend): 降序
ORDER BY 子句在SELECT语句的结尾。
15.单行函数
(1)特点
操作数据对象
接受参数返回一个结果
只对一行进行变换
每行返回一个结果
可以转换数据类型
可以嵌套
参数可以是一列或一个值
(2)字符函数
大小写控制函数 结果
lower('SQL Course') sql course
upper('SQL Course') SQL COURSE
initcap('SQL Course') Sql Course
字符控制函数 结果
CONCAT('Hello', 'World') HelloWorld
SUBSTR('HelloWorld',2,3) ell
LENGTH('HelloWorld') 10
INSTR('HelloWorld', 'W') 6
LPAD(salary,10,'*') *****24000
RPAD(salary, 10, '*') 24000*****
TRIM('H' FROM 'HelloHWorldH') elloHWorld
REPLACE(‘babcdb’,’b’,’m’) mamcdm
注意:
substr函数的第三个参数指子字符串的长度,而不是右边界
trim函数只替换字符串左边界和右边界的所有字符,中间不会替换
replace函数替换字符串中的所有指定字符
(3)数字函数
ROUND(45.926,2) 45.93
TRUNC(45.926,2) 45.92
MOD(1600,300) 100
(4)日期函数
函数 结果 描述
MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') 19.6774194 两个日期相差的月数
ADD_MONTHS ('11-JAN-94',6) '11-JUL-94' 向指定日期中加上若干月数
NEXT_DAY ('01-SEP-95','FRIDAY') '08-SEP-95' 指定日期的下一个星期 * 对应的日期
LAST_DAY('01-FEB-95') '28-FEB-95' 本月的最后一天
ROUND(25-JUL-95,'MONTH') 01-AUG-95 日期四舍五入
TRUNC(25-JUL-95 ,'YEAR') 01-JAN-95 日期截断
注意:
在日期上加上或减去一个数字结果仍为日期。
两个日期相减返回日期之间相差的天数。
日期不允许做加法运算,无意义
可以用数字除24来向日期中加上或减去天数。
yyyy 年 mm 月 dd 日 day 星期 hh 小时 mi 分钟 ss 秒
(5)转换函数
TO_CHAR函数对日期的转换:TO_CHAR(date, 'format_model')
注意:
必须包含在单引号中而且大小写敏感。
可以包含任意的有效的日期格式。
日期之间用逗号隔开。
使用双引号向日期中添加字符。
实例:
SELECT TO_CHAR(sysdate,‘yyyy"年"mm"月"dd"日" hh:mi:ss’) FROM dual; 2019年3月31日 15:36:07
TO_DATE 函数对字符的转换 TO_DATE(char[, 'format_model'])
实例:
TO_DATE(‘2012年10月29日 08:10:21’,’yyyy“年”mm”月”dd“日”hh:mi:ss’) From dual;
TO_CHAR函数对数字的转换 TO_CHAR(number, 'format_model')
格式:
9 数字
0 没有数字则返回0
$ 美元符号
L 本地货币符号
, 千位符
实例:
TO_CHAR(1234567.89,'$000,000,999.99') 返回字符串'$001,234,567.89'
TO_NUMBER 函数对字符的转换 TO_NUMBER(char[, 'format_model'])
实例:
TO_NUMBER(‘¥1,234,567,890.00’,’L999,999,999,999.99’)
(6)通用函数:适用于任何数据类型,同时也适用于空值
NVL (expr1, expr2):将expr1的空值转换成expr2的值,可以使用的数据类型有日期、字符、数字
NVL2 (expr1, expr2, expr3) : expr1不为NULL,返回expr2;为NULL,返回expr3。
NULLIF (expr1, expr2):相等返回NULL,不等返回expr1
COALESCE (expr1, expr2, ..., exprn):如果第一个表达式为空,则返回下一个表达式,对其他的参数进行COALESCE
(7)条件表达式(if-then-else逻辑)
case表达式
格式:
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
decode函数
格式:
DECODE(col|expression, search1, result1 ,
[, search2, result2,...,]
[, default])
16.多表查询
使用表名前缀在多个表中区分相同的列
在不同表中具有相同列名的列可以用表的别名加以区分。
例如:按照department_id查询employees(员工表)和departments(部门表)
的信息。
方式一(通用型):SELECT ... FROM ... WHERE
SELECT e.last_name,e.department_id,d.department_name
FROM employees e,departments d
where e.department_id = d.department_id
方式二:SELECT ... FROM ... JOIN ... ON ...
常用方式,较方式一,更易实现外联接(左、右、满)
SELECT last_name,e.department_id,department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 外连接的 WHERE 子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+).
右外连接:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;
或
SELECT table1.column,table2.column
FROM table1 RIGHT OUTER JOIN table2
ON (table1.column = table2.column);
左外连接:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);
或
SELECT table1.column,table2.column
FROM table1 LEFT OUTER JOIN table2
ON (table1.column = table2.column);
满外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 。
SELECT table1.column,table2.column
FROM table1 FULL OUTER JOIN table2
ON (table1.column = table2.column);
17.分组函数:作用于一组数据,并对一组数据返回一个值
AVG():求平均值
SUM():合计函数
MIN():最小值
MAX():最大值
COUNT(expr):返回expr不为空的记录总数
注意:
组函数忽略空值,如AVG(commission_pct),commission_pct在某些行中为null,而AVG() = sum()/count(),数值会发生错误。
NVL函数使分组函数无法忽略空值,如AVG(NVL(commission_pct,0))。
COUNT(DISTINCT expr)返回expr非空且不重复的记录总数。
不能在 WHERE 子句中使用组函数。
可以在 HAVING 子句中使用组函数。
group by子句语法:
可以使用GROUP BY子句将表中的数据分成若干组
在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中。
例:
SELECT department_id,job_id, AVG(salary)
FROM employees
GROUP BY department_id,job_id ;
18.子查询
特点:
子查询 (内查询) 在主查询之前一次执行完成。
子查询的结果被主查询(外查询)使用 。
子查询要包含在括号内。
将子查询放在比较条件的右侧。
单行子查询:
只返回一行。
使用单行比较操作符: = > >= < <= <>
多行子查询:
返回多行。
使用多行比较操作符: IN 等于列表中的任意一个 ANY 和子查询返回的某一个值比较 ALL 和子查询返回的所有值比较