首頁  >  文章  >  資料庫  >  一文詳解MySQL表的CURD操作

一文詳解MySQL表的CURD操作

青灯夜游
青灯夜游轉載
2023-02-15 15:32:381502瀏覽

這篇文章帶大家詳細了解MySQL表的CURD操作,希望對大家有幫助!

一、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  表名;
  • #範例:


##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)

  • 插入資料後的表如圖所示:
在MySQL當中, 多筆記錄逐次插入的效率是要低於一次把多條紀錄一起插入的,原因如下:

網路請求和回應時間開銷, 每次插入都會有一定的時間開銷.
  • 資料庫伺服器是把資料保存在硬碟上的, IO操作時,操作的次數帶來的影響大於資料量.
  • 每一次sql操作,內部開啟的交易也會佔據一定的開銷.
- 查詢(select語句)
全列查詢
語法

select * from 表名

--  * 表示通配符, 可以匹配表中的所有列.

企業級的資料庫中慎用, 容易把I/O或網路頻寬吃滿,如果有外邊的使用者客戶端要透過寬頻存取伺服器時,伺服器就無法做出正確的回應.

範例

select * from book;

#指定列查詢
    ##
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
        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 &#39;张%&#39;;
        
        +------------+------------+-------------+
        | book_price | book_name  | book_author |
        +------------+------------+-------------+
        |       NULL | 软件工程   | 张三        |
        |      89.00 | 计算机网络 | 张华        |
        +------------+------------+-------------+
        2 rows in set (0.00 sec)
        # 查询前缀为&#39;计算机&#39;后缀为七个字的书籍名称
        mysql> select book_name from book where book_name like &#39;计算机____&#39;;
        +----------------+
        | book_name      |
        +----------------+
        | 计算机组成原理 |
        +----------------+
        #查询前缀为&#39;计算机&#39;的书籍名称并去重
        mysql> select distinct book_name from book where book_name like &#39;计算机%&#39;;
        +----------------+
        | book_name      |
        +----------------+
        | 计算机网络     |
        | 计算机组成原理 |
        +----------------+
        2 rows in set (0.00 sec)
        • 分页查询

        分页查询即将查询出的结果 , 按页进行呈现,并不是一次性展现出来,这种模式就是分页查询, mysql当中使用limit来实现分页查询.

        • limit 子句当中接受一个或者两个参数 , 这两个参数的值为0 或者正整数

        两个参数的limit子句的用法

        select 元素1,元素2  from 表名  limit offset,count;
        
        #offset参数指定要返回的第一行的偏移量。第一行的偏移量为0,而不是1。
        #count指定要返回的最大行数。

        示例:

        mysql> select book_author from book limit 2, 3;
        +-------------+
        | book_author |
        +-------------+
        | 李华        |
        | 张三        |
        | 张华        |
        +-------------+
        3 rows in set (0.02 sec)
        
        #表示获取列表当中偏移量为2(表示从第3行开始), 最大行数为3的作者名称

        带有一个参数的limit子句的用法

        select 列名1.列名2 from 表名 limit count;
        #  表示从结果集的开头返回的最大行数为count;
        #  获取前count行的记录

        等同于

        select 列名1 ,列名2 from 表名 limit 0 , count;# 第一行的偏移量为0

        示例

        mysql> select book_price from book limit 5;
        +------------+
        | book_price |
        +------------+
        |      45.00 |
        |      45.00 |
        |      97.00 |
        |       NULL |
        |      89.00 |
        +------------+
        5 rows in set (0.00 sec)
        
        # 获取表中前五行的图书价格 , 最大行数为5
        • limit 结合 order by 语句 和其他条件可以获取n个最大或者最小值

          select book_name,book_price from book order by book_price desc limit 3; 
          #获取价格前三高的图书名称和图书价格
          mysql> select book_price,book_name from book order by book_price desc limit 3;
          +------------+------------+
          | book_price | book_name  |
          +------------+------------+
          |      97.00 | 微机原理   |
          |      89.00 | 计算机网络 |
          |      45.00 | 计算机网络 |
          +------------+------------+
          3 rows in set (0.01 sec)
        • 使用limit 获取第n高个最大值

        偏移量从0开始,所以要指定从n - 1 开始,然后取一行记录

        #示例:获取价格第二高的图书名称
         mysql> select book_name from book order by book_price desc limit 1,1;
        +------------+
        | book_name  |
        +------------+
        | 计算机网络 |
        +------------+
        1 row in set (0.00 sec)
        - 修改(update)

        MySQL当中使用update关键字来对数据进行修改 , 既可以修改单列又可以修改多列.

        update 表名 set 列名1 = 值 , 列名2 = 值 ... where 限制条件下修改
        • SET子句指定要修改的列和新值。要更新多个列,请使用以逗号分隔的列表。以字面值,表达式或子查询的形式在每列的赋值中来提供要设置的值。
        • 第三,使用WHERE子句中的条件指定要更新的行。WHERE子句是可选的。 如果省略WHERE子句,则UPDATE语句将更新表中的所有行。

        示例:

        #将书名为&#39;软件工程&#39;的图书价格修改为66元
        mysql> update book set book_price = 66 where book_name = &#39;软件工程&#39;;
        Query OK, 1 row affected (0.05 sec)
        Rows matched: 1  Changed: 1  Warnings: 0
        
        mysql> select book_price from book where book_name = &#39;软件工程&#39;;
        +------------
        | book_price |
        +------------+
        |      66.00 |
        +------------+
        1 row in set (0.00 sec)
        
        #将所有的图书价格修改为原来的二倍
        mysql> update book set book_price = 2 * book_price;
        Query OK, 5 rows affected (0.02 sec)
        Rows matched: 5  Changed: 5  Warnings: 0
        #更新成功
        mysql> select book_price from book;
        +------------+
        | book_price |
        +------------+
        |      90.00 |
        |      90.00 |
        |     194.00 |
        |     132.00 |
        |     178.00 |
        +------------+
        5 rows in set (0.00 sec)
        - 删除(delete)

        要从表中删除数据,需要使用delete 语句, delete 语句的 用法如下

        delete from 表名 where + 条件

        首先指定需要删除数据的表,其次使用条件指定where子句中删除的行记录, 如果行匹配条件,这些行记录将会删除.

        WHERE子句是可选的。如果省略WHERE子句,DELETE语句将删除表中的所有行 , 请注意,一旦删除数据,它就会永远消失。因此,在执行DELETE语句之前,应该先备份数据库,以防万一要找回删除过的数据。

        示例

        #删除图书表中图书单价大于150的图书记录
        mysql> delete from book where book_price > 150;
        Query OK, 2 rows affected (0.01 sec)
        
        mysql> select book_price from book;
        +------------+
        | book_price |
        +------------+
        |      90.00 |
        |      90.00 |
        |     132.00 |
        +------------+
        3 rows in set (0.00 sec)

        MySQL中delete 语句也可以结合limit语句 和 order by 语句来控制删除的数量和条件

        【相关推荐:mysql视频教程

        以上是一文詳解MySQL表的CURD操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

      • 陳述:
        本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除