mysql--對行(表中數據)的增刪改查


一.插入數據(增加)insert

1.插入數據(順序插入)

語法一:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); #指定字段來插入數據,插入的值要和你前面的字段相匹配

語法二:
    INSERT INTO 表名 VALUES (值1,值2,值3…值n); #不指定字段的話,就按照默認的幾個字段來插入數據

2.指定字段插入數據

語法:
    INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);

3.插入多條記錄

語法:#插入多條記錄用逗號來分隔
    INSERT INTO 表名 VALUES
        (值1,值2,值3…值n),
        (值1,值2,值3…值n),
        (值1,值2,值3…值n);

4.插入查詢結果

語法:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) 
                    SELECT (字段1,字段2,字段3…字段n) FROM 表2
                    WHERE …; #將從表2里面查詢出來的結果來插入到我們的表中,但是注意查詢出來的數據要和我們前面指定的字段要對應好

  

二.更新(修改)數據update

語法:
    UPDATE 表名 SET 
            字段1=值1,  #注意語法,可以同時來修改多個值,用逗號分隔
            字段2=值2,
            WHERE CONDITION; #更改哪些數據,通過where條件來定位到符合條件的數據


示例:
    UPDATE mysql.user SET password=password(‘123’) 
                where user=’root’ and host=’localhost’; #這句話是對myslq這個庫中的user表中的user字段為'root'並且host字段為'localhost'的這條記錄的password字段的數據進行修改,將passord字段的那個數據改為password('123')這個方法對123加工后的密碼數據,password()這個方法是mysql提供的密碼進行加密用的方法。
        定位到某個記錄,並把這個記錄中的某項內容更改掉    

三.刪除數據delete,truncate

  在MySQL中有兩種方法可以刪除數據,一種是DELETE語句,另一種是TRUNCATE TABLE語句。DELETE語句可以通過WHERE

對要刪除的記錄進行選擇。而使用TRUNCATE TABLE將刪除表中的所有記錄。因此,DELETE語句更靈活。

1.delete

語法:
    DELETE FROM 表名 WHERE CONITION; #刪除符合條件的一些記錄

    DELETE FROM 表名;如果不加where條件,意思是將表里面所有的內容都刪掉,但是清空所有的內容,一般我們用truncate ,能夠將id置為零,delete不能將id置零,再插入數據的時候,會按照之前的數據記錄的id數繼續遞增

示例:
    DELETE FROM mysql.user WHERE password=’123’;

2.truncate

TRUNCATE TABLE  表名   # truncate table tb1;

 

delete 和truncate 的區別

  效率方面:drop > truncate > delete

  1、delete語句,是DML語句不會自動提交,truncate語句通常被認為是DDL語句能被自動提交。

  2、delete語句,后面可以跟where子句,通常指定where子句中的條件表達式,只刪除滿足條件的部分記錄,而truncate語句,只

能用於刪除表中的所有記錄。

  3、truncate語句,刪除表中的數據后,向表中添加記錄時,自動增加字段的默認初始值重新從1開始,而使用delete語句,刪除表

中所有記錄后,向表中添加記錄時,自動增加字段的值,為刪除時該字段的最大值加1,也就是在原來的基礎上遞增。

  4、delete語句,每刪除一條記錄,都會在日志中記錄,而使用truncate語句,不會在日志中記錄刪除的內容,因此,truncate語句的

執行效率比delete語句高。

  5.truncate刪除表中的所有行數據,但表結構不變.新行的計數值會歸零,(比如在約束了auto_increment時)如果想保留delete

四.查詢數據 select (單表查詢)

 

 

1.單表查詢的語法,關鍵字

  查詢數據的本質:

      mysql會到你本地的硬盤上找到對應的文件,然后打開文件,按照你的查詢條件來找出你需要的數據。下面是完整的一個單表查詢的語法

select * from,這個select * 指的是要查詢所有字段的數據。

SELECT distinct 字段1,字段2... FROM 庫名.表名          #from后面是說從庫的某個表中去找數據,mysql會去找到這個庫對應的文件夾下去找到你表名對應的那個數據文件,找不到就直接報錯了,找到了就繼續后面的操作

                  WHERE 條件       #從表中找符合條件的數據記錄,where后面跟的是你的查詢條件

                  GROUP BY field(字段)   #分組

                  HAVING 篩選      #過濾,過濾之后執行select后面的字段篩選,就是說我要確定一下需要哪個字段的數據,你查詢的字段數據進行去重,然后在進行下面的操作

                  ORDER BY field(字段)   #將結果按照后面的字段進行排序

                  LIMIT 限制條數    #將最后的結果加一個限制條數,就是說我要過濾或者說限制查詢出來的數據記錄的條數        

 

2. 關鍵字執行的優先級

From			1.找到表:from
Where			2.拿着where指定的約束條件,去文件/表中取出一條條記錄
group by		3.將取出的一條條記錄進行分組group by,如果沒有group by,則整體作為一組
having			4.將分組的結果進行having過濾
select			5.執行select
distinct		6.去重
order by		7.將結果按條件排序:order by
limit			8.限制結果的顯示條數
SELECT DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>
關鍵字的定義順序
(7)     SELECT 
(8)     DISTINCT <select_list>
(1)     FROM <left_table>
(3)     <join_type> JOIN <right_table>
(2)     ON <join_condition>
(4)     WHERE <where_condition>
(5)     GROUP BY <group_by_list>
(6)     HAVING <having_condition>
(9)     ORDER BY <order_by_condition>
(10)    LIMIT <limit_number>
關鍵字的執行順序

 

3.查詢操作

  •   簡單查詢:
# 查詢
select 值 from 表名;
select * from 表名;  # 查詢表中所有數據
  •   避免重復:
#避免重復
select distinct  字段名 from 表名;  # 去重復 distinct要寫在所有查詢字段的前面

distinct:將查詢的結果進行去重

  有時需要查詢出某個字段不重復的記錄,這時可以使用mysql提供的distinct這個關鍵字來過濾重復的記錄,但是實際中我們往往用distinct來返回不重復字段的條數(count(distinct id)),其原因是distinct只能返回他的目標字段,而無法返回其他字段,distinct 想寫在其他字段后面需要配合聚合函數來寫。

mysql> select id,count(distinct post) from employee;

ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

報錯了:是因為distinct不能返回其他的字段,只能返回目標字段

mysql> select count(distinct post) from employee;

+----------------------+
| count(distinct post) |
+----------------------+
|                    4 |
+----------------------+
1 row in set (0.00 sec)

  

 

  • 四則運算查詢:
#四則運算查詢
select name,age * 12 from tb1;
  • 自定義顯示格式concat():
select concat('游客編號:',customer_id,'編號:',order_id) from table2;

 

  

select concat('游客編號:',customer_id,'編號:',order_id) as 自定義顯示字段 from table2;

結果如下:

 

 

4.where約束

where語句中可以使用:

  1. 比較運算符:> < >= <= <> !=

  2. between 80 and 100 值在80到100之間

  3. in(80,90,100)  值是80或90或100

  4.    like '王%'

      可以是%或_

      %表示任意多字符

      _表示一個字符

  5. 邏輯運算符:在多個條件直接可以使用邏輯運算符 and or not

  

 

5.分組查詢group by

  1.分組發生在where之后,即分組是基於where之后得到的記錄而進行的

  2.分組指的是:將所有記錄按照某個相同字段進行歸類,比如針對員工信息表的職位分組,或者按照性別進行分組等 

  

  ONLY_FULL_GROUP_BY

  這是mysql中對於group by的一種設置模式,對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么這個SQL是不合法的,因為列不在GROUP BY從句中

  所以對於設置了這個模式的時候,使用group by 時,要在group by 后加入所查詢的字段.

  比如: select name from table1 group by id,name  根據性別分組要查詢名字時要加上 name 

  不過,如果我們用設置了unique約束的字段作為分組的依據,則每一條記錄自成一組,這種分組沒有意義多條記錄之間的某個字段值相同,該字段通常用來作為分組的依據

#查看MySQL 5.7默認的sql_mode如下:
mysql> select @@global.sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

#!!! 注意 !!!
ONLY_FULL_GROUP_BY的語義就是確定select target list中的所有列的值都是明確語義,簡單的說來,在ONLY_FULL_GROUP_BY模式下,
target list中的值要么是來自於聚集函數的結果,要么是來自於group by list中的表達式的值。


#設置sql_mole如下操作(我們可以去掉ONLY_FULL_GROUP_BY模式):
mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

  

  

 6.HAVING過濾

  加在 group by 后面

  having 與 where 的不同:

    having的語法格式和where是一模一樣的,只不過having是在分組之后進行的進一步的過濾,where不能使用聚合函數,having是可以使用聚合函數的

    !!!執行優先級從高到低:where > group by > having 
    
    1. Where 發生在分組group by之前,因而Where中可以有任意字段,但是絕對不能使用聚合函數。

    2. Having發生在分組group by之后,因而Having中可以使用分組的字段,無法直接取到其他字段,having是可以使用聚合函數

  

 

7.查詢排序:ORDER BY

    按單列排序

    SELECT * FROM employee ORDER BY salary;             #默認是升序排列

    SELECT * FROM employee ORDER BY salary ASC;      #升序

    SELECT * FROM employee ORDER BY salary DESC;    #降序

 

 

8.限制查詢的記錄數:LIMIT

 

示例:
 #取出工資表中工資最高的前三位

    SELECT * FROM employee ORDER BY salary DESC    LIMIT 3;                    
    #默認初始位置為0,從第一條開始順序取出三條 
    
    SELECT * FROM employee ORDER BY salary DESC    LIMIT 0,5; 
    #從第0開始,即先查詢出第一條,然后包含這一條在內往后查5條 

    SELECT * FROM employee ORDER BY salary DESC    LIMIT 5,5; 
    #從第5開始,即先查詢出第6條,然后包含這一條在內往后查5條   

  數據表中數據量很大的時候,可以用limit來進行分頁顯示

select * from  employee limit 0,5;  # 顯示第0項開始的5行數據

  

9.使用正則表達式查詢

正則表達式是通用的

 

#之前我們用like做模糊匹配,只有%和_,局限性比較強,所以我們說一個正則

SELECT * FROM employee WHERE name REGEXP '^wwe';  # 以wwe開頭的字符串

SELECT * FROM employee WHERE name REGEXP 'on$';   # 以on結尾的字符串

SELECT * FROM employee WHERE name REGEXP 'm{2}';  #  m出現兩次

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM