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)

    • 备份数据库中的一个或多个文件或文件组。
    • 适用于大型数据库,可以逐个文件或文件组进行备份和恢复,节省时间和空间。
相关推荐
番茄电脑全能王11 分钟前
《鸣潮》运行时提示找不到emp.dll是什么原因?缺失emp.dll文件要怎么解决?
网络·数据库·经验分享·游戏·电脑
憶巷27 分钟前
MyBatis中动态SQL执行原理
java·sql·mybatis
一只淡水鱼661 小时前
【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis
java·数据库·spring·mybatis
张声录11 小时前
【ETCD】【实操篇(十六)】基于角色的访问控制:ETCD 安全管理指南
数据库·安全·etcd
warrah1 小时前
redis——岁月云实战
数据库·redis·缓存
秀儿y1 小时前
Redis-十大数据类型
数据库·redis·缓存·oracle
凡人的AI工具箱2 小时前
每天40分玩转Django:Django类视图
数据库·人工智能·后端·python·django·sqlite
知识的宝藏2 小时前
Django models中的增删改查与MySQL SQL的对应关系
sql·mysql·django·django models
路在脚下@2 小时前
MySQL的索引失效的原因有那些
数据库·mysql
凡人的AI工具箱2 小时前
每天40分玩转Django:实操图片分享社区
数据库·人工智能·后端·python·django