MySQL基础篇(二):MySQL表的CURD操作

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL基础篇(二):MySQL表的CURD操作

MySQL基础篇(二):MySQL表的CURD操作


[TOC]


一、SQL语句

操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准,简称SQL。

  • SQL通用语法

    1 . SQL语句可以单行或多行书写,以分号结尾。

    2 . SQL语句可以使用空格/缩进来增强语句的可读性。

​ 3 . MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。

  • 注释

    • 单行注释: -- 注释内容 或者使用 # 注释内容 。
    • 多行注释:/ 注释内容 /
  • SQL语句分类

    分类 说明
    DDL(deifnition) 数据定义语言(用来定义数据库对象,数据库,表,字段)
    DML(manipulation) 数据操纵语言(对数据库 表中的是数据进行增删改)
    DQL(query) 数据查询语言,用来查询数据库中表的记录
    DCL(control) 数据控制语言,用来创建数据库用户,控制数据库的访问权限

二、 基础表操作

  • 创建表

    • 同一个数据库中,不能有两个表的名字相同,表名和列名不能和SQL的关键词重复。
    • 语法:
    create table 表名(定义列1, 定义列2, .......);
    列 -> 变量名 数据类型
    • 举例:
    mysql> create table if not exists book(
        ->   book_name varchar(32) comment '图书名称',
        ->   book_author varchar(32)comment  '图书作者' ,
        ->   book_price decimal(12,2) comment '图书价格',
        ->   book_category varchar(12) comment '图书分类',
        ->   publish_data timestamp
        -> )character set utf8mb4;
        
    Query OK, 0 rows affected (0.04 sec)
  • 查看库中的表

    • 语法:

      show tables;
    • 举例:

      mysql> show tables;
      +--------------------+
      | Tables_in_mytestdb |
      +--------------------+
      | book               |
      +--------------------+
      1 row in set (0.00 sec)
      
  • 查看表结构

    • 语法:

      desc  表名;
    • 举例:
      image-20230104165942892
      • MySQL数据库中的表结构主要包含以下几种信息:
      • 字段名称,字段类型,是否允许为空,索引类型。默认值,扩充信息
  • 删除表

    • 语法:
    drop table 表名
    • 举例 :
    mysql> desc test1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | name  | varchar(10) | YES  |     | NULL    |       |
    | age   | int(11)     | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.02 sec)
    
    mysql> drop table test1;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> desc test1;
    ERROR 1146 (42S02): Table 'mytestdb.test1' doesn't exist
  • 重命名表

    • 语法:

      rename table old_name to new_name;
    • 举例:

      mysql> rename table book to eBook;
      Query OK, 0 rows affected (0.05 sec)
      
      mysql> show tables;
      +--------------------+
      | Tables_in_mytestdb |
      +--------------------+
      | ebook              |
      +--------------------+
      1 row in set (0.00 sec)

三、MySQL 中的增删查改操作

CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写

案例:

-- 创建一张图书表
mysql> create table if not exists book(
    ->   book_name varchar(32) comment '图书名称',
    ->   book_author varchar(32)comment  '图书作者' ,
    ->   book_price decimal(12,2) comment '图书价格',
    ->   book_category varchar(12) comment '图书分类',
    ->   publish_data timestamp
    -> )character set utf8mb4;
  • 增加(insert语句)

    • 单行插入(全列)

      insert into 表名 values(对应列的参数列表); 
      -- 一次插入一行
    • 多行插入(全列)

      insert into 表名 values(对应列的实参列表), (对应列的参数列表), (对应列的参数列表);              
      -- 一次插入多行
    • 指定列插入

      • values 后面( )中的内容, 个数和类型要和表名后面( )中指定的结构匹配.
      • 未被指定的列会以默认值进行填充.
      insert into 表名 (需要插入的列) values(对应列的参数列表); 
      -- 一次插入一行
      insert into 表名 (需要插入的列) values(对应列的参数列表), (), ().... 
      -- 一次插入多行
    • 案例:

      # 单行输入
      
      mysql> 
      insert into book values('计算机网络','谢希仁',45,'计算机类','2020-12-25 12:51:00');
      Query OK, 1 row affected (0.01 sec)
      
      #多行输入
      
      mysql> 
      insert into book values('计算机组成原理','王峰',45,'硬件类','2020-12-12 12:00:00'),
          -> ('微机原理','李华',97,'硬件类','2000-12-19 20:00:00');
          
      Query OK, 2 rows affected (0.04 sec)
      Records: 2  Duplicates: 0  Warnings: 0
      
      #指定列插入
      
      mysql>
      insert into book(book_name,book_author,publish_data) values ('软件工程','张三','2020-05-06 12:00:00');
      Query OK, 1 row affected (0.02 sec)
    • 插入数据后的表如图所示:

      image-20230104214245702

在MySQL当中 , 多条记录逐次插入的效率是要低于一次把多条纪录一起插入的 ,原因如下:

  • 网络请求和响应时间开销 , 每次插入都会有一定的时间开销.
  • 数据库服务器是把数据保存在硬盘上的 , IO操作时,操作的次数带来的影响大于数据量.
  • 每一次sql操作,内部开启的事务也会占据一定的开销.
  • 查询(select语句)

    • 全列查询
    语法
    select * from 表名
    
    --  * 表示通配符, 可以匹配表中的所有列.
    企业级别的数据库中慎用, 容易把I/O或者网络带宽吃满,如果有外边的用户客户端要通过宽带访问服务器时,服务器就无法做出正确的响应.

    示例

    select * from book;

    image-20230106171654355

    • 指定列查询
    select 列名...  from  表名
    示例
    )mysql> select book_name from book;
    +----------------+
    | book_name      |
    +----------------+
    | 计算机网络     |
    | 计算机组成原理 |
    | 微机原理       |
    | 软件工程       |
    +----------------+
    4 rows in set (0.01 sec)
    
    mysql> select book_author,book_price from book;
    +-------------+------------+
    | book_author | book_price |
    +-------------+------------+
    | 谢希仁      |      45.00 |
    | 王峰        |      45.00 |
    | 李华        |      97.00 |
    | 张三        |       NULL |
    +-------------+------------+
    4 rows in set (0.00 sec)                  
    • 查询你字段为表达式
    select 字段或表达式, 字段或表达式... from 表名;
    示例
    -- 查询图书涨价10元后所有图书的名称作者和价格
    mysql> select book_name ,book_author,book_price + 10 from book;
    +----------------+-------------+-----------------+
    | book_name      | book_author | book_price + 10 |
    +----------------+-------------+-----------------+
    | 计算机网络     | 谢希仁      |           55.00 |
    | 计算机组成原理 | 王峰        |           55.00 |
    | 微机原理       | 李华        |          107.00 |
    | 软件工程       | 张三        |            NULL |
    +----------------+-------------+-----------------+
    4 rows in set (0.00 sec)
    
    • 将表达式或者字段指定别名查询
    mysql中支持给所查询的表达式取一个别名 , 使用 as 可以使查询结果更加直观 , 代码的可读性也会更强.
    select 列名或表达式 as 别名, ... from 表名;
    示例
    -- 将涨价20元后的图书价格取为别名newprice
    mysql> select book_name,book_author,book_price + 20 as newprice from book;
    +----------------+-------------+----------+
    | book_name      | book_author | newprice |
    +----------------+-------------+----------+
    | 计算机网络     | 谢希仁      |    65.00 |
    | 计算机组成原理 | 王峰        |    65.00 |
    | 微机原理       | 李华        |   117.00 |
    | 软件工程       | 张三        |     NULL |
    +----------------+-------------+----------+
    4 rows in set (0.00 sec)
    • 去重查询
    select distinct 列名 from 表名
    示例
    --book 表中插入一条重复的book_name数据
    
    mysql> insert into book values('计算机网络','张华',89,'计算机类','2020-11-23 11:00:00');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select book_name from book;
    +----------------+
    | book_name      |
    +----------------+
    | 计算机网络     |
    | 计算机组成原理 |
    | 微机原理       |
    | 软件工程       |
    | 计算机网络     |
    +----------------+
    5 rows in set (0.00 sec)
    
    mysql> select distinct book_name from book;
    +----------------+
    | book_name      |
    +----------------+
    | 计算机网络     |
    | 计算机组成原理 |
    | 微机原理       |
    | 软件工程       |
    +----------------+
    4 rows in set (0.00 sec)
    查询结果当中,没有了重复的book _ name 元素,达到了去重效果.
    • 排序查询
    select 列名 
    from 表名 
    order by 列名 asc(升序)/desc(降序); 
    #  想要排序的列
    示例
    # 按照书的价格升序进行排列
    mysql> select book_name,book_price from book order by book_price asc;
    +----------------+------------+
    | book_name      | book_price |
    +----------------+------------+
    | 软件工程       |       NULL |
    | 计算机网络     |      45.00 |
    | 计算机组成原理 |      45.00 |
    | 计算机网络     |      89.00 |
    | 微机原理       |      97.00 |
    +----------------+------------+
    5 rows in set (0.00 sec)
    
    #按照书的价格降序进行排列
    mysql> select book_name,book_price from book order by book_price desc;
    +----------------+------------+
    | book_name      | book_price |
    +----------------+------------+
    | 微机原理       |      97.00 |
    | 计算机网络     |      89.00 |
    | 计算机网络     |      45.00 |
    | 计算机组成原理 |      45.00 |
    | 软件工程       |       NULL |
    +----------------+------------+
    5 rows in set (0.00 sec)
    • 使用排序查询时 , 升序查询 asc 可以省略, 即默认为升序排列, null值一定为其中最小的.
    • 可以对多个字段进行排序,优先级按照书写的顺序进行.

    示例

    # 查询按照价格升序 ,年份降序
    select name,price,age from book order by price asc,age desc;
    #查询按照总成绩进行降序
    select name,english+math+chinese as total from grade order by total desc;
    • 条件查询

      当我们使用查询时, 通常具有各种各样的前提条件 , 此时就需要使用条件查询来完成.
    select 列名.. from 表名..where + 条件
    比较运算符
运算符 说明
>, >=, <, <= 大于,大于等于,小于,小于等于
= 等于,null 不安全,例如 null = null 的结果是 null(false)
<=> 等于,null 安全,例如 null <=> null 的结果是 true(1)
!=, <> 不等于
between a0 and a1 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 true(1)
in (option, …) 如果是 option 中的任意一个,返回 true(1)
is null 是 null
is not null 不是 null
like 模糊匹配; % 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符
逻辑运算符
运算符 说明
and 多个条件必须为 true , 结果才为true
or 任意一个条件为true 结果才为true
not 条件为true , 结果为false

  • WHERE条件可以使用表达式,但不能使用别名。
  • AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分

案例-- -

-- 查询图书价格低于50的图书作者和图书名称
mysql> select book_name,book_author from book where book_price < 50;
+----------------+-------------+
| book_name      | book_author |
+----------------+-------------+
| 计算机网络     | 谢希仁      |
| 计算机组成原理 | 王峰        |
+----------------+-------------+
2 rows in set (0.05 sec)  
-- 查询图书价格等于97的图书作者
mysql> select book_name ,book_author from book where book_price = 97;
+-----------+-------------+
| book_name | book_author |
+-----------+-------------+
| 微机原理  | 李华        |
+-----------+-------------+
1 row in set (0.00 sec)
-- 查询图书价格在50 - 100 之间的图书名称
mysql> select book_name from book where book_price between 50 and 100;
+------------+
| book_name  |
+------------+
| 微机原理   |
| 计算机网络 |
+------------+
2 rows in set (0.02 sec)\
-- 查询图书价格在此范围内的图书名称
mysql> select book_name from book where book_price in (12,45);
+----------------+
| book_name      |
+----------------+
| 计算机网络     |
| 计算机组成原理 |
+----------------+
2 rows in set (0.00 sec)

模糊查询

  • % 匹配任意多个(包括 0 个)字符
  • _ 匹配严格的一个字符
#查询姓张的作者的书本价格书名.
mysql> select book_price,book_name,book_author from book where book_author like '张%';

+------------+------------+-------------+
| book_price | book_name  | book_author |
+------------+------------+-------------+
|       NULL | 软件工程   | 张三        |
|      89.00 | 计算机网络 | 张华        |
+------------+------------+-------------+
2 rows in set (0.00 sec)
# 查询前缀为'计算机'后缀为七个字的书籍名称
mysql> select book_name from book where book_name like '计算机____';
+----------------+
| book_name      |
+----------------+
| 计算机组成原理 |
+----------------+
#查询前缀为'计算机'的书籍名称并去重
mysql> select distinct book_name from book where book_name like '计算机%';
+----------------+
| book_name      |
+----------------+
| 计算机网络     |
| 计算机组成原理 |
+----------------+
2 rows in set (0.00 sec)
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
SQL 运维 关系型数据库
MySQL 中 GRANT 操作会引起复制中断吗?
GRANT 操作并不是一个原子性操作,不管执行成功与否,都会触发一个隐式重载授权表的行为。 在生产环境中需要规范用户创建及授权的操作,不推荐使用 DML 语句去直接变更 mysql.user 表,可能会引发其他的问题,若使用了 DML 语句进行变更, 需要手工执行 flush privileges。
77 4
|
5月前
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
74 0
|
5月前
|
存储 关系型数据库 文件存储
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
54 2
|
5月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之从mysql读数据写到hive报错,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之运行mysql to doris pipeline时报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之整库同步mysql到starRock提交任务异常,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
SQL Java 数据库
MySQL设计规约问题之为什么应尽量避免使用子查询,而可以考虑将其优化为join操作
MySQL设计规约问题之为什么应尽量避免使用子查询,而可以考虑将其优化为join操作
|
5月前
|
存储 SQL 关系型数据库
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
|
5月前
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表
|
5月前
|
分布式计算 DataWorks 关系型数据库
MaxCompute操作报错合集之配置mysql数据源querysql模式,同步到MC时遇到报错,该怎么处理
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。