- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業務經營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯網協會理事單位
- 安全聯盟認證網站身份V標記
- 域名注冊服務機構許可:滇D3-20230001
- 代理域名注冊服務機構:新網數碼
如今數據庫管理成為了眾多領域不可或缺的關鍵技能。MySQL 作為一款廣受歡迎的開源數據庫管理系統,其操作的熟練掌握尤為重要。今天藍隊云將深入探討 MySQL 中關于數據表及數據處理的核心操作。
一、MySQL創建數據表(CREATE TABLE語句)
在創建數據庫之后,接下來就要在數據庫中創建數據表。所謂創建數據表,指的是在已經創建的數據庫中建立新表。
創建數據表的過程是規定數據列的屬性的過程,同時也是實施數據完整性(包括實體完整性、引用完整性和域完整性)約束的過程。
接下來我們介紹一下創建數據表的語法形式。
在 MySQL 中,可以使用 CREATE TABLE 語句創建表。其語法格式為:
CREATE TABLE <表名> ([表定義選項])[表選項][分區選項];
CREATETABLE命令語法比較多,其主要是由表創建定義(create-definition)、表選項(table-options)和分區選項(partition-options)所組成的。
mysql> USE test_db;
Database changed
mysql> CREATE TABLE tb_emp1
-> ( -> id INT(11),
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.37 sec)
語句執行后,便創建了一個名稱為 tb_emp1 的數據表,使用 SHOW TABLES;語句查看數據表是否創建成功,如下所示。
mysql> SHOW TABLES;
+--------------------+
| Tables_in_test_db |
+--------------------+
| tb_emp1 |
+--------------------+
1 rows in set (0.00 sec)
MySQL 使用 ALTER TABLE 語句修改表。常用的修改表的操作有修改表名、修改字段數據類型或字段名、增加和刪除字段、修改字段的排列位置、更改表的存儲引擎、刪除表的外鍵約束等。
使用 ALTER TABLE 修改表 tb_emp1 的結構,在表的第一列添加一個 int 類型的字段 col1,輸入的 SQL 語句和運行結果如下所示。
mysql> ALTER TABLE tb_emp1
-> ADD COLUMN col1 INT FIRST;
Query OK, 0 rows affected (0.94 sec)
在MySQL數據庫中,對于不再需要的數據表,我們可以將其從數據庫中刪除。在刪除表的同時,表的結構和表中所有的數據都會被刪除,因此在刪除數據表之前最好先備份,以免造成無法挽回的損失。
使用 DROP TABLE 語句可以刪除一個或多個數據表。刪除數據表 tb_emp1,輸入的 SQL 語句和運行結果如下所示。
mysql> DROP TABLE tb_emp1;
Query OK, 0 rows affected (0.22 sec)
二、MySQL INSERT:插入數據(添加數據)
數據庫與表創建成功以后,需要向數據庫的表中插入數據。在 MySQL 中可以使用 INSERT 語句向數據庫已有的表中插入一行或者多行元組數據。
INSERT 語句有兩種語法形式,分別是 INSERT…VALUES 語句和 INSERT…SET 語句。
-- INSERT VALUES 的語法格式為:INSERT INTO <表名> [ <列名1> [ , … <列名n>] ]
VALUES (值1) [… , (值n) ];
語法說明如下。
<表名>:指定被操作的表名。
<列名>:指定需要插入數據的列名。若向表中的所有列插入數據,則全部的列名均可以省略,直接采用 INSERT<表名>VALUES(…) 即可。
VALUES 或 VALUE 子句:該子句包含要插入的數據清單。數據清單中數據的順序要和列的順序相對應。
-- 語法格式為:INSERT INTO <表名>
SET <列名1> = <值1>,<列名2> = <值2>
在 tb_courses 表中插入一條新記錄,course_id 值為 1,course_name 值為“Network”,course_grade 值為 3,info 值為“Computer Network”。
mysql> INSERT INTO tb_courses
-> (course_id,course_name,course_grade,course_info)
-> VALUES(1,'Network',3,'Computer Network');
Query OK, 1 rows affected (0.08 sec)
三、MySQL DELETE:刪除數據
在 MySQL 中,可以使用 DELETE 語句來刪除表的一行或者多行數據。
使用 DELETE 語句從單個表中刪除數據,語法格式為:
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
語法說明如下:
<表名>:指定要刪除數據的表名。
ORDER BY 子句:可選項。表示刪除時,表中各行將按照子句中指定的順序進行刪除。
WHERE 子句:可選項。表示為刪除操作限定刪除條件,若省略該子句,則代表刪除該表中的所有行。
LIMIT 子句:可選項。用于告知服務器在控制命令被返回到客戶端前被刪除行的最大值。
注意:在不使用 WHERE 條件的時候,將刪除所有數據。
在 tb_courses_new 表中,刪除 course_id 為 4 的記錄,輸入的 SQL 語句和執行結果如下所示。
mysql> DELETE FROM tb_courses
-> WHERE course_id=4;
Query OK, 1 row affected (0.00 sec)
四、MySQL UPDATE:修改數據(更新數據)
在 MySQL 中,可以使用 UPDATE 語句來修改、更新一個或多個表的數據。
使用 UPDATE 語句修改單個表,語法格式為:
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]
[ORDER BY 子句] [LIMIT 子句]
語法說明如下:
<表名>:用于指定要更新的表名稱。
SET 子句:用于指定表中要修改的列名及其列值。其中,每個指定的列值可以是表達式,也可以是該列對應的默認值。如果指定的是默認值,可用關鍵字 DEFAULT 表示列值。
WHERE 子句:可選項。用于限定表中要修改的行。若不指定,則修改表中所有的行。
ORDER BY 子句:可選項。用于限定表中的行被修改的次序。
LIMIT 子句:可選項。用于限定被修改的行數。
注意:修改一行數據的多個列值時,SET 子句的每個值用逗號分開即可。
在 tb_courses_new 表中,更新所有行的 course_grade 字段值為 4,輸入的 SQL 語句和執行結果如下所示。
mysql> UPDATE tb_courses_new
-> SET course_grade=4;
Query OK, 3 rows affected (0.11 sec)
Rows matched: 4 Changed: 3 Warnings: 0
五、MySQL SELECT:數據表查詢語句
MySQL表單查詢是指從一張表的數據中查詢所需的數據,主要有查詢所有字段、查詢指定字段、查詢指定記錄、查詢空值、多條件的查詢、對查詢結果進行排序等。
從數據表中查詢數據的基本語句為 SELECT 語句,基本格式如下:
SELECT
{* | <字段列名>}
[
FROM <表 1>, <表 2>…
[WHERE <表達式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
]
查詢 tb_students_info 表中的所有數據,輸入的 SQL 語句和執行結果如下所示。
mysql> SELECT id,name,dept_id,age,sex,height,login_date
-> FROM tb_students_info;
以上,就是關于Mysql對于表創建和其增刪改查的基本操作,但是在實際工作中,其實大多數的操作都是在進行查詢,比如大家常聽的SQL boy、SQL gril等,主要工作就是寫SQL查詢語句進行數據提數和分析。
下面,我們重點對查詢,結合關鍵字和實際用途做一個更詳細的總結。
數據庫和表的查詢
--顯示所有數據庫:
SHOW DATABASES;
--顯示所有的表:
SHOW TABLES;
--查看表結構
DESC 表名;
-- 查看表的創建語句
SHOW CREATE TABLE 表名;
查詢表
--查詢表中的姓名和年齡SELECT 姓名,年齡 FROM 表名 ;
--查詢表中id乘50和姓名的結果
SELECT id*50,姓名 FROM 表名;
--給乘50的列名加個注釋:as "字符串",可以把as去掉也能顯示注釋名
SELECT id*50 as "乘50",姓名 FROM 表名;
查詢去重 DISTINCT
distinct:作用范圍是后面所有字段的組合(可以有多個字段)
-- 查詢時去除重復項(表名表中列名,內容去重)
SELECT DISTINCT 列名,列名 FROM 表名;
查詢排序 ORDER BY
SELECT DISTINCT 年齡,姓名 FROM 表名 ORDER BY 年齡;
--按年齡排序,展示年齡姓名兩列數據
SELECT DISTINCT 年齡,姓名 FROM 表名 ORDER BY 年齡,姓名;
--展示年齡和姓名的前提下,按年齡理相同,姓名不同的排序(默認從低到高)
SELECT DISTINCT 年齡,姓名 FROM 表名 ORDER BY 年齡,姓名 DESC;
--展示年齡和姓名的前提下,按年齡理相同,姓名不同的排序(DESC是倒敘)
SELECT DISTINCT 年齡,姓名 FROM 表名 ORDER BY 年齡,姓名 ASC;
--排列順序從低到高(默認)`(ASC是正序,默認就是正序,一般不用)`
查詢限定 WHERE(<= , >=) / LIKE
SELECT 年齡,姓名 FROM 表名 WHERE 年齡>20;
-- 查出所有年齡超過20歲的人
SELECT 年齡,姓名 FROM 表名 WHERE 年齡>20 AND 姓名="張三";
--查出某個國家所有年齡超過20且叫張三的人(注意:后邊是漢字的要加雙引號)
SELECT 年齡,姓名 FROM 表名 WHERE 年齡=21 OR 年齡=67;
--查出年齡為21或者67的人
模糊查詢 like:
--查詢表中叫王某的人有誰SELECT 姓名 FROM 表名 WHERE 姓名 LIKE "王%";
-- WHERE 子句中可以使用等號 = 來設定獲取數據的條件, country=中國’但是有時候我們需要獲取含有某個字符的所有記錄,這時我們就需要在 WHERE 子句中使用 LIKE 子句
SELECT 年齡,姓名 FROM 表名 WHERE age>20 AND 姓名 LIKE ‘王%';
SELECT 年齡,姓名 FROM 表名 WHERE age>20 AND 姓名 LIKE ‘%四';
-- SQL LIKE 子句中使用百分號 %字符來表示任意字符,如果沒有使用百分號 %, LIKE 子句與等號 = 的效果是一樣的
分頁查詢
在查詢時可以只檢索前幾條或者中間某幾行數據(數據量很大時)
SELECT * FROM t_user LIMIT 0,3;
--(從第一行開始,查詢3條數據)
limit 后面的第一個數字設置從哪里開始檢索(從0開始)
limit 后面的第二個數字是設置每頁顯示多少條(3,4代表從第四行查詢三條數據)
聚合函數
統計總數 count()
為了快速得到統計數據(多條數據的統計結果),提供了5個聚合函數
count():查詢表中某項數據一共包含多少條(統計總數)
--查詢表中共包含多少條數據(會檢索所有列)
SELECT COUNT(*) FROM 表名;
--查詢表中一共有多少個人且年齡大于20的(只會檢索一列)
SELECT COUNT(年齡) FROM renshi WHERE 年齡>20;
推薦使用第二種寫法,可以提高效率。
統計一般計算的值
--`max(列)`:求此列的最大值
SELECT MAX(age) FROM 表名 ;
--`min(列)`:求此列的最小值
SELECT MIN(age) FROM 表名 ;
--`sum(列)`:求此列的和
SELECT SUM(age) FROM 表名 ;
--`avg(列)`:求此列的平均值
SELECT AVG(age) FROM 表名 ;
--查出總人數、最大年齡、最小年齡、年齡的總和、平均年齡
SELECT COUNT(姓名),MAX(年齡),MIN(年齡),SUM(年齡),AVG(年齡) FROM 表名 ;
分組:group by
將表中數據分成若干小組,例如分為男人和女人,不同國籍等等。
-- 查看每個國家有多少人
SELECT COUNT(*) FROM 表名 GROUP BY 國家;
--(先根據group by查詢國家,再查詢有多少人)
--查看每個國家的平均年齡
SELECT AVG(年齡) FROM 表名 GROUP BY 國家;
--查看每個國家的總人數,年齡總和,平均年齡,最高年齡,最低年齡
SELECT country,COUNT(uname),SUM(age),AVG(age),MAX(age),MIN(age) FROM t_user GROUP BY country;--查看每個國家的總人數,年齡總和,平均年齡,最高年齡,最低年齡,但是排除某個國家
SELECT 國家,COUNT(姓名),SUM(age),AVG(age),MAX(age),MIN(age) FROM表名 WHERE country!='吳國' GROUP BY country;--列出每個國家小于20歲的人
SELECT 國家,名字 FROM 表名 WHERE age<20 GROUP BY 國家;
過濾:having
SELECT 列名 FROM 表名 WHERE 過濾條件。使用where,可以用來過濾單行,如果想要過濾分組之后的數據,要加having。
-- 顯示每個國家的平均年齡,但是僅顯示那些總年齡超過100的國家,having在聚合后對組記錄進行篩選
SELECT country,AVG(age) FROM 表名 GROUP BY country HAVING SUM(age)>100;
--注意順序:having放在分組之后,因為作用的對象不同。WHERE 子句作用于表和視圖,HAVING 子句作用于組
分組查詢和過濾:
having 和 where:
WHERE 在分組和聚合計算之前進行選取(它控制哪些行進入聚合計算),
因此,WHERE 子句不能包含聚合函數。
HAVING 在分組和聚合之后選取分組的行,而且HAVING 子句總是包含聚集函數。(嚴格來講,你可以寫不使用聚集的 HAVING 子句, 但同樣的條件用WHERE更有效)
綜上所述:
having要跟在group by(分組)之后,對分組查詢的結果進行過濾(過濾分組),where要出現在group by(分組)之前,執行表中所有數據來進行過濾(過濾行),另外,having可以用聚合函數,并支持所有where子句操作符。
where子句操作符:
<,>,=,!=,>=,<=,and,not,or,like
其中 <,>,=,!=,>=,<=屬于比較運算符,and,not,or屬于邏輯運算符。
--查詢年齡大于十歲小于三十的人名
SELECT 姓名 FROM 表名 WHERE 年齡>10 AND 年齡<30;
空值檢測:IS NULL
--返回id不為空的行,`IS NULL` 為空值判斷
SELECT * FROM 表名 WHERE id IS NOT NULL
子查詢
最后再說一個平時用的比較多的查詢語句,大家可以當作練習。
先建表:
CREATE TABLE stu( --先建立一個stu的表
stuID INT, --添加id為int類型
sname VARCHAR(32), --名字是varchar類型
score INT, --分數是int類型
PRIMARY KEY(stuID) --把id設置為主鍵
);
添加幾條數據:
INSERT INTO stu VALUES (1,‘xiaoming’,60), (2,‘xiaoli’,70);
如何查詢所有比小明成績高的學生名字,先查詢名字是xiaoming這個人的成績,然后,再根據stu表的其他人的分數去做對比:
SELECT sname FROM stu WHERE score > (SELECT score FROM stu WHERE sname = 'xiaoming');
查詢成績高于平均成績的學生姓名和成績:
SELECT sname,score FROM stu WHERE score > (SELECT AVG(score) FROM stu);
好了,以上就是本文的所以內容,SQL其實不難,接下來要多練習,熟能生巧。
想了解更多內容歡迎上藍隊云官網查詢,也可以直接咨詢專業客服。
提交成功!非常感謝您的反饋,我們會繼續努力做到更好!
這條文檔是否有幫助解決問題?
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP