Каталог статей
1. Введение в SQL
SQL — это язык структурированных запросов (язык структурированных запросов), который специально используется для таких операций, как доступ к данным, обновление данных и управление базами данных.
При разработке Oracle клиент отправляет оператор SQL на сервер, а сервер компилирует и выполняет оператор SQL и возвращает результат выполнения клиенту. Операторы Oracle SQL состоят из следующих команд:
В настоящее время основные продукты баз данных (такие как SQL Server, Oracle, MySQL) поддерживают стандартные операторы SQL. Язык определения данных, добавление таблиц, операции удаления и изменения, простой запрос данных, отправка и откат транзакций, авторизация и отзыв разрешений и т. д. Oracle и MySQL в основном совместимы в работе.
2. Объяснение типов данных
Ядром базы данных Oracle является таблица.Общие типы данных, используемые в столбцах таблицы, следующие:
тип | значение |
---|---|
СИМВОЛ(длина) | Хранит строки фиксированной длины. Параметр length указывает длину. Если длина сохраненной строки меньше длины, заполните ее пробелами. Длина по умолчанию равна 1, а максимальная длина не может превышать 2000 байт. |
VARCHAR2(длина) | Хранит строки переменной длины. length определяет максимальную длину строки. Длина по умолчанию равна 1, а максимальная длина не может превышать 4000 символов. |
НОМЕР(п, с) | Он может хранить как числа с плавающей запятой, так и целые числа.p представляет максимальное количество цифр в числе (если это десятичное число, включая целую часть, десятичную часть и десятичную точку, p по умолчанию равно 38), а s относится к количеству десятичные знаки. |
ДАТА | Сохраняет дату и время, эпоху, 4-значный год, месяц, день, час, минуту и секунду, а также время с 1 января 4712 г. до н.э. по 31 декабря 4712 г. н.э. |
ВРЕМЯ | Он не только хранит год, месяц, день, часы, минуты и секунды даты, а также последние 6 цифр секунды, но также включает часовой пояс. |
КЛОБ | Храните большой текст, например неструктурированные XML-документы. |
BLOB-объект | Храните двоичные объекты, такие как графика, видео, звуки и т. д. |
Пример, соответствующий типу NUMBER:
Формат | Номер введен | фактическое хранение |
---|---|---|
ЧИСЛО | 1234,567 | 1234,567 |
НОМЕР (6, 2) | 123,4567 | 123,46 |
НОМЕР (4, 2) | 12345,67 | Введенное число превышает указанную точность и не может быть сохранено в базе данных. |
Для типов даты вы можете использовать встроенную функцию sysdate, чтобы получить текущую системную дату и время и вернуть тип DATE, а также использовать функцию systimestamp для возврата текущей даты, времени и часового пояса.
В запросе Oracle вы должны использовать полный синтаксис «выбрать столбец... из таблицы». При запросе однострочной функции используйте таблицу DUAL после from. Двойная таблица имеет в системе только одну строку и один столбец. Эта таблица используется для выбора... при выводе однострочной функции. Используйте from для грамматической полноты.
3. Создайте таблицы и ограничения
1. Структура таблицы
Синтаксис создания таблиц в Oracle
Имя таблицы CREATE TABLE (
Ограничения типа имени поля,
Ограничения типа имени поля,
Ограничения типа имени поля
)
Нечувствительность к регистру в базе данных
Связанные случаи создания таблиц и аннотаций
-- 创建一张用户表。用来存储用户信息
CREATE TABLE t_student(
id number(5) , -- 学生编号
name varchar2(20) , -- 学生的姓名
age number(2) , -- 学生的年龄
address varchar2(100) -- 学生的地址
); -- SQL语句结束 我们添加一个 英文状态下的 ;
-- 给 table 添加注释:
COMMENT ON TABLE t_student is '学生表'; -- 给表添加注释
COMMENT ON COLUMN t_student.id is '学生编号' ; -- 给表中的字段添加注释
COMMENT ON COLUMN t_student.name is '学生姓名' ;
COMMENT ON COLUMN t_student.age is '年龄' ;
COMMENT ON COLUMN t_student.address is '学生住址';
2. Обновить структуру таблицы.
После создания структуры таблицы нам может потребоваться внести в нее изменения.
-- 对表结构的操作
-- 1.删除表
DROP TABLE t_student;
CREATE TABLE t_student(
id number(5) , -- 学生编号
name varchar2(20) , -- 学生的姓名
age number(2) , -- 学生的年龄
address varchar2(100) -- 学生的地址
); -- SQL语句结束 我们添加一个 英文状态下的 ;
-- 添加字段
ALTER TABLE t_student ADD gender char(3);
-- 修改字段类型
ALTER TABLE t_student MODIFY gender varchar2(3);
-- 修改字段名称
ALTER TABLE t_student RENAME COLUMN gender to sex;
-- 删除字段
ALTER TABLE t_student DROP COLUMN sex;
3. Ограничения
1. Ненулевое ограничение. Содержимое этого поля не может быть пустым.
DROP TABLE t_student;
CREATE TABLE t_student(
id number(5) , -- 学生编号
name varchar2(20) not null, -- 学生的姓名
age number(2) default 18, -- 学生的年龄
address varchar2(100), -- 学生的地址
gender char(3) default '男'
); -- SQL语句结束 我们添加一个 英文状态下的 ;
2. Значение по умолчанию: если значение столбца равно нулю, оно будет заполнено значением по умолчанию.
DROP TABLE t_student;
CREATE TABLE t_student(
id number(5) , -- 学生编号
name varchar2(20) not null, -- 学生的姓名
age number(2) default 18, -- 学生的年龄
address varchar2(100), -- 学生的地址
gender char(3) default '男'
); -- SQL语句结束 我们添加一个 英文状态下的 ;
3. Ограничение уникальности: когда есть данные. В этом столбце не могут появляться повторяющиеся записи. ноль не включает
DROP TABLE t_student;
CREATE TABLE t_student(
id number(5) unique , -- 学生编号
name varchar2(20) not null, -- 学生的姓名
age number(2) default 18, -- 学生的年龄
address varchar2(100), -- 学生的地址
gender char(3) default '男'
); -- SQL语句结束 我们添加一个 英文状态下的 ;
– Ненулевое + уникальное ограничение
DROP TABLE t_student;
CREATE TABLE t_student(
id number(5) unique not null , -- 学生编号
name varchar2(20) not null, -- 学生的姓名
age number(2) default 18, -- 学生的年龄
address varchar2(100), -- 学生的地址
gender char(3) default '男'
); -- SQL语句结束 我们添加一个 英文状态下的 ;
4. Ограничение первичного ключа: ограничение, которое однозначно идентифицирует поле. Поле, измененное первичным ключом, не может повторяться и не может иметь нулевые значения -
и в таблице может появиться только одна аннотация [совместный первичный ключ: один первичный ключ содержит несколько полей]
DROP TABLE t_student;
CREATE TABLE t_student(
id number(5) primary key , -- 学生编号
name varchar2(20) not null, -- 学生的姓名
age number(2) default 18, -- 学生的年龄
address varchar2(100), -- 学生的地址
gender char(3) default '男'
); -- SQL语句结束 我们添加一个 英文状态下的 ;
– Добавить первичный ключ после создания таблицы
DROP TABLE t_student;
CREATE TABLE t_student(
id number(5) , -- 学生编号
name varchar2(20) not null, -- 学生的姓名
age number(2) default 18, -- 学生的年龄
address varchar2(100), -- 学生的地址
gender char(3) default '男'
); -- SQL语句结束 我们添加一个 英文状态下的 ;
alter table t_student add constraints pk_student_id primary key(id);
5. Внешний ключ: связь между таблицами
- Внешний ключ: он может неоднократно появляться в основной таблице, но его значение является первичным ключом другой таблицы. Внешний ключ связывает две таблицы.
drop table t_class;
create table t_class(
id number(3) primary key,
name varchar2(30)
);
drop table t_student ;
create table t_student(
id number(3) primary key,
name varchar2(30) ,
classid number(3)
);
– Поддерживать отношения с внешними ключами
alter table t_student add constraints fk_student_classid foreign key(classid) references t_class(id);
6.Проверьте ограничения: в зависимости от типа поля. Дальнейшее повышение точности данных
DROP TABLE t_student;
CREATE TABLE t_student(
id number(5) unique not null , -- 学生编号
name varchar2(20) not null, -- 学生的姓名
--age number(2) check(age > 1 and age < 25), -- 学生的年龄
age number(2) check(age between 1 and 25), -- 学生的年龄
address varchar2(100), -- 学生的地址
gender char(3) check (gender in ('男','女'))
); -- SQL语句结束 我们添加一个 英文状态下的 ;
4. Заявление DML
Язык операций с данными DML: реализует операции вставки, изменения и удаления данных с помощью SQL. Часто используемые голоса операций с данными в Oracle включают в себя
- ВСТАВЛЯТЬ
- ОБНОВЛЯТЬ
- УДАЛИТЬ
- ВЫБЕРИТЕ… ДЛЯ ОБНОВЛЕНИЯ
1.ВСТАВИТЬ
Оператор вставки данных
INSERT INTO 表名(fieldName1,fieldName1,...fieldNameN)values(value1,value2,...,valueN)
-- 案例
insert into t_class(id,name)values(1,'计算机');
Простой синтаксис: если вставляемая нами запись требует добавления информации в каждое поле таблицы. Тогда мы можем опустить список полей, но последующий список значений должен соответствовать порядку полей в структуре таблицы.
INSERT INTO 表名 values(value1,value2,...,valueN)
INSERT INTO t_class values(2,'计算机');
-- 下面是错误示范
INSERT INTO t_class values('英语',3);
2. Серийный номер
Первичный ключ: когда мы вставляем данные, нам необходимо обеспечить их уникальность.
- Решение по серийному номеру предоставлено в Orlac для решения
- MySQL предоставляет решение для автоматического увеличения первичного ключа.
- в распределенной среде. Мы можем решить эту проблему с помощью распределенного идентификатора.
Синтаксис серийного номера:
CREATE SEQUENCE 序列名称
[INCREMENT BY] -- 每次自增的数量
[START WITH 1] -- 从1开始计数
[NOMAXVALUE] -- 不设置最大值
[NOCYCLE] -- 一直累加,不循环
CACHE 10; -- 缓存10
Кейс-приложение
create sequence s_class; -- 从1开始 每次增长1个
-- currval是在执行了nextval之后才会生效
select s_class.currval from dual;
select s_class.nextval from dual;
Применение операторов вставки
INSERT INTO t_class values(s_class.nextval,'计算机');
3. ОБНОВЛЕНИЕ
Необходимо внести коррективы в данные, которые были вставлены в структуру таблицы. Соответствующая грамматическая структура
UPDATE 表名 SET field1=value1,field2=value2 ... [where 条件]
update t_class set name = '软件' ;
update t_class set name = '计算机1班' where id = 15;
-- 更新id为18 19 21的记录为 '计算机2班'
update t_class set name = '计算机2班' where id = 18 or id=19 or id=21 ;
update t_class set name = '计算机3班' where id in (14,16,17) ;
update t_class set name = '英语1班' where id >= 100 and id <=200 ;
update t_class set name = '英语2班' where id between 100 and 130 ;
update t_class set name = 'test' where id != 24 ;
update t_class set name = 'test666' where id <> 22 ;
4. Удалить заявления
DELETE FROM 表名 [where 条件]
delete from t_class where id = 17;
-- 对于null的查询我们是用 is null 来匹配的
delete from t_class where name is null;
-- delete 删除会做数据的缓存
delete from t_class ; -- 会删除表中的所有的数据。 删库跑路 要小心使用
-- 删除全表的数据,直接删除数据。不做缓存处理。 效率高。风险大
truncate table t_class ;
5. Вставка нескольких строк
-- 多行插入
insert into t_class_copy(id,name)
select id,name from t_class
select * from t_class_copy1
-- 复制表
create table t_class_copy as select * from t_class where 1 != 1;
-- 复制表 带有数据的情况
create table t_class_copy1 as select * from t_class ;
5. Заявление DQL
DQL: язык запросов данных.
Синтаксическая структура оператора запроса
--语法结构
SELECT <列名>
FROM <表名>
[WHERE <查询条件> ]
[ORDER BY <排序的列名>[ASC或者DESC] ]
[GROUP BY <分组字段> ]
1. Простой оператор запроса
1.1 Объяснение пунктов знаний
Содержание полного запроса таблицы:
create sequence s_student;
insert into t_student(id,name,age,address,gender)values(s_student.nextval,'王五',18,'湖南长沙','女') ;
-- 1.查询学生表的所有信息 * 表示查询表中的所有的列
select * from t_student;
-- 2.查询特定的列
select id,name,age from t_student;
-- 3.查询信息使用别名来标识,别名不能用' 我们得使用 "
select
id as "学生编号",
name as "学生姓名",
age as "学生年龄"
from t_student;
-- 我们可以省略 ""
select
id as 学生编号,
name as 学生姓名,
age as 学生年龄
from t_student;
-- 我们还可以省略 as 关键字
select
id 学生编号,
name 学生姓名,
age 学生年龄
from t_student;
-- 如果别名中有特殊符号的情况。那么不能省略""
select
id "【学生编号】",
name as 学生姓名,
age as 学生年龄
from t_student;
-- 4.常量的处理
select id,name,age ,29 体重 from t_student
-- 5.查询学生信息。 id 和 name 拼接起来 ||
select id,name,age , '【'||id||'-'||'name'||'】' 组合 from t_student
Условный запрос:
drop table t_student ;
create table t_student(
id number(3) primary key,
name varchar2(30) ,
gender char(3) ,
age number(2),
class_id number(5)
)
Insert into DPB.T_STUDENT (ID,NAME,GENDER,AGE,CLASS_ID) values (1,'张三','男 ',18,1001);
Insert into DPB.T_STUDENT (ID,NAME,GENDER,AGE,CLASS_ID) values (2,'李四','女 ',22,1002);
Insert into DPB.T_STUDENT (ID,NAME,GENDER,AGE,CLASS_ID) values (3,'小明','男 ',35,1003);
Insert into DPB.T_STUDENT (ID,NAME,GENDER,AGE,CLASS_ID) values (4,'小花','女 ',16,1001);
Insert into DPB.T_STUDENT (ID,NAME,GENDER,AGE,CLASS_ID) values (5,'张三疯','男 ',18,1001);
Insert into DPB.T_STUDENT (ID,NAME,GENDER,AGE,CLASS_ID) values (6,'王张妮','女 ',25,1002);
-- 6.查询出年龄在18到25之间的学生
select *
from t_student
where age >= 18 and age <= 25
select * from t_student where age between 18 and 25;
-- 7.查询出班级编号为1001或者1002的学生信息
select * from t_student where t_student.class_id = 1001 or t_student.class_id = 1002
select * from t_student t where t.class_id = 1001 or t.class_id = 1002
select * from t_student t where t.class_id in (1001,1002)
-- 8.查询出不在班级编号为1001和1002的学生信息
select * from t_student where class_id not in (1001,1002) or class_id is null
-- 9.查询出所有姓张的学员的信息 模糊查询: like
select * from t_student where name like '张%'
select * from t_student where name like '%张%'
-- 10.查询所有姓张的学生信息。并且名字又两个字组成
select * from t_student where name like '张_'
-- 11.查询所有的学生信息。按照年龄升序排列 asc 升序 可以省略
select * from t_student;
select * from t_student order by age ;
select * from t_student order by age desc;
-- 11.查询所有的学生信息。按照班级升序。如果班级相同则按照年龄降序
select * from t_student order by class_id , age desc
-- 12.查询学生表中的所有的班级编号 distinct 关键字可以帮助我们去掉重复的记录。
-- 如果后面有多个列。去掉的是多个列组合中相同的记录
select distinct class_id,age from t_student
1.2 Объяснение случая
Объяснение упражнения SQL:
Структура таблицы
Emp----员工信息表
Ename varchar2(30), --姓名
Empno number(5), --编号
Deptno number(5), --所在部门
Job varchar2(20), --工种(人员类别),如:manager 经理,clerk 办事员
Hiredate Date, --雇佣日期
Comm number(6,2), --佣金
Sal number(6,2) --薪金
Mgr number(5) --员工上司编号
Dept-----部门表
Dname varchar2(30), --部门名
Deptno number(5), --部门号
Loc varchar2(50) --位置
Подготовьте данные:
create table emp --–创建员工信息表
(
Ename varchar2(30), --姓名
Empno number(5), --编号
Deptno number(5), --所在部门
Job varchar2(20), --工种(人员类别),如:manager 经理,clerk 办事员
Hiredate Date, --雇佣日期
Comm number(7,2), --佣金
Sal number(7,2) , --薪金
Mgr number(5) --编号
);
insert into EMP (ENAME, EMPNO, DEPTNO, JOB, HIREDATE, COMM, SAL, MGR)
values ('张三', 1, 10, '办事员', null, 500, 2000, null);
insert into EMP (ENAME, EMPNO, DEPTNO, JOB, HIREDATE, COMM, SAL, MGR)
values ('李四', 2, 10, '办事员', null, 650, 2333, null);
insert into EMP (ENAME, EMPNO, DEPTNO, JOB, HIREDATE, COMM, SAL, MGR)
values ('王五', 3, 20, '办事员', null, 1650, 1221, null);
insert into EMP (ENAME, EMPNO, DEPTNO, JOB, HIREDATE, COMM, SAL, MGR)
values ('小张', 4, 20, '经理', null, 980, 3200, null);
insert into EMP (ENAME, EMPNO, DEPTNO, JOB, HIREDATE, COMM, SAL, MGR)
values ('小刘', 5, 10, '办事员', null, 500, 2000, null);
commit;
create table dept --部门表
(
Dname varchar2(30), --部门名
Deptno number(5), --部门号
Loc varchar2(50) -- 部门位置
);
insert into DEPT (DNAME, DEPTNO, LOC)
values ('市场部', 10, '大连');
insert into DEPT (DNAME, DEPTNO, LOC)
values ('研发部', 20, '沈阳');
insert into DEPT (DNAME, DEPTNO, LOC)
values ('人事部', 30, '深圳');
insert into DEPT (DNAME, DEPTNO, LOC)
values ('人事部', 40, '广州');
commit;
2. Функция агрегирования
Роль агрегатных функций: решение наших потребностей в статистике данных
-- 聚合函数和分组函数
-- 1.统计学生的人数 count(字段名称) 统计该列中数据不为空的记录条数
select count(*),count(name),count(gender),count(age),count(1)
from t_student ;
-- count(*) 和 count(1) 的区别
select t_student.*,1
from t_student ;
-- 2.其他常用的统计函数
select count(1),max(age),min(age),sum(age),round(avg(age))
from t_student ;
3. Групповой запрос
分组函数 group by
-- 1> 不和聚合函数一块使用,作用和distinct是一样。可以去掉重复的记录
select * from emp ;
select deptno from emp group by deptno ;
select distinct deptno from emp;
select deptno,job
from emp
group by deptno , job
order by deptno;
-- 2>和聚合函数一块使用的场景,聚合函数统计的数据就不是查询的所有的数据了。而是分组后的数据
-- 分组后的数据中我们不能直接出现非分组的字段
-- a.统计出学生表中男生和女生的人数
select gender,count(1) from t_student group by gender;
-- b.统计出学生表中每个班级的人数
select class_id,count(1) from t_student t group by t.class_id;
-- c.统计出学生表中每个班级中的男生和女生人数 聚合函数统计的是分组后的最小单位的数据
select class_id,gender,count(1) from t_student group by class_id ,gender ;
-- d.统计出学生表中年龄大于18的男生和女生的人数
select gender,count(1)
from t_student
where age > 18 -- where 的位置,必须是要在group by 之前。作用呢是筛选要分组的数据
group by gender
-- e.统计出学习表中年龄大于18的班级人数大于1的记录
select class_id,count(1)
from t_student
where age > 18
group by class_id
having count(1) > 1 -- 在group by 之后。和group by 配合使用。作用是过滤分组后的数据
4. Запрос нескольких таблиц
Oracle и MySQL являются реляционными базами данных. [Связь] относится к связи между таблицами и данными между таблицами.
多表查询
-- 1.交叉连接:获取两张表的笛卡尔乘积
select * from t_class ;
select * from t_student;
-- 查询出学生信息和对应的班级信息
select t1.*,t2.*
from t_student t1,t_class t2
-- 等值连接:在交叉连接的基础上添加过滤条件
select t1.*,t2.*
from t_student t1,t_class t2 -- 1000 * 1000 = 100W
where t1.class_id = t2.id -- where 关键是在结果集之后做的条件筛选
-- 内连接:左边表结构中的记录和右边表结构中的记录连接的时候会根据on中的条件判断。如果满足就获取。否则都丢失
select t1.*,t2.*
from t_student t1
inner join t_class t2
on t1.class_id = t2.id
-- 查询出学生表中的所有的记录。同时显示学生对应的班级名称
select t1.*,t2.*
from t_student t1
inner join t_class t2
on t1.class_id = t2.id
-- 左连接:在内连接的基础上。保留左侧不满足条件的数据
select t1.*,t2.*
from t_student t1 left outer join t_class t2
on t1.class_id = t2.id
-- 右连接:在内连接的基础上。保留右侧不满足条件的数据
-- 查询所有的班级信息。同时查询相关的学生信息
select t2.*,t1.*
from t_student t1 right outer join t_class t2
on t1.class_id = t2.id
-- 全连接:在内连接的基础上保留左右两侧不满足条件的数据
select t1.*,t2.*
from t_student t1 full join t_class t2
on t1.class_id = t2.id
-- union union all 合并结果集
select t1.*,t2.*
from t_student t1 left outer join t_class t2
on t1.class_id = t2.id
union -- 合并结果集。会去掉重复的记录 和 全连接差不多
select t1.*,t2.*
from t_student t1 right outer join t_class t2
on t1.class_id = t2.id
select t1.*,t2.*
from t_student t1 left outer join t_class t2
on t1.class_id = t2.id
union all -- 合并结果集。不会去掉重复的记录
select t1.*,t2.*
from t_student t1 right outer join t_class t2
on t1.class_id = t2.id