【MySQL】基础篇

MySQL极速版

Part 1: MySQL 基础篇


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文主要是给想要了解、学习 MySQL的同学以供了解一些有关MySQL的基础知识,以及一些简单的SQL语句的书写。希望大家可以通过我的这篇文章大概了解一下MySQL的知识脉络。


提示:以下是本篇文章正文内容,下面案例可供参考

一、MySQL是什么?

MySQL(发音为"My S-Q-L"或"My Sequel")是一个流行的开源关系型数据库管理系统(RDBMS)。它是一种用于管理和存储数据的数据库系统,广泛用于各种应用程序,从小型网站到大型企业级系统。MySQL是一种客户端-服务器数据库管理系统,它通过SQL(结构化查询语言)来进行数据操作和查询。
MySQL是一个关系型数据库,关系型数据库是指建立在关系模型基础上,由多张二维表互相连接组成的数据库。

关系型数据库(RDBMS)是一种结构化的数据库系统,它使用表格(也称为关系)来存储和管理数据。在关系型数据库中,数据被组织成一系列表,每个表由一组行和列组成。每个行代表一个记录,而每个列代表记录中的一个字段或属性。

SQL

1、通用语法

  • 可以一行或者多行书写,分号结尾
  • 可以通过空格/缩进来增强语句的可读性
  • 语句不区分大小写关键字建议大写
  • 注释
    • 单行注释:-- 注释内容 或 # 注释内容(MySQL独有)
    • 多行注释:/注释内容/

2、SQL 分类

  • DDL(Data Definition Language):数据定义语言,用于定义数据库的结构和架构。DDL语句用于创建、修改和删除数据库对象,如表格、索引、视图和模式等。常见的DDL命令包括 CREATE(创建表格或其他对象)、 ALTER(修改表格结构)、 DROP(删除对象) 和 TRUNCATE(清空表格数据)。
    • 创建表格:CREATE TABLE students (id INT, name VARCHAR(50));
    • 修改表格结构:ALTER TABLE employees ADD COLUMN salary INT;
    • 删除表格:DROP TABLE orders;
  • DML(Data Manipulation Language):数据操作语言,用于处理数据库中的数据。DML语句用于插入、更新和删除数据,以及查询数据。常见的DML命令包括 SELECT(查询数据)、 INSERT(插入数据)、 UPDATE(更新数据) 和 DELETE(删除数据)。
    • 查询数据:SELECT * FROM customers WHERE city = ‘New York’;
    • 插入数据:INSERT INTO orders (order_id, customer_id, total_amount) VALUES (101, 15, 500.00);
    • 更新数据:UPDATE products SET price = 25 WHERE category = ‘Electronics’;
    • 删除数据:DELETE FROM employees WHERE employee_id = 123;
  • DQL(Data Query Language):数据查询语言,是DML的一部分,专门用于查询数据库中的数据。DQL主要包括 SELECT 语句,用于从数据库中检索所需的数据。
    • 查询数据:SELECT product_name, price FROM products WHERE category = ‘Electronics’;
  • DCL(Data Control Language):数据控制语言,用于管理数据库访问权限和安全性。DCL语句主要包括 GRANT(授权用户或角色执行特定操作的权限)和 REVOKE(撤销授权)。
    • 授权用户:GRANT SELECT, INSERT, UPDATE ON orders TO user1;
    • 撤销权限:REVOKE DELETE ON customers FROM user2;

二、基础知识点

1.函数

1)字符串函数
字符串函数

SELECT CONCAT('Hello', ' ', 'World') AS result;
-- 结果:Hello World
SELECT SUBSTRING('MySQL Functions', 1, 5) AS result;
-- 结果:MySQL
SELECT LENGTH('Database') AS result;
-- 结果:8
SELECT UPPER('lowercase') AS result;
-- 结果:LOWERCASE

2)数值函数
数值函数

SELECT ABS(-10) AS result;
-- 结果:10
SELECT ROUND(3.567, 1) AS result;
-- 结果:3.6
SELECT SUM(salary) AS total_salary FROM employees;//求和
SELECT AVG(price) AS average_price FROM products;//计算平均值

3)日期函数
日期函数

SELECT NOW() AS current_datetime;
-- 结果:2023-10-30 15:30:00
SELECT DATE_ADD('2023-10-30', INTERVAL 3 DAY) AS result;
-- 结果:2023-11-02
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_date;
-- 结果:2023-10-30 15:30:00

4)流程函数
流程函数

//IF条件判断
SELECT IF(salary > 50000, 'High', 'Low') AS salary_category FROM employees;
//条件分支判断
SELECT
  CASE
    WHEN age < 18 THEN 'Minor'
    WHEN age BETWEEN 18 AND 65 THEN 'Adult'
    ELSE 'Senior'
  END AS age_category
FROM persons;

2.约束

概念:在数据库中,约束(Constraint)是一种规则或条件,用于确保数据库中数据的完整性、一致性和准确性。它们是定义在表格列上的规则,限制了可以插入、更新或删除的数据。数据库约束用于强制执行数据的有效性和一致性,以防止不良数据的插入或不当操作。

常见约束类型:

在数据库中,约束(Constraint)是一种规则或条件,用于确保数据库中数据的完整性、一致性和准确性。它们是定义在表格列上的规则,限制了可以插入、更新或删除的数据。数据库约束用于强制执行数据的有效性和一致性,以防止不良数据的插入或不当操作。

以下是一些常见的数据库约束类型:

  • 主键约束(Primary Key Constraint):主键约束用于唯一标识表格中的每一行数据。它确保表格中的每个行具有唯一的标识符,通常用于标识表格中的每一行记录。主键通常是表格的一个或多个列,它们不能包含重复值或NULL值。

  • 唯一约束(Unique Constraint):唯一约束确保表格中的数据在指定列上具有唯一值,但不要求这些列是主键。它允许唯一性,但允许NULL值。

  • 外键约束(Foreign Key Constraint):外键约束用于定义表格之间的关系。它确保在一个表格中的外键列的值必须在另一个表格的主键列中存在。外键用于维护数据的引用完整性。

  • 检查约束(Check Constraint):检查约束用于定义列中的数据必须满足的条件。它可以强制要求列中的数据满足特定的规则,例如,年龄必须大于等于18,性别必须是"男"或"女"等。

  • 默认约束(Default Constraint):默认约束用于为列指定默认值。如果在插入数据时未提供列的值,则将使用默认值。这有助于确保数据的一致性。

  • 非空约束(NOT NULL Constraint):非空约束用于确保列中的数据不包含NULL值。它要求在插入或更新数据时必须为列提供值
    约束

3.多表查询

多表查询一般分为:一对多,多对多,一对一;

连接方式:

  • 内连接(INNER JOIN):
    • INNER JOIN 返回两个表格之间匹配的行,忽略不匹配的行。
    • 结果集包括两个表格中满足连接条件的记录。
    • 如果没有匹配的行,将不包括在结果中。
    SELECT orders.order_id, customers.customer_name
    FROM orders
    INNER JOIN customers ON orders.customer_id = customers.customer_id;
    
  • 外连接(OUTER JOIN):
    • 外连接是一种包括左外连接、右外连接和全外连接的通用术语
    • 左外连接(LEFT JOIN)返回左表格的所有行,以及与右表格匹配的行,不匹配的行包括 NULL 值。
    • 右外连接(RIGHT JOIN)返回右表格的所有行,以及与左表格匹配的行,不匹配的行包括 NULL 值。
    • 全外连接(FULL JOIN)返回两个表格之间匹配和不匹配的所有行,不匹配的行包括 NULL 值。
      SELECT employees.employee_name, orders.order_id
      FROM employees
      LEFT JOIN orders ON employees.employee_id = orders.employee_id;
      
  • 自连接:
    • 自连接是一种特殊的连接方式,用于连接表格中的不同行,通常在表格中包含与自身相关的数据时使用。
    • 通过给表格取别名(通常是不同的别名),可以在表格中创建虚拟的关联。
      SELECT e1.employee_name, e2.manager_name
      FROM employees e1
      LEFT JOIN employees e2 ON e1.manager_id = e2.employee_id;
      

联合查询(UNION Query):

  • 联合查询用于合并来自多个表格或查询的结果集,并将它们合并为单个结果集。
  • 结果集中的行是唯一的,不会重复。
  • 联合查询的各个查询必须具有相同的列数和相似的数据类型。
  • 联合查询通常用于合并相似结构的表格或查询,以创建一个包含所有相关数据的单个结果集。
    SELECT customer_name, phone_number FROM customers
    UNION
    SELECT supplier_name, contact_number FROM suppliers;
    

子查询:

  • 标量子查询(Scalar Subquery):标量子查询返回单个值,通常用于比较或过滤条件中。
    SELECT product_name, price
    FROM products
    WHERE price > (SELECT AVG(price) FROM products);
    
  • 行子查询(Row Subquery):行子查询返回单个行,通常用于子查询的结果集需要包含多个列的情况。通常与比较运算符一起使用,以便将子查询的多个列与主查询的多个列进行比较。
    SELECT first_name, last_name
    FROM employees
    WHERE (first_name, last_name) = (SELECT first_name, last_name FROM managers);
    
  • 表子查询(Table Subquery):表子查询返回多行多列的结果集,通常用于在 FROM 子句中充当虚拟表格,供主查询使用。它可以用于创建具有特定数据集的虚拟表格,以便执行复杂的查询。
    SELECT *
    FROM employees
    WHERE (employee_id, last_name) IN (SELECT employee_id, last_name FROM temporary_employees);
    
  • 存在子查询(EXISTS Subquery):存在子查询用于检查是否存在满足特定条件的记录,通常用于 WHERE 子句中。如果子查询返回任何行,主查询将返回结果。
    SELECT product_name
    FROM products
    WHERE EXISTS (SELECT * FROM orders WHERE orders.product_id = products.product_id);
    
  • IN 子查询:IN 子查询用于检查主查询中的列值是否与子查询中的值之一匹配。如果主查询中的列值等于子查询中的任何一个值,将返回结果。
    SELECT product_name
    FROM products
    WHERE product_id IN (SELECT product_id FROM order_items WHERE order_id = 123);
    

4.事务

1)概括
事务(Transaction)是数据库管理系统(DBMS)中的一个重要概念,它表示一组数据库操作(通常是增、删、改操作),这些操作被视为单个、不可分割的工作单元。事务确保数据库的一致性、完整性和可靠性,并提供了以下四个关键属性,通常称为ACID属性:

  • 原子性(Atomicity):事务是一个原子操作,要么全部执行成功,要么全部失败。如果事务中的任何一步失败,那么整个事务都应该被回滚(撤销),以确保数据库不会处于不一致的状态。

  • 一致性(Consistency):事务在执行前和执行后,数据库应该保持一致状态。这意味着事务应该将数据库从一个一致状态转换到另一个一致状态。如果事务违反了数据库的完整性约束,它将被回滚,以确保数据库的一致性。

  • 隔离性(Isolation):事务应该与其他事务隔离开来,以防止互相干扰。数据库系统必须确保多个事务并发执行时,它们之间不会相互影响,以避免出现不确定的结果。

  • 持久性(Durability):一旦事务成功完成,其结果应该永久保存在数据库中,即使系统发生故障或崩溃。持久性确保事务的结果在系统恢复后仍然可用。

事务的典型应用包括银行交易、库存管理、在线订单处理等,其中确保数据的完整性和一致性至关重要。通过使用事务,数据库系统可以维护数据的可靠性,即使在发生错误或系统故障时也能够正确处理。数据库管理系统提供了事务管理功能,以帮助开发人员实施和控制事务,以便有效地处理数据库操作。

2)并发事务会引发的问题

  • 脏读(Dirty Read):当一个事务读取另一个事务尚未提交的数据时,就发生了脏读。这可能导致事务读取不一致的数据,因为另一个事务最终可能会回滚。

解决方法:通过使用事务隔离级别(如可重复读)来限制脏读。

  • 不可重复读(Non-Repeatable Read):一个事务在同一查询中多次读取相同数据,但在两次读取之间,另一个事务对数据进行了更改,导致不一致的读取结果。

解决方法:通过使用事务隔离级别(如可重复读或串行化)来限制不可重复读。

  • 幻读(Phantom Read):一个事务在同一查询中多次读取相同范围的数据,但在两次读取之间,另一个事务插入、更新或删除了符合查询条件的数据,导致出现幻行。

解决方法:通过使用事务隔离级别(如串行化)来限制幻读。

  • 丢失更新(Lost Update):当两个事务同时尝试更新相同的数据时,一个事务的更新可能会覆盖另一个事务的更新,导致数据丢失。

解决方法:使用锁机制或乐观并发控制来避免丢失更新。

  • 死锁(Deadlock):两个或多个事务互相等待对方释放锁,导致所有事务无法继续执行。

解决方法:使用事务超时、死锁检测和回滚等方法来处理死锁。
事务隔离级别
从上往下安全性越来越高,执行效率越来越低。

解决这些问题的方法包括:

事务隔离级别:通过设置适当的事务隔离级别来控制并发事务的行为。不同的隔离级别提供了不同程度的隔离,以解决脏读、不可重复读和幻读等问题。
锁机制:使用行级锁或表级锁来协调并发事务的访问,确保数据的一致性。锁机制可以避免丢失更新和死锁问题。
乐观并发控制:使用版本控制或时间戳来检测和解决并发问题。事务在提交时检查数据版本或时间戳,以确保不会出现冲突。
事务管理和监控:使用事务管理工具和监控工具来跟踪和管理并发事务,以及检测和解决问题。
事务隔离级别操作

解决并发事务引发的问题需要综合考虑事务隔离级别、锁策略、乐观并发控制和事务管理等因素,以确保数据库操作的可靠性和一致性。不同的应用和场景可能需要不同的解决方法。


总结

这篇文章为大家提供了MySQL基础的知识点,大家在看完文章后一定更多的了解到了MySQL,已经对MySQL产生了一定的兴趣。大家可以在哔哩哔哩上面学习有关的视频。如果大家有什么问题可以在评论区提出来,或者私信博主哦!

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值