SQL知识点合集3

一、创建视图

create view 视图名 as select * from 表名 where 条件

二、触发器

触发器是与表有关的数据库对象,在insert/update/delete 之前或之后触发并执行触发器中定义的 SQL语句,

有三种触发器类型。

  • 1.insert触发器
  • 2.update触发器
  • 3.delete触发器

三、主键约束和外键约束

假设有两个表:StudentsEnrollments。我们希望在Enrollments表中添加一个外键约束,使其StudentID列引用Students表中的StudentID列。

外键约束:

创建示例表

首先,创建这两个示例表:

sql 复制代码
CREATE TABLE Students (
    StudentID INT NOT NULL,
    Name VARCHAR(50),
    Age INT,
    PRIMARY KEY (StudentID)
);

CREATE TABLE Enrollments (
    EnrollmentID INT NOT NULL,
    StudentID INT,
    CourseID INT,
    PRIMARY KEY (EnrollmentID)
);

添加外键约束

现在,我们在Enrollments表中添加一个外键约束,使其StudentID列引用Students表中的StudentID列:

sql 复制代码
ALTER TABLE Enrollments
ADD CONSTRAINT fk_student
FOREIGN KEY (StudentID) REFERENCES Students(StudentID);

主键约束:

假设我们有以下初始表结构:

sql 复制代码
CREATE TABLE Students (
    StudentID INT NOT NULL,
    Name VARCHAR(50),
    Age INT
);

CREATE TABLE Enrollments (
    EnrollmentID INT NOT NULL,
    StudentID INT,
    CourseID INT
);

我们希望将StudentID设置为Students表的主键,并将EnrollmentID设置为Enrollments表的主键。

sql 复制代码
-- 添加主键约束到 Students 表
ALTER TABLE Students
ADD PRIMARY KEY (StudentID);

-- 添加主键约束到 Enrollments 表
ALTER TABLE Enrollments
ADD PRIMARY KEY (EnrollmentID);

注意事项

  • 列不能为空 :主键列必须设置为NOT NULL,因为主键列不允许NULL值。
  • 唯一性:主键列的值必须唯一,以确保每一行记录有唯一标识。

四、删除表

  1. drop是完全删除表,包括表结构

  2. delete是删除表数据,保留表的结构,而且可以加where,只删除一行或者多行

  3. truncate 只能删除表数据,会保留表结构,而且不能加where

五、count()函数

使用count(*)对表中行的数目进行计数,不管表列中包含的是空值(null)还是非空值;

使用count(column)对特定列中具有值得行进行计数,忽略null值。

六、索引

1.可通过索引快速查找数据,减少查询执行时间。

2.数据库索引采用B+树是因为B+树在提高了磁盘IO性能的同时解决了元素遍历效率低下的问题

3.如果WHERE子句中使用的索引包含了ORDER BY中的列,因为索引本身会对列进行排序,所以ORDER BY中不需要再次使用索引排序;如果WHERE子句中使用的索引没有包含ORDER BY中的列,则ORDER BY中的列无法使用索引,因为一个查询只能选择一个索引,这时候排序就进行了filesort,非常费时。综上所述,当WHERE中使用了索引,ORDER BY中不会使用索引。

4.索引会提高查询速度 但不会提高更新表的速度。

七、NULL

sql 复制代码
CREATE TABLE students (
    id INT,
    name VARCHAR(50)
);

INSERT INTO students (id, name) VALUES
(1, '张三'),
(2, '李四'),
(3, '王五'),
(4, NULL),
(5, '赵六');

使用<>运算符来选择所有不等于某个特定值的行。例如,以下查询将选择所有name列的值不等于'张三'的行:

sql 复制代码
SELECT * FROM students
WHERE name <> '张三';

选择所有name列的值不等于'张三'或name列值为空(NULL)的行:

sql 复制代码
SELECT * FROM students
WHERE name <> '张三' OR name IS NULL;

八、数据库

MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

比较流行的数据库模型有三种,分别为层次式数据库、网状数据库和关系型数据库。而在当今的互联网中,最常见的数据库模型主要是两种,即SQL关系型数据库和NoSQL非关系型数据库。

关系型数据库的代表包括Oracle, Sql Server, Mysql

层次型数据库管理系统是紧随网状数据库而出现的。现实世界中很多事物是按层次组织起来的。层次数据模型的提出,首先是为了模拟这种按层次组织起来的事物。

最著名最典型的层次数据库系统是IBM公司的IMS(Information Management System)

九、数据库授权命令grant...to

GRANT<权限> on 表名(或列名) to 用户

十、count(distinct ...)

count(distinct ...) 是 SQL 中用于计算某列中不重复值的数量的函数。它会返回指定列中所有不同值的个数。例如,如果某列中有重复的值,这些值只会被计数一次。

示例:Mysql中表student_table(id,name,birth,sex),id字段值可能重复,分别查询男生、女生的不重复id总数。

sql 复制代码
select
count(distinct case when sex='男' then id else null end) as man_ids,
count(distinct case when sex='女' then id else null end) as women_ids
from student_table;

case when sex='男' then id else null end 会在 sex'男' 时返回 id,否则返回 null,然后 count(distinct ...) 会计算这些返回值中的不重复 id 的数量。同样地,case when sex='女' then id else null end 会在 sex'女' 时返回 id,然后 count(distinct ...) 计算不重复 id 的数量。

十一、STUFF 函数

STUFF 函数在 SQL 中用于删除指定长度的字符并将新的子字符串插入到指定位置。

sql 复制代码
STUFF(string, start, length, new_string)
  • string 是原始字符串。
  • start 是开始位置(从 1 开始)。
  • length 是要删除的字符数。
  • new_string 是要插入的字符串。

示例:select stuff('lo ina', 3, 1, 've ch')

  • string'lo ina'
  • start3,表示从第三个字符开始。
  • length1,表示删除一个字符。
  • new_string've ch',表示插入的新字符串。

执行操作如下:

  1. 从第三个字符(即 o)开始删除 1 个字符:'lo ina' 变为 'loina'
  2. 在第三个字符位置插入 've ch':结果为 'love china'

十二、ORDER BY

order by默认使用升序排序,即asc。

十三、delete、truncate

1:处理效率:drop>trustcate>delete

2:删除范围:drop删除整个表(结构和数据一起删除);trustcate删除全部记录,但不删除表结构,这意味着表的定义、索引等都会被保留;delete只删除数据

3:高水位线:delete不影响自增ID值,高水线保持原位置不动,高水位标记是表的物理存储特性,自增 ID 通常不会因为删除操作而复用被删除的 ID;trustcate会将高水线复位,自增ID变为1。

因为 TRUNCATE 是一个 DDL(数据定义语言)操作,它通过重新初始化表而不是逐行删除数据来清空表,这使得它比 DELETE(逐行删除)更高效。

十四、SUN 和 COUNT

SUM 用于计算一列数值的总和。它只能用于数值列,计算该列中所有数值的总和。

COUNT 用于计算行的数量。COUNT(column_name) 也会忽略 NULL 值,而 COUNT(*) 会包括所有行,不论列是否为 NULL

十五、常见的 JOIN 类型

  • INNER JOIN:只返回两个表中满足连接条件的行。
  • LEFT JOIN(或 LEFT OUTER JOIN) :返回左表中的所有行,即使右表中没有匹配的行,也会返回这些行,并用 NULL 填充右表中的列。
  • RIGHT JOIN(或 RIGHT OUTER JOIN) :返回右表中的所有行,即使左表中没有匹配的行,也会返回这些行,并用 NULL 填充左表中的列。
  • FULL JOIN(或 FULL OUTER JOIN) :返回两个表中的所有行,当没有匹配时,用 NULL 填充缺失的部分。

INNER JOIN 示例

sql 复制代码
SELECT students.name, courses.course_name
FROM students
INNER JOIN courses ON students.student_id = courses.student_id;

LEFT JOIN 示例

sql 复制代码
SELECT students.name, courses.course_name
FROM students
LEFT JOIN courses ON students.student_id = courses.student_id;
  • 左表是 FROM 之后的表,在 LEFT JOIN 之前。
  • 右表是 LEFT JOIN 之后的表。
  • 结果集包括左表的所有行,右表中没有匹配的行会显示 NULL

RIGHT JOIN 示例

sql 复制代码
SELECT students.name, courses.course_name
FROM students
RIGHT JOIN courses ON students.student_id = courses.student_id;
  • 左表是 FROM 之后的表,在 RIGHT JOIN 之前。
  • 右表是 RIGHT JOIN 之后的表。
  • 结果集包括右表的所有行,左表中没有匹配的行会显示 NULL

十六、 数据库备份类型

  • 完整数据库备份 (Full Backup)

    • 备份整个数据库,包括所有的数据和对象。
    • 它是一个数据库的完整副本,可以用来恢复数据库到备份时的状态。
  • 差异数据库备份 (Differential Backup)

    • 仅备份自最近一次完整数据库备份以来发生改变的数据。
    • 每次差异备份都会包含从上次完整备份以来的所有变化。
    • 优点是比完整备份小且恢复速度快,但需要依赖最近一次完整备份。
  • 事务日志备份 (Transaction Log Backup)

    • 备份自上次事务日志备份以来所有的事务日志记录。
    • 用于在灾难恢复时恢复到某个特定的时间点。
    • 可以在不进行完整备份的情况下连续进行。
  • 文件和文件组备份 (File and Filegroup Backup)

    • 备份数据库中的一个或多个文件或文件组。
    • 适用于大型数据库,可以逐个文件或文件组进行备份和恢复,节省时间和空间。
相关推荐
素玥12 小时前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian12 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
韶博雅13 小时前
emcc升级
oracle
瀚高PG实验室13 小时前
审计策略修改
网络·数据库·瀚高数据库
言慢行善13 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅13 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师13 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql
迷枫71214 小时前
达梦数据库的体系架构
数据库·oracle·架构
夜晚打字声14 小时前
9(九)Jmeter如何连接数据库
数据库·jmeter·oracle
Chasing__Dreams14 小时前
Mysql--基础知识点--95--为什么避免使用长事务
数据库·mysql