MySQL是一种开源的关系型数据库管理系统,是目前最流行的关系型数据库之一。它支持多种操作系统,包括Linux、Windows、Mac OS等,同时也支持多种编程语言,如Java、Python、PHP等。MySQL具有以下特点:

1.MySQL数据库是用C和C++语言编写的,以保证源码的可移植性
2.支持多个操作系统例如:Windows、Linux、Mac OS等等
3.支持多线程,可以充分的利用CPU资源
4.为多种编程语言提供API,包括C语言,Java, PHP、Python、go语言等
5.MySQL优化了SQL算法,有效的提高了查询速度
6.MysQL开放源代码且无版权制约,自主性强、使用成本低。
7.MySQL历史悠久、社区及用户非常活跃,遇到问题,可以很快获取到帮助。

DDL语言

DDL是数据库定义语言(Data Definition Language)的缩写,用于定义数据库、表、列以及相关的约束等对象。DDL通常包括以下几种语句:

  1. CREATE:用于创建数据库、表、视图、存储过程等对象。
  2. ALTER:用于修改数据库、表、列等对象的结构。
  3. DROP:用于删除数据库、表、视图、存储过程等对象。
  4. TRUNCATE:用于清空表中的所有数据,但不删除表结构。
  5. COMMENT:用于添加注释或说明。

DDL语句通常由数据库管理员或者开发人员使用,用于管理数据库的结构和对象。DDL语句的执行会直接影响数据库的结构,因此需要谨慎使用。

DML语言

DML是数据库操作语言(Data Manipulation Language)的缩写,用于对数据库中的数据进行操作和管理。DML通常包括以下几种语句:

  1. SELECT:用于查询数据库中的数据。
  2. INSERT:用于向数据库中插入新的数据。
  3. UPDATE:用于修改数据库中已有的数据。
  4. DELETE:用于删除数据库中的数据。

DML语句是开发人员和管理员最常用的数据库操作语言,用于对数据库中的数据进行增删改查等操作。DML语句的执行会直接影响数据库中的数据,因此需要谨慎使用。

总之DDL是对表结构的增删改查,DML是对表数据的增删改查

约束

约束是数据库中用于限制数据输入的规则或条件,它可以保证数据的完整性和一致性。不符合添加的数据,再插入时会失败。常用的约束有以下几种:

  1. NOT NULL:指定列不能为空,即该列必须有值。
  2. UNIQUE:指定列的值必须唯一,不能有重复值。
  3. PRIMARY KEY:指定列为主键,该列的值必须唯一且不能为空。
  4. FOREIGN KEY:指定列为外键,用于与其他表建立关联关系。
  5. CHECK:指定列的值必须符合指定的条件,如范围、数据类型等。
  6. DEFAULT:默认值

约束可以在创建表时指定,也可以在表创建后通过ALTER TABLE语句添加。约束可以保证数据的完整性和一致性,避免了数据的不合法输入和错误操作,提高了数据的质量和可靠性。

主键约束

1.MysQL 主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,这样的一列或多列称为表的主键,通过它可以强制表的实体完整性,同时可以方便根据主键查询该行数据。
2.选取设置主键约束的字段 主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符 主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键,主键应该遵守下面的规则
3,每个表只能定义一个主键,主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行数据有相同的主键值,这是唯一性原则
4.在创建表时设置主键约束 在 CREATE TABLE 语句中,主键是通过 PRIMARY KEY 关键字来指定的
5.当创建主键的约束时,系统会默认所在的列和列组合 建立对应的索引,方便提高查询效率

条件:一张表中只能有一个主键(可以单列主键也可以多列主键)、主键值不可以为空

外键约束

外键约束(Foreign Key Constraint)是MySQL中一种用于确保数据完整性和一致性的机制。它用于建立两个表之间的关系,并确保一个表中的数据在另一个表中存在。

外键约束是通过在一个表中的列上创建外键(Foreign Key)来实现的。外键是一个指向另一个表中主键的列,它确保了两个表之间的数据一致性。当在一个表中插入、更新或删除数据时,MySQL会自动检查外键约束,并确保操作不会破坏数据完整性。

以下是一个示例,它展示了如何在MySQL中创建外键约束:

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE,
  total_amount DECIMAL(10,2),
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

在此示例中,orders表中的customer_id列是一个外键,它指向customers表中的customer_id列。这意味着,当在orders表中插入、更新或删除数据时,MySQL会自动检查customer_id列的值是否存在于customers表中的customer_id列中。如果不存在,则会抛出一个错误,防止数据不一致性。

分页查询

在MySQL中当数据量很大时,显示屏长度有限,我们可以对数据进行分页显示,例如数据一共有100条,每页10条数据,可以分成10页。

MySQL分页查询是指在查询结果中只返回指定数量的记录,而不是返回所有的记录。这通常用于在Web应用程序中显示数据时,以分页的形式显示结果,以避免在一次性显示所有数据时出现性能问题。

在MySQL中,使用LIMIT和OFFSET子句实现分页查询。LIMIT子句用于指定要返回的记录数,而OFFSET子句用于指定从哪个记录开始返回。例如,以下查询将返回从第6行开始的10行记录:

SELECT * FROM table_name LIMIT 10 OFFSET 5;

另外,MySQL也支持使用简化的语法来执行分页查询。例如,以下查询将返回从第6行开始的10行记录:

SELECT * FROM table_name LIMIT 5, 10;

这将返回从第6行到第15行的记录,其中5是OFFSET值,10是LIMIT值。

聚合查询

MySQL聚合查询是用于计算数据汇总信息的查询。它们可以用来计算平均值、总和、最大值、最小值等统计信息。以下是一些常见的MySQL聚合函数:

  1. AVG():计算某列的平均值。
  2. SUM():计算某列的总和。
  3. MAX():计算某列的最大值。
  4. MIN():计算某列的最小值。
  5. COUNT():计算某列的行数。

以下是一些示例查询:

  1. 计算某列的平均值:
SELECT AVG(column_name) FROM table_name;
  1. 计算某列的总和:
SELECT SUM(column_name) FROM table_name;
  1. 计算某列的最大值:
SELECT MAX(column_name) FROM table_name;

你也可以在一个查询中使用多个聚合函数,例如

SELECT AVG(column_name), SUM(column_name), MAX(column_name) FROM table_name;

聚合查询对NULL值的处理

在MySQL聚合查询中,NULL值的处理方式取决于所使用的聚合函数。

对于SUM()和AVG()函数,如果包含NULL值,则它们将被忽略。例如,如果有一个包含值为1、2、NULL和3的列,则使用SUM()函数将返回6,而不是NULL。使用AVG()函数将返回(1+2+3)/3=2,而不是NULL。

对于MAX()和MIN()函数,如果包含NULL值,则它们将被忽略。例如,如果有一个包含值为1、2、NULL和3的列,则使用MAX()函数将返回3,而不是NULL。使用MIN()函数将返回1,而不是NULL。

对于COUNT()函数,如果使用COUNT(),则将包括所有行,包括包含NULL值的行。如果使用COUNT(column_name),则将忽略包含NULL值的行。例如,如果有一个包含值为1、2、NULL和3的列,则使用COUNT()函数将返回4,而使用COUNT(column_name)函数将返回3。

因此,在使用MySQL聚合查询时,需要特别注意包含NULL值的列,以确保得到正确的结果。

分组查询

分组查询是一种在MySQL中使用的聚合查询,它允许将数据分组并对每个组执行聚合函数。

在分组查询中,使用GROUP BY子句将数据按照一个或多个列进行分组。然后,使用聚合函数(例如SUM、AVG、COUNT等)计算每个组的汇总信息。最后,使用HAVING子句对结果进行过滤,只返回符合条件的组。

以下是一个示例查询,它将某个表中的数据按照“部门”列进行分组,并计算每个部门的平均工资:

SELECT department, AVG(salary)
FROM employees
GROUP BY department;

在此查询中,使用GROUP BY子句将数据按照“部门”列进行分组,然后使用AVG函数计算每个组的平均工资。结果将返回每个部门的名称和平均工资。

在分组查询中,可以使用多个列进行分组。例如,可以按照“部门”和“性别”列进行分组:

SELECT department, gender, AVG(salary)
FROM employees
GROUP BY department, gender;

在此查询中,使用GROUP BY子句将数据按照“部门”和“性别”列进行分组,然后使用AVG函数计算每个组的平均工资。结果将返回每个部门和性别的组合,以及每个组的平均工资。

需要注意的是,在分组查询中,HAVING子句用于对组进行过滤,而WHERE子句用于对行进行过滤。HAVING子句的过滤条件是在聚合函数计算之后进行的,因此它可以使用聚合函数。例如,以下查询将返回平均工资大于5000的部门:

SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;

多表关系

在MySQL中,多个表之间可以建立关系,以便在查询中联合使用数据。以下是MySQL中常见的三种表关系:

  1. 一对一关系(One-to-One):两个表之间的每个记录都有一个对应的记录。例如,一个人只能有一个身份证号码,而一个身份证号码也只能对应一个人。
  2. 一对多关系(One-to-Many):一个表中的每个记录都可以对应另一个表中的多个记录。例如,一个订单可以有多个商品,而每个商品只能属于一个订单。
  3. 多对多关系(Many-to-Many):两个表之间的每个记录都可以对应另一个表中的多个记录,并且需要使用一个中间表来存储关系。例如,一个学生可以选修多门课程,而一门课程也可以被多个学生选修。

在建立表关系时,需要使用外键(Foreign Key)来指定两个表之间的关系。外键是一个指向另一个表中主键的列,它可以确保数据的完整性和一致性,并允许在查询中联合使用数据。

以下是一个示例,它展示了两个表之间的一对多关系:

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE,
  total_amount DECIMAL(10,2),
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

CREATE TABLE order_items (
  order_item_id INT PRIMARY KEY,
  order_id INT,
  product_id INT,
  quantity INT,
  price DECIMAL(10,2),
  FOREIGN KEY (order_id) REFERENCES orders(order_id),
  FOREIGN KEY (product_id) REFERENCES products(product_id)
);

在此示例中,orders表和order_items表之间建立了一对多关系。orders表中的customer_id列是一个外键,它指向customers表中的customer_id列,以确保每个订单都属于一个客户。order_items表中的order_id列也是一个外键,它指向orders表中的order_id列,以确保每个订单项都属于一个订单。同样,order_items表中的product_id列也是一个外键,它指向products表中的product_id列,以确保每个订单项都对应一个产品。

在查询中使用多个表时,可以使用JOIN关键字来将它们联合起来。例如,以下查询将返回每个客户的订单信息和订单项信息:

SELECT customers.customer_name, orders.order_date, order_items.product_id, order_items.quantity, order_items.price
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id
JOIN order_items ON orders.order_id = order_items.order_id;

在此查询中,使用JOIN关键字将customers表、orders表和order_items表联合起来,以便获取每个客户的订单信息和订单项信息。

联表查询

联表查询是指在关系型数据库中,通过同时查询多个表来获取需要的数据的一种查询方式。下面举一个例子来说明:

假设有两个表,一个是学生表(students),包含学生的学号(id)、姓名(name)和班级编号(class_id);另一个是班级表(classes),包含班级编号(id)和班级名称(name)。

如果要查询所有学生的姓名和所在班级的名称,就需要使用联表查询。可以使用以下SQL语句来实现:

SELECT students.name, classes.name
FROM students
JOIN classes
ON students.class_id = classes.id;

这个查询语句中,使用了JOIN关键字将学生表和班级表连接起来,ON关键字指定了连接条件,即学生表中的班级编号(class_id)等于班级表中的班级编号(id)。最终查询结果包含了学生的姓名和所在班级的名称。

在SQL中,联表查询有以下几种:

  1. INNER JOIN:内连接,返回两个表中匹配的行。
  2. LEFT JOIN:左连接,返回左表中所有行和右表中匹配的行。
  3. RIGHT JOIN:右连接,返回右表中所有行和左表中匹配的行。
  4. FULL OUTER JOIN:全外连接,返回两个表中所有行,如果没有匹配的行,则填充NULL值。
  5. CROSS JOIN:交叉连接,返回两个表中所有可能的组合,没有匹配的行则不返回。

其中,INNER JOIN是最常用的联表查询方式,它只返回两个表中匹配的行,可以用来查找两个表中共同拥有的数据。LEFT JOIN和RIGHT JOIN则可以用来查找某个表中没有匹配到的数据。FULL OUTER JOIN可以返回两个表中所有的数据,包括没有匹配到的数据,而CROSS JOIN则可以用来查找两个表中所有可能的组合。

子查询

子查询是指在一个SQL语句中嵌套另一个完整的SQL查询语句,将内部查询的结果作为外部查询的条件之一来执行查询的方式。这个特性从MySQL4.1开始引入,子查询通常用于需要在查询中使用其他查询的结果作为条件的情况,可以用于实现复杂的查询和数据筛选操作。

子查询通常嵌套在SELECT、FROM、WHERE、HAVING、IN、NOT IN等关键字后面,用括号将子查询括起来。子查询可以返回单个值、一列值或者多列值,具体返回值的形式取决于子查询的具体实现方式。

以下是一个使用子查询的例子,查询出销售额最高的产品名称和销售额:

SELECT name, revenue
FROM products
WHERE revenue = (
  SELECT MAX(revenue)
  FROM products
);

这个查询语句中,内部的子查询语句 SELECT MAX(revenue) FROM products 返回了销售额最高的值,这个值被外部查询语句作为条件之一使用,从而得到了销售额最高的产品名称和销售额。

自关联查询

自关联查询是指在一个表中,通过将表中的某个列与同一个表中的另一个列进行关联,从而实现查询的一种方式。自关联查询通常用于处理具有层级关系的数据,例如组织机构、分类目录等。在自关联查询中,需要使用表的别名来区分被关联的两个列,以及使用递归查询来处理多层次的数据。

以下是一个使用自关联查询的例子,查询出员工及其直接上级的姓名:

SELECT e.name AS employee_name, m.name AS manager_name
FROM employees e
JOIN employees m
ON e.manager_id = m.id;

这个查询语句中,使用了表的别名 em 来区分被关联的两个列,即员工表中的 manager_id 列和 id 列。通过将这两个列进行关联,就可以查询出员工及其直接上级的姓名。如果需要查询多层次的数据,可以使用递归查询来处理,例如使用WITH RECURSIVE语句来实现。