一、创建视图
create view 视图名 as select * from 表名 where 条件
二、触发器
触发器是与表有关的数据库对象,在insert/update/delete 之前或之后触发并执行触发器中定义的 SQL语句,
有三种触发器类型。
- 1.insert触发器
- 2.update触发器
- 3.delete触发器
三、主键约束和外键约束
假设有两个表:Students
和Enrollments
。我们希望在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值。 - 唯一性:主键列的值必须唯一,以确保每一行记录有唯一标识。
四、删除表
-
drop是完全删除表,包括表结构
-
delete是删除表数据,保留表的结构,而且可以加where,只删除一行或者多行
-
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'
。start
是3
,表示从第三个字符开始。length
是1
,表示删除一个字符。new_string
是've ch'
,表示插入的新字符串。
执行操作如下:
- 从第三个字符(即
o
)开始删除 1 个字符:'lo ina'
变为'loina'
。 - 在第三个字符位置插入
'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):
- 备份数据库中的一个或多个文件或文件组。
- 适用于大型数据库,可以逐个文件或文件组进行备份和恢复,节省时间和空间。