数据库基础知识笔记(速通速查版)

数据库基础知识

SQL分类

分类全程说明
DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)
DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改
DQLData Query Language数据查询语言,用来查询数据库中表的记录
DCLData Control Language数据控制语音,用来创建数据库用户,控制数据库的访问权限

常用数据类型

数值类型

数据类型说明
BIT(M)位类型。M指定位数,默认值1,范围1-64
TINYINT[UNSIGHED] 占1个字节带符号的范围是-128到127,无符号的范围0到255,默认是有符号
SMALLINT[UNSIGHED] 2个字节带符号的范围是-215到215-1,无符号的范围是0到216-1
MEDIUMINT[UNSIGNED] 3个字节带符号的范围是-223到223-1,无符号的范围是0到224-1
INT[UNSIGNED] 4个字节带符号的范围是-231到231-1,无符号的范围是0到232-1
BIGINT[UNSIGNED] 8个字节带符号的范围是-263到263-1,无符号的范围是0到264-1
FLOAT[UNSIGNED]占用空间4个字节
DOUBLE[UNSIGNED]表示比float精度更大的小数,占用空间8个字节
DECIMAL[M,D] [UNSIGNED]定点数M指定长度,D表示小数点的位数

文本、二进制类型

数据类型说明
CHAR(SIZE)固定长度字符串 最大255
VARCHAR(SIZE)可变长度字符串 0~65535【即:216-1】
BLOB LONGBLOB二进制数据 BLOB 0~216-1 LONGBLOB 0~232-1
TEXT LONGTEXT文本 Text 0~216 LONGTEXT 0~232

时间日期

数据类型说明
DATE/DATETIME/TimeStamp日期类型(YYYY-MM-DD)(YYYY-MM-DD HH:MM:SS)TimeStamp表示时间戳,他可用于自动记录insert、update的操作时间

DDL-数据库操作

查看、删除数据库

显示数据库语句

SHOW DATABASES

查看当前数据库

SELECT DATABASE();

显示数据库创建语句

SHOW CREATE DATABASE 数据库名

数据库删除语句

DROP DATABASE[IF EXISTS] 数据库名

DDL-表操作

创建表

CREATE TABLE 表名(
	字段1 字段1类型 [COMMENT 字段注释],
    字段2 字段2类型 [COMMENT 字段注释],
    字段3 字段3类型 [COMMENT 字段注释]
)[CHARACTER SET 字符集] [COLLATE 校对规则] [ENGINE 存储引擎] [COMMENT 表注释];

field:指定列名 datatype:指定列类型(字段类型)

CHARACTER SET:如不指定则为所在数据库类型字符集

COLLATE:如不指定则为所在数据库校对规则

ENGINE:存储引擎 默认INNODB

int类型的时候不强制确定长度

修改表字符集

alter table 表名 character set 字符集;

添加字段

ALTER TABLE 表名 ADD 字段名 数据类型 [COMMENT 注释] [约束];

当不指定位置时,新增字段默认为数据表的最后一个字段

ALTER TABLE 表名 ADD 字段1名 数据类型 AFTER 字段2;

表示将字段1新增到字段2的后面

ALTER TABLE 表名 ADD 字段名 数据类型 FIRST;

表示将字段新增到数据表的第一个字段

修改字段

ALTER TABLE 表名 CHANGE 原字段名 新字段名 新数据类型 [COMMENT 注释] [约束];

修改字段时,必须指定新字段的数据类型,即使新字段的数据类型与原数据类型相同

只需要修改字段的数据类型

ALTER TABLE 表名 MODIFY 字段名 新数据类型;

MODIFY和CHANGE都可以改变字段的数据类型。但CHANGE可以在改变字段数据类型的同时改变字段名

修改字段的排列位置

将字段1放到字段2的后面

ALTER TABLE 表名 MODIFY 字段1 数据类型 AFTER 字段2;

字段1和字段2必须是表中已经有的字段

将字段1设置为数据表的第一个字段

ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST;

删除字段

ALTER TABLE tablename

修改表名

Rename table 表名 RENAME [TO] 新表名;

修改表字符集

alter table 表名 character set 字符集;

插入数据

INSERT INTO 表名 [(字段列表)] VALUES 值列表;
  1. 插入的数据应于字段的数据类型相同
  2. 数据的长度应在列的规定范围内
  3. 在values中列出的数据位置必须与被加入的列的排列位置相对应
  4. 字符和日期型数据应包含在单引号中
  5. 列可以插入空值,前提是该字段允许为空
  6. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
  7. 默认值的使用,当不给某个字段值时,如果有默认值就会添加,否则报错

修改数据

UPDATE 表名 SET 字段名1=1,字段名2=2 [WHERE 条件表达式] ;

字段名n表示需要修改的字段名称,值n表示为待修改的字段提供的新数据;关键字WHERE 表示条件;条件表达式表示指定修改数据需满足的要求。当满足条件表达式的数据有多行时,所有满足该条件的数据都会被修改。

  1. UPDATE语法可以用新值更新原有表行中的各列
  2. SET子句指示要修改哪些列和要给予哪些值
  3. WHERE子句指定应更新哪些列,如没有WHERE子句,则更新所有的记录

删除数据

DELETE FROM 表名 [WHERE 条件表达式];
  1. 如果不使用WHERE语句,将删除表中所有数据
  2. DELETE语句不能删除某一列的值(可使用UPDATE设为 null 或者’')
  3. 使用DELETE语句仅删除记录,不删除表本身,如果删除表,使用drop table语句, DROP TABLE 表名;

查找数据

SELECT [ALL|DISTINCT] *|列名1,列名2,列名3,列名n FROM 表名 [WHERE 条件表达式] [GROUP BY 列名[ASC|DESC] [HAVING 条件表达式]] [ORDER BY 列名[ASC|DESC],....] [LIMIT [OFFSET] 记录数];  

SELECT子句:指定查询结果集返回的列,当使用"*"时,可以显示表中所有的列;关键字DISTINCT为可选参数,用于消除查询结果集中的重复记录

DROM子句:指定查询的数据源,可以是表或视图

WHERE子句:指定查询的筛选条件

GROUP BY子句:指定查询的分组列名;关键字HAVING为可选参数,用于指定分组后的筛选条件

OPDER BY子句:指定查询结果集的排序列名。排序方式由参数ASC或DESC控制,其中ASC表示按升序排列,DESC表示按降序排列,当不指定排序参数时,默认为升序

LIMIT子句:用于限制查询结果集的行数,参数OFFSET为偏移量,当OFFSET为0时(默认),表示查询结果从第1条记录开始返回,若OFFSET为1时,查询结果会从第2条记录开始返回,以此类推;记录数则表示查询结果集中包含的记录行数

使用别名

SELECT 原列名 AS 信列名 FROM 表名;

WHERE语句

常用的比较运算符

运算符含义运算符含义
=、<=>等于<>、!=不等于
>大于<小于
>=大于等于<=小于等于

其中“=”和“<=>”运算符的区别是,“<=>”运算符可与NULL比较

常用的逻辑运算符

运算符说明
AND或&&逻辑与,双目运算符,操作数全为真,结果为1,否则为0;当一个操作数为NULL时,NULL AND 1结果为1,NULL AND 0结果为0
OR或`
NOT或逻辑非,单目运算符,操作数为0,结果为1,操作数为1,结果为0;当操作数为NULL时,结果为NULL
XOR逻辑异或,双目运算符,操作数逻辑相反,结果为1;操作逻辑相同,结果为0;当一个操作数为NULL时,NULL XOR 1和NULL XOR 0的值都是NULL

使用BETWEEN…AND运算符

WHERE 表达式 [NOT] BETWEEN 初始值 AND 终止值

限制查询数据的范围

使用IN运算符

WHERE 表达式 [NOT] IN (1,2,3,...值n)

限制查询数据的范围

使用LIKE运算符

WHERE 表达式 [NOT] LIKE '字符串常量' [ESCAPE '转移字符']

实现字符串的模糊查询

与LIKE运算符同时使用的字符称为通配符,ESCAPE关键字用于指定转义字符,默认转义字符为“/”

通配符说明示例
%任意字符串s%:表示查询s开头的任意字符串
%s:表示查询以s结尾的任意字符串
%s%:表示查询包含s的任意字符串
_任何单个字符_s:表示查询以s结尾且长度为2的字符串
s_:标示查询以s开头且长度为2的字符串

使用REGEXP运算符

WHERE 列名 REGEXP '模式串'

进行正则表达式匹配

查看表结构

使用DESCRIBE语句来查看表结构

DESCRIBE 表名;

DESCRIBE 可以缩写成 DESC

使用SHOW COLUMNS FROM语句查看表结构

SHOW [FULL] COLUMNS FROM 表名;

若使用FULL关键字,则除显示基本结构以外,还会显示权限和注释字段;当不使用FULL关键字时,结果显示与DESCRIBE语句查看表的结果相同

使用SHOW CREATE TABLE语句查看表结构

SHOW CREATE TABLE 表名;

复制数据表

复制表结构及数据到新表

CREATE TABLE 新表名 SELECT * FROM 源表名;

新表名表示复制的目标表名称,新表名不能同数据库中已有的表名相同,源表名则为待复制数据表名称,SELECT * FROM 则表示查询符合条件的数据

CREATE TABLE 新表名 SELECT 源表中的字段 FROM 源表名;

将源表中某字段复制到新表中,复制多个字段的时候,字段之间用, 分隔开

只复制表结构到新表

CREATE TABLE 新表名 SELECT * FROM 源表名 WHERE FALSE;

新表名表示复制的目标表名称,新表名不能同数据库中已有的表名相同,源表名则为待复制数据表名称,SELECT * FROM 则表示查询符合条件的数据

CREATE TABLE 新表名 LIKE 源表名;

使用LIKE 关键字复制表结构时会将源表的约束一起复制到新表中

当源表和新表属于不同的数据库时,需要在源表名前面加上数据库名,格式为“数据库名.源表名”

备份恢复数据库

备份数据库(注意:在DOS执行)

mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sql

恢复数据库(进入MySQL命令行再执行)

Source 文件名.sql

删除数据表

DROP TABLE 表名;

若想同时删除多张数据表,只需要在DROP TABLE 语句中列出多个表名,表名之间用半角逗号分割

在删除数据表时,需要确保该数据表中的字段未被其他数据表关联。若有关联,则需要先删除关联表。否则删除数据表的操作将会失效

TRUNCATE TABLE 表名;

删除表中的所有数据

DCL-用户管理

查询用户

USE mysql;
SELECT * FROM `user`;

创建用户

CREATE USER '用户名' @'主机名' IDENTIFIED BY '密码';

如果将主机名换成%就可以做到在任意主机登录

修改用户密码

ALTER USER'用户名'@'主机名'IDENTIFIED WITH mysql_native_password BY'新密码;

删除用户

DROP USER'用户名'@'主机名';

DCL-权限控制

数据库常用权限

权限说明
ALL,ALL PRIVILEGES所有权限
SELECT查询数据
INSERT插入数据
UPSATE修改数据
DELETE删除数据
ALTER修改表
DROP删除数据库/表/视图
CREATE创建数据库

查询权限

SHOW GRANTS FOR'用户名'@'主机名';

授予权限

GRANT 权限列表 ON 数据库.表名 TO '用户名'@'主机名';

撤销权限

REVOKE 限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

函数

函数是指一段可以直接被另一段程序调用的程序或代码。

聚合函数

合计函数count

SELECT COUNT(*)|COUNT(列名) FROM 表名 [WHERE 条件表达式];

返回行的总数

COUNT(*)返回满足条件的记录的行数

COUNT(列数)统计满足条件的某列有多少个,但是会排除NULL

合计函数SUM

SELECT SUM(列名) FROM 表名 [WHERE 条件表达式];

返回满足WHERE条件的行的和

sum仅对数值有作用

合计函数AVG

SELECT AVG(列名) FROM 表名 [WHERE 条件表达式]

返回满足WHERE条件的一列的平均值

合计函数MAX/MIN

SELECT MAX(列名) FROM 表名 [WHERE 条件表达式];

MAX/MIN函数返回满足WHERE条件的一列的最大值/最小值

字符串函数

常用的字符串函数

函数功能
CONCAT(S1,S2,S3…Sn)字符串拼接,将s1,s2,s3…sn拼接成一个字符串
LOWER(STR)将字符串str全部转为小写
UPPER(STR)将字符串str全部转为大写
LPAD(str,n,pad)左填充,用字符串pad对st的左边进行填充,达到n个字符串长度
RPAD(str,n,pad)右填充,用字符串pad对st的右边进行填充,达到n个字符串长度
TRIM(StD)去掉字符串头部和尾部的空格
SUBSTRING(str,start,len)返回从字符串str从start位置起的len个长度的字符串

数值函数

常用的数值函数

函数功能
CEIL(x)向上取整
FLOOR(x)向下取整
MOD(xy)返回x/y的模
RAND()返回0~1内的随机数
ROUND(x,y)求参数x的四舍五入的值,保留y位小数

日期函数

函数功能
CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
YEAR(date)获取指定date的年份
MONTH(date)获取指定date的月份
DAY(date)获取指定date的日期
DATE_ADD(date,INTERVAL expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1,date2)返回起始时间date1和结束时间date2之间的天数

流程函数

常用的流程控制函数

函数功能
IF(value,t,f)如果value为true,则返回t,否则返回f
IFNULL(value1,value2)如果value1不为空,返回value1,否则返回value2
CASE WHEN val1 THEN [res1]…ELSE default END如果vall为true,返回resl,否则返回default默认值
CASE expr WHEN vall THEN [res1]…ELSE default END如果expr的值等于vall,返回resl,.否则返回default默认值

约束

概述

概念: 约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的: 保证数据库中数据的正确、有效性和完整性。

分类:

约束描述关键字
非空约束限制该字段的数据不能为nulNOT NULL
唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
检查约束(8.0.16版本之后)保证字段值满足某一个条件CHECK
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

外键约束

外键 :用来让两张表的数据之间建立联系,从而保证数据的一致性和完整性

语法

添加外键

CREATE TABLE 表名(
	字段名 数据类型,
	...
    [CONSTRAINT][外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名)
)
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(住表列名);

删除外键

alter table 表明 drop foreign key 外键名称;

外键约束

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致)
RETRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致)
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除更新外键在子表中的记录。
SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null).
SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值(Innodb:不支持)
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段) REFERENCES 主表名(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE:

多表查询

多表关系

项目开发中,在进行数据库结构设计时,会根据业务需求及业务模块之间的关系。分析并设计表结构,由于业务之间相互关联,所以各个表架构之间也存在各种联系,基本分为以下三种:

  • 一对多(多对一)
  • 多对多
  • 一对一

一对多

  • 案例:部门 与 员工的关系
  • 关系: 一个部门对应多个员工,一个员工对应一个部门
  • 实现: 在多个的一方建立外键,指向一的一方的主键

多对多

  • 案例: 学生 与 课程的关系
  • 关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择
  • 实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

一对一

  • 案例: 用户 与 用户详情的关系
  • 关系: 一对一的关系,多用于单表的拆分,将一张表的基础字段放到一张表中,其他详情字段放在另一张表中,以提升操作效率
  • 实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的

多表查询分类

连接查询

  • 内连接:相当于查询A,B交集部分数据
  • 外连接:
    • 左外连接:查询左表所有数据,以及两张表交集部分数据
    • 右外连接:查询右表所有数据,以及两张表交集部分数据
  • 自连接:当前表与自身的连接查询,自连接必须使用表别名

子查询

内连接

内连接查询的是两张表交集的部分数据

内连接的语法分为两种:隐式内连接,显式内连接

隐式内连接

SELECT 字段列表 FROM1,2 WHERE 条件; 

显式内连接

SELECT 字段列表 FROM1 [INNER] JOIN2 ON 连接条件;

外连接

外连接分为左外连接和右外连接

左外连接

SELECT 字段列表 FROM1 LEFT [OUTER] JOIN2 ON 条件;

相当于查询表1(左表)的所有数据包含表1和表2交集部分的数据

右外连接

SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 ON 条件;

相当于查询表2(右表)的所有数据包含表1和表2交集部分的数据

自连接

自连接查询语法:

SELECT 字段列表 FROM 表A 别名A  JOIN 表A 别名B ON 条件;

自连接查询,可以是内连接查询,也可以是外连接查询。

联合查询-union,union all

对于uion查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。

SELECT 字段列表 FROM 表A 
UNION [ALL]
SELECT 字段列表 FROM 表B...;
  • 对于联合查询的多张表的列数必须保持一致,字段类型也需要一致
  • union all会将全部的数据直接合并在一起,union会对合并之后的数据去重

子查询

概述

概念

SQL语句中嵌套SELECT语句,成为嵌套查询,又称为子查询

SELECT * FROM t1 WHERE column1 =(SELECT column1 FROM t2);

子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT中的任何一个

分类

  • 根据子查询结果不同,分为:

    • 标量子查询(子查询结果为单个值)
    • 列子查询(子查询结果为一列
    • 行子查询(子查询结果为一行)
    • 表子查询(子查询结果为多行多列
  • 根据子查询位置,分为:WHERE之后、FROM之后、SELECT之后。

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询。

常用的运算符:= <> >= > < <=

列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。

常用的操作符:IN、NOT IN、ANY、SOME、ALL

操作符描述
IN在指定的集合范围之内,多选一
NOT IN不在指定的集合之内
ANY子查询返回列表中,有任意一个满足即可
SOME与ANY等同,使用SOME的地方都可以满足使用ANY
ALL子查询返回列表中的所有值必须满足
行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。

常用的操作符:=、<>、IN、NOT IN

表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询。

常用的操作符:IN

事务

事务简介

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

事务操作

控制事务一
查看/设置事物提交方式
SELECT @@autocommit;
SET @@autocommit=0;

如果@@autocommit的参数是1则为自动提交

如果@@autocommit的参数是0则为手动提交

提交事务
COMMIT;
回滚事务
ROLLBACK;

注意:上述的这种方式,我们只是修改了事务的自动提交方式,把默认的自动提交修改为了手动提交,此时我们必须执行的DML语言都不会提交,需要手动的执行COMMIT进行提交

如果事务执行后出现异常应当直接回滚事务,来保证数据的安全性

控制事务二
开启事务
START TRANSACTION;

或者

BEGIN;
提交事务
COMMIT;
回滚事务
ROLLBACK;·

事务四大特征

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

并发事务问题

问题描述
脏读一个事务读到另外一个事务还没有提交的数据。
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 幻影”。

事务隔离级别

隔离级别脏读不可重复读幻读
Read uncommitted不可解决不可解决不可解决
Read committed可解决不可解决不可解决
Repeatable Read(默认)可解决可解决不可解决
Serializable可解决可解决可解决
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [SESSION|GLOBAL]TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE}

注意:事务隔离级别越高,数据越安全,但是性能越低
|
| ---------- | ------------------------------------------------------------ |
| 脏读 | 一个事务读到另外一个事务还没有提交的数据。 |
| 不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。 |
| 幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 幻影”。 |

事务隔离级别

隔离级别脏读不可重复读幻读
Read uncommitted不可解决不可解决不可解决
Read committed可解决不可解决不可解决
Repeatable Read(默认)可解决可解决不可解决
Serializable可解决可解决可解决
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [SESSION|GLOBAL]TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE}

注意:事务隔离级别越高,数据越安全,但是性能越低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

都不会的鲨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值