小白学MySQL数据库必须了解的基础知识(全)

最近由于有其他任务所以一直没有更新MySQL数据库的基础知识的后续文章
小白学MySQL数据库必须了解的基础知识(全)
这几天我对MySQL数据库的基础知识进行了一个大概的整合,我总共将其分为了七个章节,其中包括了已经发布的《小白学MySQL数据库必须了解的基础知识(一)》与《小白学MySQL数据库必须了解的基础知识(二)》里面的知识点,而且在某些方面比已经发布的这两篇文章更加全面。以供大佬们御览:

MySQL数据库入门

第一讲 数据库入门

数据库概述

  • 数据库(Database, DB)是按照数据结构来组织、存储和管理数据的仓库,其本身可以看作电子化的文件柜,用户可以对文件中的数据进行增加、删除、修改、查找等操作。
  • 数据库系统由数据库、数据库管理系统、数据库应用程序等组成。
    小白学MySQL数据库必须了解的基础知识(全)
    小白学MySQL数据库必须了解的基础知识(全)

数据库存储结构

  • 数据库是存储和管理数据的仓库,但数据库并不能直接存储数据,数据是存储在表中的。
  • 在存储数据的过程中一定会用到数据库服务器,所谓的数据库服务器就是指在计算机上安装一个数据库管理程序。

SQL语言概述

什么是SQL数据库?

  • SQL语言是一种数据库查询和程序设计语言,它是一种关系型数据库语言,主要用于管理数据库中的数据,如存储数据、查询数据、更新数据等。
  • 关系型数据库语言由4部分组成
    • 数据定义语言(DDL)
    • 数据操作语言(DML)
    • 数据查询语言(DQL)
    • 数据控制语言(DCL)

MySQL的相关命令

小白学MySQL数据库必须了解的基础知识(全)

第二讲 数据库和表的基本操作

创建和查看数据库

  • 如何创建数据库

    • 创建数据库itcast语句:CREATE DATABASE itcast;

    • 执行结果:

      mysql>CREATE DATABASE itcast;
      Query OK,1 row affected(0.08 sec)

    • 查询新建数据库:SHOW DATABASES;

  • 如何查看数据库信息

    • 查看数据库信息的语法:SHOW CREATE DATABASE 数据库名称;

修改和删除数据库

  • 如何修改数据库

    • MySQL数据库一旦安装成功,创建的编码也就确定了。

    • 如果想修改数据库的编码,可以使用ALTER DATABASE语句实现:

      ALTER DATABASE 数据库名称 DEFAULT CHARACTER SET 编码方式 COLLATE 编码方式_bin

  • 如何删除数据库

    • 删除数据库是将数据库系统中已经存在的数据库删除。

    • 删除数据库的基本语法:DROP DATABASE 数据库名称;

      "DROP DATABASE"是删除数据库的SQL语句。"数据库名称"是要删除的数据库名称。

    • 删除数据库后,数据库中的所有数据都将被清除,原来分配的空间也将被收回!

整数类型

  • 根据取值范围的不同,数据库整数类型可分为5种,分别是:
    • tinyint
      • 占用字节:1
      • 始:-128
      • 终:127
    • smallint
      • 占用字节:2
      • 始:-32768
      • 终:32767
    • mediumint
      • 占用字节:3
      • 始:-8388608
      • 终:8388607
    • int
      • 占用字节:4
      • 始:-2147483648
      • 终:2147483647bigint
    • 占用字节:8
      • 始:-9223372036854775808
      • 终:9223372036854775807

浮点数类型和定点数类型

  • 在MySQL数据库中,存储的小数都是用浮点数与定点数表示的。
  • 浮点数的类型有两种:FLOAT(单精度浮点数类型)、DOUBLE(双精度浮点数类型)
  • 定点数的类型只有一个,即DECIMAL类型

日期与时间类型

  • MySQL为了存储日期和时间,提供了五种表示日期和时间的数据类型,分别是:
    • YEAR
    • DATE
    • TIME
    • DATETIME
    • TIMESTAMP

字符串和二进制类型

  • MySQL提供字符串和二进制类型来存储字符串、图片以及声音等数据。分别是:
    • CHAR和VARCHAR类型
    • BINARY和VARBINARY类型
    • TEXT类型
    • BLOB类型
    • ENUM类型
    • SET类型与BIT类型

创建数据表

  • 创建数据表语法如下:

    CREATE TABLE表名
    (
    字段名1,数据类型[完整性约束条件],
    字段名2,数据类型[院整性约束条件],

    字段名n数据类型院整性约束条件],
    )

  • 在操作数据表之前,应该使用"USE 数据库名"指定使用的数据库,否则会抛出"No database selected"错误。

查看数据表

  • SHOW CREATE TABLE语句可以查看创建表时的定义语句和表的字符编码。

    SHOW CREATE TABLE 表名;

  • DESCRIBE语句可以查看表的字段信息,包括字段名、字段类型等信息。

    DESCRIBE 表名;

修改数据表

我们如果要修改数据表,那我们应该用哪些形式来修改呢?一共有六种修改方式:修改表名、修改字段名、修改字段的排列位置、修改字段的数据类型、删除字段、添加字段。接下来我们就来详细看看:

  • 修改表名

    • 在数据库中,不同的数据表是通过表名来区分的,所以我们可以通过修改表名来达到修改数据表的效果。

    • 语法格式:ALTER TABLE 旧表名 RENAME [TO] 新表名;

      其中,TO是可选的

  • 修改字段名

    • 数据表中的字段是通过字段名来区分的。

    • 语法格式:ALTER TABLE 修改前的字段名 修改后的字段名 新数据类型;

      其中,新数据类型不能为空

  • 修改字段的数据类型

    • 语法格式:ALTER TABLE 修改字段所在的表的名称 MODIFY 要修改的字段名 修改后字段的数据类型;
  • 添加字段

    • 语法格式:

      ALTER TABLE 表名 ADD 新字段名 数据类型
      [约束条件][FIRST AFTER 已存在字段名]

      其中,"FIRST"是可选参数,用于将新添加的字段设置为表的第一个字段。"AFTER"也是可选参数,用于将新添加的字段添加到指定的“已存在字段名”的后面。

  • 删除字段

    • 语法格式:ALTER TABLE 表名 DROP 字段名;
  • 修改字段的排列位置

    • 语法格式:ALTER TABLE 表名 MODIFY 字段名a 数据类型 FIRST|AFTER 字段名b

      其中,“字段名a”指的是修改位置的字段,“字段名b”是将字段a插入到字段b的后面。"FIRST"是可选参数,指将字段a修改为表的第一个字段

删除数据表

  • 语法格式:DROP TABLE 表名;
  • 创建数据表时,表和表之间可能会存在关联,要删除这些被其它关联的表比较复杂,这里的删除数据表只是删除没有关联的数据表。

表的约束

  • 为了防止数据表中查入一些错误数据,在MySQL中定义了一些维护数据库完整性的规则,这些规则就是表的约束。下面列举的约束条件均是针对表中字段进行的限制,以此来保证表中数据的正确性与唯一性。
  • 约束条件
    • PRLMARY KEY:主键约束,用于唯一标识对应的记录
    • FOREIGN KEY:外键约束
    • NOT NULL:非空约束
    • UNIQUE:唯一性约束
    • DEFAULT:默认值约束,用于设置字段的默认值
  • 主键约束
    • 通过主键可以快速查找表中的某条信息,它可以标识表中的记录。每个数据表中最多有一个主键约束,定义为PRIMARY KEY的字段不能有重复值且不能为NULL值。
    • 单字段主键
      • 单字段主键指由一个字段构成的主键。
      • 语法格式:字段名 数据类型 PRIMARY KEY
    • 多字段主键
      • 多字段主键指由多个字段组合而成的主键。
      • 语法格式:PRIMARY KEY(字段名1,…)
  • 非空约束
    • 非空约束指字段值不能为NULL。
    • 语法格式:字段名 数据类型 NOT NULL;
  • 唯一约束
    • 唯一约束用于保证数据表中字段的唯一性,即表中字段不可以重复出现。
    • 语法格式:字段名 数据类型 UNIQUE;
  • 默认约束
    • 默认约束用于给表中字段指定默认值,即当在表中插入一条新记录时,如果没有给这个字段赋值,则数据库系统会自动为这个字段插入默认值。
    • 语法格式:字段名 数据类型 DEFAULT 默认值;
  • 设置表的字段值自动增加
    • 在数据表中,若想为表中插入的新记录自动生成唯一的ID,可以用AUTO_INCREMENT约束进行实现。AUTO_INCREMENT约束的字段可以是任何整数类型,默认情况下,该字段的值是从1开始自动增加的。
    • 语法格式:字段名 数据类型 AUTO_INCREMENT;

索引

  • 索引的分类

    • 普通索引
      • 由KEY或INDEX定义的索引,它是MySQL中的基本索引类型,可以创建在任何数据类型中,其值是否唯一和非空由字段本身的约束条件所决定。
    • 唯一性索引
      • 由UNIQUE定义的索引,该索引所在字段的值必须是唯一的
    • 全文索引
      • 由FULLTEXT定义的索引,它只能创建在CHAR、VARCHAR或TEXT类型的字段上,而且,现在只有 MylSAM存储引擎支持全文索引。
    • 单例索引
      • 指在表中单个字段上创建索引,它可以是普通索引、唯一索引或者全文索引,只要保证该索引只对应表中一个字段即可
    • 多列索引
      • 指在表中多个字段上创建索引,只有在查询条件中使用了这些字段中的第一个字段时,该索引才会被使用
    • 空间索引
      • 由SPATIAL定义的索引,它只能创建在空间数据类型的字段上
  • 创建索引

    创建索引的方式一共有三种。

    • 创建表的时候创建索引

      • 语法格式:CREATE TABLE表名(字段名数据类型[完整性约束条件],字段名数据类型[完整性约束条件],. . . . . .​ 字段名数据类型​ [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY​ [别名] (字段名1 [(长度)]) [ASC|DESC])​ );

        UNIQUE:可选参数,表示唯一索引

        FULLTEXT:可选参数,表示全文索引

        SPATIAL:可选参数,表示空间索引

        INDEX和KEY:用来表示字段的索引,二者选一即可

        ASC和DESC:可选参数,ASC表示升序排列,DESC表示降序排列

        别名:可选参数,表示创建的索引的名称

        字段名1:指定索引对应字段的名称

        长度:可选参数,用于索引的长度

    • 使用CREATE INDEX语句在已经存在的表上创建索引

      • 语法格式如下:CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX索引名ON表名(字段名[(长度)] [ASC|DESC]);
    • 使用ALTER TABLE语句在已经存在表上创建索引

      • 语法格式如下:ALTER TABLE表名ADD [UNIQUE |FULLTEXT|SPATIAL] INDEX索引名(字段名[(长度)] [ASC|DESC])
  • 删除索引

    • 由于索引会占用一定的磁盘空间,因此为了避免影响数据库性能,应该删除不再使用的索引。
    • 使用ALTER TABLE删除索引
      • 语法格式:ALTER TABLE 表名 DROP INDEX 字段名
    • 使用DROP INDEX删除索引
      • 语法格式:DROP INDEX 索引名 ON 表名;

第三讲 添加、更新与删除数据

添加数据

  • 通常情况下,向数据表中添加的新记录应该包含表的所有字段,即为该表中的所有字段添加数据。
  • 为表中所有字段添加数据的INSERT语句有两种:
    • INSERT语句中指定所有字段名:
      • INSERT INTO 表名(字段名1,字段名2,…)VALUES(值1,值2,…)
    • INSERT语句中不指定字段名:
      • INSERT INTO 表名 VALUES(值1,值2,…);

更新数据

  • 更新数据是指对表中存在的记录进行修改,比如某个学生改了名字,就需要对其记录信息中的name字段值进行修改。
  • MySQL中使用UPDATE语句来更新表中的记录:UPDATE 表名​ SET 字段名1 = 值1[,字段名2 = 值2,…][WHERE条件表达式]
  • 更新表中的某一条或者某几条记录,需要使用WHERE子句来指定更新记录的条件。
  • 如果没有使用WHERE子句,则会将表中所有记录的指定字段都进行更新

删除数据

假如一个学生转学了,就需要在student表中将其信息记录删除。

  • MySQL中使用DELETE语句来删除表中的记录。语法格式:DELETE FROM 表名 [WHERE 条件表达式]
    • 根据指定条件删除表中的某一条或者几条记录,需要使用WHERE子句来指定删除记录的条件。
    • DELETE语句中如果没有使用WHERE子句,则会将表中的所有记录都删除。
  • 在MySQL数据库中,还有一种方式可以用来删表中所有的记录,这种方式需要用到一个关键字TRUNCATE。语法格式:TRUNCATE [TABLE] 表名
    • TRUNCATE的语法格式很简单,只需要通过"表名"指定要执行删除操作的表即可。

第四讲 单表查询

简单查询

  • MySQL从数据表中查询数据的基本语句是SELECT语句。SELECT [DISTINCT] *|{字段名1,字段名2,字段3名… }FROM表名[WHERE条件表达式1][GROUP BY字段名[HAVING条件表达式2]][ORDER BY字段名[ASC|DESC]][LIMIT [OFFSET]记录数]
  • 查询所有字段
    • 查询所有字段是指查询表中所有字段的数据,MySQL中有两种方式可以查询表中所有字段:
    • 指定所有字段
      • 列出所有字段名查询数据的语法格式:SELECT 字段名1,字段名2,…FROM 表名;
    • 使用星号("*")通配符代替所有字段
      • 使用星号("*")通配符查询数据的语法格式:SELECT * FROM 表名;
  • 查询指定字段
    • 查询指定字段是指在SELECT语句的字段列表中指定要查询的字段,这种方式只针对部分字段进行查询。
    • 语法格式:SELECT 字段名1,字段名2,…FROM 表名;

按条件查询

  • 数据库中包含大量的数据,当我们需要根据需求获取指定的数据,或者对查询的数据重新进行排列组合时,就要在SELECT语句中指定查询条件对查询结果进行过滤。

  • SELECT语句中最常见的是使用WHERE子句指定查询条件,带有WHERE子句的查询有八种:

    • 带关系运算符的查询

      • 作用:带关系运算符的查询—对数据进行过滤
      • 语法格式如下所示:SELECT 字段名1,字段名2,…FROM 表名WHERE 条件表达式
      • 关系运算符表示方法:
        • “=”:等于
        • “<>”:不等于
        • “!=”:不等于
        • “<”:小于
        • “<=”:小于等于
        • “>”:大于
        • “>=”:大于等于
    • 带IN关键字的查询

      • 作用:语法格式如下:

        SELECT *|字段名1,字段名2,…

        FROM 表名

        WHERE 字段名 [NOT] IN (元素1,元素2,…)

    • 带BETWEEN AND关键字的查询

      • 作用:判断某个字段的值是否在指定的范围之内

      • 语法格式如下:

        SELECT *|{字段名1,字段名2,…}

        FROM 表名

        WHERE 字段名 [NOT] BETWEEN 值1 AND 值2

    • 空值查询

      • 作用:判断某些列是否有NULL值

      • 语法格式如下:

        SELECT *|字段名1,字段名2,…

        FROM 表名

        WHERE 字段名IS [NOT] NULL

    • 带DISTINCT关键字的查询

      • 作用:去重复
      • 语法格式:SELECT DISTINCT 字段名 FROW 表名;
      • DISTINCT关键字作用于多个字段
        • 语法格式:SELECT DISINCT 字段名1,字段名2,… FROM 表名;
    • 带LIKE关键字的查询

      • 作用:判断两个字符串是否相匹配

      • 语法格式如下:

        SELECT *|{字段名1,字段名2,…}

        FROM 表名

        WHERE 字段名 [NOT] LIKE’匹配字符串’;

        • LIKE语法格式中的’匹配字符串’指定用来匹配的字符串,其值可以是一个普通字符串,也可以是包含百分号(%)和下划线(_)的通配字符。
        • 百分号和下划线统统称为通配符,它们在通配字符串中有特殊含义。
          • 百分号(%)通配符:可以匹配任意长度的字符串,包括空字符
          • 下划线(_)通配符:下划线通配符只匹配单个字符,如果要匹配多个字符,需要使用多个下划线通配符。
          • 注:使用百分号和下划线通配符进行查询操作:百分号和下划线是通配符,它们在通配字符串中有特殊含义,因此,如果要匹配字符串中的百分号和下划线,就需要在通配字符串中使用右斜线对百分号和下划线进行转义。
    • 带AND关键字的多条件查询

      • 作用:连接两个或者多个查询条件

      • 语法格式如下:

        SELECT *|{字段名1,字段名2,…}

        FROM 表名

        WHERE 条件表达式1 […AND条件表达式n];

    • 带OR关键字的多条件查询

      作用:记录满足任意一个条件即被查出

      语法格式如下:

      SELECT *|{字段名1,字段名2,…}

      FROM 表名

      WHERE 条件表达式1 OR […OR 条件表达式n];

    • OR和AND关键字一起使用的情况

      • AND的优先级高于OR,因此当两者一起使用时,应该先运算AND两边的条件表达式,再运算OR两边的条件表达式。

高级查询

  • 聚合函数

    • MySQL中提供了聚合函数来实现对某些数据进行统计
    • COUNT()函数
      • 作用:用来统计记录的条数
      • 语法格式为:SELECT COUNT(*) FROM 表名
    • SUM()函数
      • 作用:SUM()是求和函数,用于求出表中某个字段所有值的总和
      • 语法格式为:SELECT SUM(字段名) FROM 表名;
    • AVG()函数
      • 作用:用于求出某个字段所有值的平均值
      • 语法格式为:SELECT AVG(字段名) FROM student;
    • MAX()函数
      • 作用:MAX()函数是求最大值的函数,用于求出某个字段的最大值
      • 语法格式为:SELECT MAX(grade) FROM student;
    • MIN()函数
      • 作用:MIN()函数是求最小值的函数,用于求出某个字段的最小值
      • 语法格式为:SELECT MIN(grade) FROM student;
  • 使用ORDER BY 对查询结果进行排序

    • 语法格式如下:

      SELECT 字段名1,字段名2,…

      FROM 表名

      ORDER BY 字段名1 [ASC|DESC],字段名2[ASC|DESC]…

    • 要注意,在按照指定字段进行升序排列时,如果某条记录的字段值为NULL,则这条记录会在第一条显示,这是因为NULL值可以被认为是最小值

  • 使用GROUP BY对字段值进行分组查询

    • 语法格式如下:

      SELECT 字段名1,字段名2,…

      FROM 表名

      GROUP BY 字段名1,字段名2,…[HAVING条件表达式];

    • 分组查询的三种使用情况

      • 单独使用GROUP BY
        • 单独使用group by关键字,查询的是每个分组中的一条记录。
      • GROUP BY和聚合函数一起使用
        • GROUP BY和聚合函数一起使用可以统计出某个或者某些字段在一个分组中的最大值、最小值、平均值等等。
      • GROUP BY和HAVINC一起使用
        • HAVING和WHERE都用于设置条件对查询结果进行过滤。两者区别在于HAVING后可以跟聚合函数,而WHERE不能。
  • 使用LIMIT限制查询结果的数量

    语法格式如下:

    SELECT 字段名1,字段名2,…

    FROM 表名

    LIMIT [OFFSET, ]记录数

    其中,LIMIT:后面可以跟2个参数,“OFFSET”:可选值,表示偏移量,如果偏移量为0则从查询结果的第一条记录开始…以此类推,如果不指定其默认值为0

    “记录数”:表示返回查询记录的条数。

  • MySQL中的函数

    • MySQL中提供了丰富的函数,通过这些函数可以简化用户对数据的操作。
    • MySQL中的函数
      • 数学函数
        • ABS(x):返回x的绝对值。
        • SQRT(x):返回x的非负2次方根。
        • MOD(xJy):返回x被y除后的余数。
        • CEILING(x):返回不小于x的最小整数。
        • FLOOR(x):返回不大于x的最大整数。
        • ROUND(x,y):对x进行四舍五入操作,小数点后保留y位。
        • TRUNCATE(x):舍去x中小数点y位后面的的数。
        • SIGN(x):返回z的符号,-1、0或者10 .
      • 字符串函数
        • LENGTH(str):返回字符串str的长度。
        • CONCA(s1,s2,…):返回-一个或者多个字符串连接产生的新的字符串。
        • TRIM(str):删除字符串两侧的空格。
        • REPLACE(str,s1,s2):使用字符串s2替换字符串str中所有的字符串s1p
        • SUBSTRING(t,n.len):返回字符串st的子串,起始位置为n,长度为len
        • REVERSE(str):返回字符串反转后的结果。
        • LOCATE(s1,str):返回子串s1在字符串str中的起始位置。
      • 日期和时间函数
        • CURDATE():获取系统当前日期。
        • CURTIME():获取系统当前时间。
        • SYSDATE():获取当前系统日期和时间。
        • TIME_ TO_ SEC():返回将时间转换成秒的结果。
        • ADDDATE():执行日期的加运算。
        • SBUDATE():执行日期的减运算。
        • DATE_ FORMAT():格式化输出日期和时间值。
      • 条件判断函数
        • IF(expr,v1,v2):如果expr表达式为true返回v1,否则返回v2p
        • IFNULL(v1,v2):如果v1不为NULL返回v1,否则返回v2p
        • CASE expr WHEN v1 THEN r1 [WHEN v2 THEN .r2… [ELSE m] END:如果expr值等于v1、v2等,则返回对应位置THEN后面的结果,否则返回ELSE后的结果me
      • 加密函数
        • MD5(str):对字符串str. 进行MD5加密。
        • ENCODE(st.pwd_str):使用pwd.作为密码加密字符串str
        • DECODE(str,pwd_str):使用pwd作为密码解密字符串str
  • 为表和字段取别名

    在查询操作时,如果表名或字段名很长使用起来就不太方便,这时可以为表和字段取一个别名,这个别名可以代替其指定的表和字段。

    • 为表取别名,语法格式为:SELECT * FROM 表名 [AS] 别名;
    • 为字段取别名,语法格式为:SELECT 字段名 [AS] 别名[字段名 [AS] 别名…] FROM 表名;

第五讲 多表操作

外键

  • 什么是外键?
    • 外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束。
    • 外键用于建立和加强两个表数据之间的链接。
    • 引入外键后,外键列只能插入参照列存在的值,参照列被参照的值不能被参照的值不能删除,这就保证了数据的参照完整性。
  • 添加外键约束
    • 想要真正连接两个表的数据,就需要为表添加外键约束。
    • 添加外键的语法为:alter table 表名 add constraint FK_ID foreign key(外键字段名) REFERENCES 外表表名(主键字段名);
      • 建立外键的表必须是InnoDB型不能是临时表。因为MySQL中只有InnoDB型的表才支持外键。
      • 定义外键名时,不能加引号。如:constraint ‘FK_ID’或constraint ” FK_ID“都是错误的。
    • 添加外键的参数说明
      • 我们知道建立外键是为了保证数据的完整和统一性,即主表和从表中对应的数据保持一致,可以在建立外键时添加ON DELETE或ON UPDATE子句。
      • 语法格式如下:alter table 表名add constraint FK_ ID foreign key (外键字段名) REFERENCES 外表表名(主键字段名);[ON DELETE {CASCADE1 SET NULLI NO ACTIONI RESTRICT} ][ON UPDATE {CASCADE1 SET NULL| NO ACTIONI RESTRICT } ]
      • 语句中各参数的具体说明如下:
        • CASCADE:删除包含与巳删除键值有参照关系的所有记录。
        • SET NULL:修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(不能用于已标记为NOT NULL 的字段)。
        • NO ACTION:不进行任何操作
        • RESTRICTP:拒绝主表删除或修改外键关联列。(在不定义ON DELETE和ON UPDATE 子句时,这是默认设置,也是最安全的设置)。
  • 删除外键约束
    • 在实际开发中,根据业务逻辑的需求,需要解除两个表之间的关联关系时,就需要删除外键约束。
    • 语法格式为:alter table 表名 drop foreign key 外键名;

操作关联表

  • 数据表之间的关联关系

    • 多对一关系

      例如一个部门可以有多个员工,而一个员工不能属于多个部门

      • 在多对一的表关系中,应该将外键建在多的一方。
      • 在开发中,最常见的关联关系就是多对一关系。
    • 多对多关系

      例如一个老师可以教多个学生,一个学生也可以上多个老师的课

      • 为了实现数据表多对多的关系,需要定义一张第三方中间表,该表保存两个关系表的外键。
    • 一对一关系

      • 一对一的对应关系中,需要分清主从关系,通常在从表中建立外键。
  • 交叉连接

    • 交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积即行数的乘积。
    • 语法为:SELECT * from 表1 CROSS JOIN 表2;
    • 在实际开发中,一般不会使用交叉连接,而是使用具体的条件对数据进行有目的的查询。
  • 内连接

    • 内连接(INNER JOIN)又称为简单连接或自然连接,内连接使用比较运算符对两个表中的数据进行比较,列出与连接条件匹配的数据行,组成新的记录。
    • 语法为:SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段
  • 外连接

    • 语法如下:SELECT 所查字段 FROM 表1 LEFTIRIGHT [OUTER] JOIN 表2ON表1关系字段=表2.关系字段WHERE条件
    • 左连接
      • 左连接的结果包括LEFT JOIN子句中指定的左表的所有记录,和所有满足连接条件的记录。如果左表的某条记录在右表中不存在,则右表中显示为空。
    • 右连接
      • 右连接与左连接正好相反,返回右表中所有指定的记录和所有满足连接条件的记录,如果右表的某条记录在左表中没有匹配,则左表返回空值。
  • 复合条件连接查询

    • 复合条件连接查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。

子查询

  • 什么是子查询?
    • 子查询是指一个查询语句嵌套在另一个查询语句内部的查询。
    • 在执行查询语句时,首先会执行子查询中的语句,然后返将返回的结果作为外层查询的过滤条件。
  • 子查询都有哪些?
    • 带IN关键字的子查询
    • 带EXISTS关键字的子查询
    • 带ANY关键字的子查询
    • 带ALL关键字的子查询
    • 带比较运算符的子查询

第六讲 事务和存储过程

事物管理

  • 什么是事务?

    • 所谓的事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,即事务中的语句要么都执行要么都不执行。
  • 事务的定义特性

    • 原子性

      原子性是指一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功

    • 一致性

      一致性是指事物将数据库从一种状态转变为下一种一致的状态

    • 隔离性

      隔离性还可以称为并发控制、可串行化、锁等,当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要互相隔离。

    • 持久性

      事务一旦提交,其所做的修改就会永远保存到数据库中,即使数据库发生故障也不应该对其有任何影响。

      事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么提交的数据可能都会丢失。

存储过程

  • 什么是存储过程?

    • 存储过程就是一条或多条SQL语句的集合。
  • 创建存储过程的基本语法格式:

    • 创建存储过程的基本语法格式:CREATE PROCEDURE sp_name([proc_parameter])[characteristics…]routine_body

      其中,CREATE PROCEDURE:用来创建存储过程的关键字。

      sp_name:为存储过程的名称。

      proc_parameter:为指定存储过程的参数列表。

      characteristics:用于指定存储过程的特性。

  • 变量

    • 变量的定义

      • 在MySQL中,变量可以在子程序中声明,用于保护数据处理过程中的值,这些变量的作用范围在BEGIN…END程序中。

      • 定义变量的语法格式如下:DECLARE var_name[,varname]…date_type[DEFAULT value];

        其中,var_name:为局部变量的名称。

        DEFAULT value:子句给变量提供一个默认值,该值可以被声明一个常数或一个表达式。如果没有DEFAULT子句,变量的初始值为NULL。

    • 变量的使用

      • 使用SET语句为变量赋值

        SET var_name = expr[,var_name = expr]…;

      • 使用SELECT…INTO为一个或多个变量赋值SELECT col_name[…]INTO var_name[…]table_expr;

  • 定义条件

    • 定义条件是指事先定义程序执行过程中遇到的问题。
    • 定义条件使用DECLARE语句,语法格式如下:DECLARE condition_ name CONDITION FOR [condition_type];// condition type的两种形式:[condition _type]:
      SQLSTATE[VALUE] sqlstate_value|mysql error code
  • 定义处理程序

    • 处理程序定义了在程序执行过程中遇到问题时应当采取的处理方式,并且保证存储过程在遇到警告或错误时能继续执行处理过程使用DECLARE语句定义。
    • 语法格式如下:DECL ARE handler_ type HANDLER FOR condition valu_…]_ sp_ statement
      handler
      _type:
      CONTINUE|EXITIUNDO
      condition_value:
      |condition_name
      |SQLWARNING
      |NOT FOUND
      |SQL EXCEPTION
      |mysql_error_code
  • 光标

    • 在编写存储过程时,查询语句可能返回多条记录,如果数据量非常大,则需要使用光标来逐条读取查询结果集中的记录。
    • 光标是一种用于轻松处理多行数据的机制。
  • 流程控制

    存储过程中的流程控制语句用于将多个SQL语句划分或组合成符合业务逻辑的代码块,MySQL中的流程控制语句有7个:

    • IF语句
      • 语法格式如下:IF expr_condition THEN statement list
        [ELSEIF expr_ condition THEN
        statement list]
        [ELSE statement list ]
        END IF
    • CASE语句
      • 语法格式如下:CASE case_expr
        WHEN when_value THEN statement_list
        [WHEN when value THEN statemenE list]…
        [ELSE statement list]
        END CASE .
    • LOOP语句
      • 语法格式如下:[loop_ label: ]LOOPstatement listEND LOOP [loop_ label]
    • LEAVE语句
      • 语法格式如下:LEAVE lable
    • ITERATE语句
      • 语法格式如下:ITERATE lable
    • REPEAT语句
      • 语法格式如下:[repeat_ lable:] REPEATstatement_listUNTIL expr_ conditionEND REPEAT [repeat_lable]
    • WHILE语句
      • 语法格式如下:[ [while_ lable:] WhIlE expr_ condition DOStatement_listEND WHILE [while_ lable]
  • 调用存储过程

    • 语法如下:CALL sp_name([parameter[…]])

      其中,CALL:为调用存储过程的关键字。

      sp_name:为存储过程的名称。

      Parameter:为存储过程的参数。

  • 查看存储过程的状态

    • 使用SHOW STATUS语句
      • 语法结构如下:CALL sp_name([parameter[,…]])
    • 使用SHOW CREATE语句
      • 语法结构如下:SHOW CREATE{PROCEDURE|FUNCTION} sp_name
    • information_schema.Routines表中查看
      • 语法结构如下:SELECT * FROM information schema . RoutinesWHERE ROUTINE NAME= ’ CountProc1 ‘AND ROUTINE TYPE=’ PROCEDURE’\G
  • 修改存储过程

    • 在MySQL中使用ALTER语句修改存储过程。

    • 语法如下:ALTER {PROCEDURE|FUNCTION} sp_name[characteristic…]

      其中,sp_name:表示存储过程或函数的名称。

      characteristic:表示要修改存储过程的哪个部分,characteristic的取值分为8部分。

  • 删除存储过程

    • 在MySQL中使用DROP语句修改存储过程,语法如下:DROP{PROCEDURE|FUNCTION}[IF EXISTS] sp_name

第七讲 视图

视图概述

  • 视图是从基本表中导出来的表,可以像操作基本表一样操作视图。

  • 视图的优点

    • 简化查询语句

      日常开发中我们可以经常使用的查询定义为视图,从而使用户避免大量重复操作。

    • 安全性

      通过视图用户只能查询和修改他们所能见到的数据,数据库中的其他数据则看不到也取不到。

    • 逻辑数据独立性

      视图可以帮助用户屏蔽真实表结构变化带来的影响。

创建视图的语法格式

  • 语法格式为:CREATE [OR REPLACE] [ALGORITEM = {UNDEFINED | MERGE | TEMPTABLE}]VIEW view name [(column_ list)]AS SELECT gtatement[WITH [ CASCADED | LOCAL] CHECK OPTION]

查看视图

  • 使用DESCRIBE语句
    • 使用DESCRIBE语句可以查看视图的字段信息。
    • 语法如下:DESCRIBE 视图名;或DESC 视图名;
  • 使用SHOW TABLE STATUS语句
    • 使用SHOW TABLE STATUS语句可以查看视图的基本信息。
    • 语法如下:SHOW TABLE STATUS LIKE ‘视图名’
  • SHOW CREATE VIEW
    • 使用SHOW CREATE VIEW语句不仅可以查看创建视图时的定义语句,还可以查看视图的字符编码。
    • 语法如下:SHOW CREATE VIEW 视图名;

修改视图

  • 使用CREATE OR REPLACE VIEW语句修改视图CREATE [OR REPLACE ] [ALGORITHM = {UNDEFINEDIMERGEI TEMPTABLE} ]VIEW view_ name [ (column _list) ]AS SELECT_statement[WITH [CASCADED| LOCAL] CHECK OPTION]
  • 使用ALTER语句修改视图ALTER [ALGORITHM = {UNDEFINED| MERGE |TEMPTABLE } ]VIEW view_name [(column_ list)]AS SELECT_statement[WITH [CASCADED | LOCAL] CHECK OPTION]

删除视图

当视图不需要时,可以将其删除,删除视图时,只能删除视图的定义,不会删除数据。

  • 删除视图的基本语法格式如下:DROP VIEW[IF EXISTS]​ view name [ , view name1]…​ [RESTRICT | CASCADE]

里面可能会有一些专业知识的错误或者格式上的错误,请各位大佬在评论区斧正。

小白学MySQL数据库必须了解的基础知识(全)