一、概述
SQL(结构化查询语言)是一种用于管理关系型数据库的语言,它允许用户执行查询、更新、插入和删除等操作。
二、简介和分类
1、简介:SQL(结构化查询语言)
2、SQL语言分类
(1)数据定义语言(DDL): 用于定义数据库的结构,如创建或修改表、视图、索引等。包括:
create :创建表或其他对象的结构
alter :修改表或其他对象的结构
drop:删除表或其他对象的结构
truncate:删除表数据,保留表结构
CREATE TABLE employees (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
job_title VARCHAR2(50)
);
(2)数据操纵语言(DML): 用于操作数据库中的数据,如查询、插入、更新和删除。
用于改变数据表中的数据。和事务相关,执行完后需要经过事务控制语句提交后才能真正的将改变应用到数据库中。
包括:
insert:将数据插入到数据表中
update:更新数据表中已存在的数据
delete:删除数据表中的数据
SELECT * FROM employees;
INSERT INTO employees (id, name, job_title) VALUES (1, 'Alice', 'Engineer');
UPDATE employees SET job_title = 'Manager' WHERE id = 1;
DELETE FROM employees WHERE id = 1;
(3)事务控制语言(TCL): 用于管理数据库的事务,确保数据的一致性和完整性。包括:
commit:提交,确认已经进行的数据改变
rollback:回滚,取消已经进行的数据改变
savepoint:保存点,使当前的事务可以回退到指定的保存点,便于取消部分改变
START TRANSACTION;
INSERT INTO employees (id, name, job_title) VALUES (1, 'Alice', 'Engineer');
COMMIT;
ROLLBACK;
(4)数据控制语言(DCL): 用于管理数据库的访问权限和安全性。
用于执行权限的授予和收回操作。
包括:
grant:授予,用于给用户或角色授予权限
revoke:用于收回用户或角色已有的权限
create user:创建用户
GRANT SELECT ON employees TO bob;
REVOKE SELECT ON employees FROM bob;
三、数据查询语言语法
1、语法
select *|列名|表达式 as 别名
from 表名
where 条件
group by 分组字段
having 筛选条件
order by 排序字段
limit 索引位,总记录数
2、在Oracle的scrott下测试
--查询全部数据
select * from emp;
select * from scott.emp;
--查询部分顺序
select empno,ename,job from emp;
--带有条件查询
select ename,sal from emp where sal>2000;
--别名
select empno as eno,ename "姓名" from emp;
--as可以省略,中文别名用双引号包裹
--查询中使用运算符
select ename,sal*12 "年薪" from emp;
--使用distinct
select distinct job from emp;
--连接运算符:||
select ename || '是一个' || job from emp;
3、单行函数
(1)SQL函数有单行函数和多行函数,其区别为:
单行:输入一行,返回一行
多行:输入多行,返回一行
(2)单行函数:
- 操作数据对象
- 接受函数返回一个结果
- 参数可以是列、值、表达式
- 只对一行操作,且每行返回一个结果
- 可以转换数据类型,进行计算和格式化,可以嵌套
- 可分为字符函数、数字函数、日期函数、转换函数
- function_name[(arg1,arg2,...)]
(3)分类
--1、字符型单行函数
--(1)lower(列名|表达式)
--可以把传入的值转换成小写
select lower('ABC') from dual;
select lower(ename)from emp;
--(2)upper(列名|表达式)
--把传入的值转换成大写
select upper('abc') from dual;
select upper(ename)from emp;
--(3)concat(列名1|表达式,列名2|表达式)
--连接两个字符串
select concat('abd','def') from dual;
select concat(ename,job) from emp;
--(4)substr(列名|表达式,m,[n])
--截取字符串,m代表从某个位置开始截取;n代表截取的字符串长度
select substr('abcdefghijk',3,5) from dual;
select substr('abcdefghijk',5) from dual;
select substr('ename',2,3)from emp;
--(5)length(列名|表达式)
--计算字符串中的字符个数,空格也会计数
select length('abcd')from dual;
select ename,length(ename)from emp;
select length('abc gef')from dual;
--(6)instr(列名|表达式,'查找的字符串')
--查询目标字符串在源字符串中的位置
select instr('abcdefghi','cd') from dual;
--(7)replace(源字符串,被替换字符串,替换字符串)
--把某个字符串替换成另一个字符串
select replace('abasnddkjq','snd','dns')from dual;
--2、数字型单行函数
--(1)round(num,n)
--对num指定n位小数,会四舍五入
select round(3.1415,2) from dual;
select round(3.1465,2) from dual;
--(2)trunc(num,n)
----对num指定n位小数,不会四舍五入
select trunc(3.1415,2) from dual;
select trunc(3.1465,2) from dual;
--(3)mod(num1,num2)
--求num1除以num2的余数
select mod(5,3) from dual;
select mod(3,5) from dual;
--3、日期型单行函数
--(1)sysdate:获取系统当前日期时间
select sysdate from dual;
--可以进行计算,和一个数字相加减,该数字代表天数
select sysdate+5 from dual;
select sysdate-5 from dual;
select sysdate+30 from dual;
--如果要加减小时数,则除以24
select sysdate+12/24 from dual;
--两个日期相减,得到相差的天数
select sysdate-to_date('14-4月-24') from dual;
select to_date('2024-10-24','yyyy/mm/dd') from dual;
--(2)add_months(日期值,n)
--在某个日期上加减n个月
select add_months('19-4月-24',3) from dual;
select add_months('19-4月-24',-3) from dual;
四、空值和空值处理函数
1、空值:没有明确定义,具有不确定性的一类值
2、空值用is null或 is not null判断
3、空值处理函数
select nvl2(comm,comm,0) from emp;
(1)nvl(num1,num2)
判断num1是否为空值。是则返回num2,否则返回num1;两个值类型要相同
(2)nvl2(num,j,k)
该函数是nvl的功能增强
判断num是否为空,是则返回k,否则返回j
select nvl(comm,0) from emp;
五、逻辑判断函数
1、case函数:case表达式允许您根据条件逻辑来选择要返回的值
(1)语法:
case temp when n1 then a1
when n2 then a2
...
when nn then an
else c
end
判断temp和n1是否相等,是则返回a1,
否则判断temp和n2是否相等,是则返回a2,
依次判断。如果都不相等,则返回else后的c
(2)在oracle中的scott下的emp表中测试
select ename,job,sal,
case job when 'CLERK' then sal+100
when 'SALESMAN' then sal+200
when 'MANAGER' then sal+300
else sal
end "涨后工资"
from emp;
2、decode函数
(1)语法
decode(temp,n1,a1,
n2,a2,
...
nn,an,
c)
判断temp和n1是否相等,是则返回a1,
否则判断temp和n2是否相等,是则返回a2,
依次判断。如果都不相等,则返回c
(2)在oracle中的scott下的emp表中测试
select ename,job,sal,
decode(job,'CLERK',sal+100,
'SALESMAN',sal+200,
'MANAGER',sal+300,
sal) "涨后工资"
from emp;
六、分组函数
1、sum()求和
select sum(sal)"工资和" from emp;
取别名时as可以直接省略
2、avg():求平均值
select avg(sal) from emp;
3、max():求最大值
select max(sal) from emp;
4、min():求最小值
select min(sal) from emp;
5、count():计数
select count(*)"人数" from emp;
6、group by:分组
select job,count(*) from emp group by job;
7、having:筛选
select job,count(*) from emp group by job having count(*)>2;
七、数据操作语言
-
增加(插入)数据(insert)
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...);
-
注意事项:
-
在插入数据的时候,如果插入的数据是所有列的数据,那么列名则可以省略不写(建议不省略)。
-
插入的数据个数必须和列名的个数及顺序形成一一对应的关系且数据类型要匹配,标识列不能维护。
-
对于允许为空的字段,可以使用null关键字进行插入,column表示列名,value表示值
-
3、删除数据(delete)
delete from emp where ename='张大胆';
4、修改数据(update)
update emp set sal=25000 where ename='张大胆';
5、查询数据(select)
select * from emp