第4章_1——SQL语句实现MySQL增删改查
SQL語句實現MySQL的增刪改查
文章目錄
- SQL語句實現MySQL的增刪改查
- 一、Select語句的語法格式及其功能
- 1、Select語句的一般格式
- 2、Select語句的功能
- 3、Select語句的說明
- 二、使用Select語句實現查詢
- 1、查詢時選擇與設置列
- (1)查詢所有字段和使用Limit關鍵字查詢限定數量的記錄
- (2)查詢指定字段、經過計算后的字段和查詢數據時使用別名(AS/as)
- (3)對于Order By的使用
- (4)查詢時數據的分組與匯總
- 2、查詢時選擇行
- (1)比較運算符
- (2)邏輯運算符
- (3)模糊匹配運算符
- (4)范圍運算符
- (5)空值比較運算符
- (6)子查詢比較運算符(重要)
- 3、查詢時結果不重復
- 4、使用聚合函數查詢
- 5、創建多表連接查詢
- (1)創建基本連接查詢
- (2)多表連接查詢
- (3)創建內連接查詢
- 1、等值連接查詢
- 2、非等值連接查詢
- 3、自然連接
- (4)創建外連接查詢
- 1、左外連接查詢
- 2、右外連接查詢
- 6、Union語句的使用
- 7、創建子查詢/嵌套查詢
- (1)單值嵌套查詢
- (2)使用In關鍵字創建子查詢
- (3)使用Exists關鍵字創建子查詢
- (4)使用Any關鍵字創建子查詢
- (5)使用All關鍵字創建子查詢
- (七)小結:
- 三、使用Delete語句實現刪除
- 四、使用Insert語句實現添加
- (1)插入一條記錄
- 1.1、不指定字段,按默認順序插入數值
- 1.2、指定字段名,按指定順序插入數值
- (2)插入多條記錄
- (3)插入查詢語句的執行結果
- 五、使用Update語句實現修改
- (1)修改單個數據
- (2)修改多個數據
- (3)使用Top表達式更新多行數據
- 六、總結
在學會了如何創建數據表之后,我們接下來所要學習的是如何通過SQL語句來對數據表進行操作(增刪改查等)。
注:本章節中所使用的表的創建語句為如下。(要先創建好數據庫book,之后便可復制直接用)
/*Navicat Premium Data TransferSource Server : demoSource Server Type : MySQLSource Server Version : 80029Source Host : localhost:3306Source Schema : bookTarget Server Type : MySQLTarget Server Version : 80029File Encoding : 65001Date: 27/07/2022 21:07:03 */SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for 借書證 -- ---------------------------- DROP TABLE IF EXISTS `借書證`; CREATE TABLE `借書證` (`借書證編號` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`借閱者編號` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`姓名` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`辦證日期` date NULL DEFAULT NULL,`讀者類型` char(2) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '(A、B、C分別表示不同的類型)',`借書證狀態` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '(T表示借書證可使用,F表示不可使用)',`證件類型` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '(證書類型分別為A1、A2、A3)',`證件編號` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`辦證操作員` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,PRIMARY KEY (`借書證編號`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;-- ---------------------------- -- Records of 借書證 -- ---------------------------- INSERT INTO `借書證` VALUES ('TP7040202201', '9787125201556', '小明', '2022-01-01', 'A', 'T', 'A1', '9312568', '系統管理員'); INSERT INTO `借書證` VALUES ('TP7040202202', '9787125201982', '小紅', '2022-02-08', 'A', 'F', 'A2', '9312569', '系統管理員'); INSERT INTO `借書證` VALUES ('TP7040202203', '9787125201832', '小凱', '2022-03-23', 'C', 'T', 'A3', '9312570', '系統管理員'); INSERT INTO `借書證` VALUES ('TP7040202204', '9787125201321', '李四', '2022-06-21', 'B', 'T', 'A1', '9312321', '系統管理員'); INSERT INTO `借書證` VALUES ('TP7040202205', '9787125202314', '王五', '2022-07-06', 'C', 'F', 'A1', '9312231', '系統管理員');-- ---------------------------- -- Table structure for 出版社2 -- ---------------------------- DROP TABLE IF EXISTS `出版社2`; CREATE TABLE `出版社2` (`出版社ID` int NOT NULL AUTO_INCREMENT,`出版社名稱` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`出版社簡稱` varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`出版社地址` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`郵政編碼` char(6) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,PRIMARY KEY (`出版社ID`) USING BTREE,UNIQUE INDEX `出版社名稱`(`出版社名稱`) USING BTREE,UNIQUE INDEX `出版社簡稱`(`出版社簡稱`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;-- ---------------------------- -- Records of 出版社2 -- ---------------------------- INSERT INTO `出版社2` VALUES (1, '高等教育出版社', '高等教育', '北京市450號', '100011'); INSERT INTO `出版社2` VALUES (2, '人民郵電出版社', '人郵', '北京市38號', '100061'); INSERT INTO `出版社2` VALUES (3, '清華大學出版社', '清華大學', '北京市1250號', '100084'); INSERT INTO `出版社2` VALUES (4, '電子工業出版社', '電子工業', '北京市150號', '100006'); INSERT INTO `出版社2` VALUES (5, '機械工業出版社', '機械工業 ', '北京市750號', '100008');-- ---------------------------- -- Table structure for 圖書信息2 -- ---------------------------- DROP TABLE IF EXISTS `圖書信息2`; CREATE TABLE `圖書信息2` (`ISBN編號` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`圖書名稱` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`作者` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`價格` decimal(10, 0) NOT NULL,`出版社ID` int NOT NULL,`出版日期` date NULL DEFAULT NULL,`圖書類型` varchar(2) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`封面圖片` blob NULL,`圖書簡介` text CHARACTER SET utf8 COLLATE utf8_bin NULL,PRIMARY KEY (`ISBN編號`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;-- ---------------------------- -- Records of 圖書信息2 -- ---------------------------- INSERT INTO `圖書信息2` VALUES ('9787121121201478', '軟件工程基礎', '陳承歡', 32, 4, '2014-07-01', '學習', NULL, ''); INSERT INTO `圖書信息2` VALUES ('9787121201693', '實用工具軟件', '陳麗麗', 31, 2, '2016-07-01', '工具', NULL, ''); INSERT INTO `圖書信息2` VALUES ('9787125201556', '數據庫基礎軟件實例教程', '劉國良', 18, 4, '2015-05-06', '教程', NULL, ''); INSERT INTO `圖書信息2` VALUES ('9787125201632', '網頁設計', '陳歡歡', 36, 2, '2016-09-08', '學習', NULL, ''); INSERT INTO `圖書信息2` VALUES ('9787125201735', 'web 前端基礎', '王青青', 26, 2, '2017-03-05', '學習', NULL, '');-- ---------------------------- -- Table structure for 圖書借閱 -- ---------------------------- DROP TABLE IF EXISTS `圖書借閱`; CREATE TABLE `圖書借閱` (`借閱ID` int NOT NULL AUTO_INCREMENT,`借書證編號` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`圖書編號` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`借出數量` smallint NOT NULL,`借出日期` date NOT NULL,`應還日期` date NOT NULL,`借閱操作員` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`歸還操作員` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`圖書狀態` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '(T表示已借閱,F表示未借閱)',PRIMARY KEY (`借閱ID`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;-- ---------------------------- -- Records of 圖書借閱 -- ---------------------------- INSERT INTO `圖書借閱` VALUES (1, 'TP7040202201', '9787121121201478', 1, '2022-02-01', '2022-03-01', '系統管理員', '系統管理員', 'T'); INSERT INTO `圖書借閱` VALUES (2, 'TP7040202205', '9787125201556', 1, '2022-05-04', '2022-07-01', '系統管理員', '系統管理員', 'T'); INSERT INTO `圖書借閱` VALUES (3, 'TP7040202203', '9787125201735', 1, '2022-02-09', '2022-07-25', '系統管理員', '系統管理員', 'T'); INSERT INTO `圖書借閱` VALUES (4, 'TP7040202201', '9787125201556', 1, '2022-07-07', '2022-07-31', '系統管理員', '系統管理員', 'T'); INSERT INTO `圖書借閱` VALUES (5, 'TP7040202204', '9787121201693', 1, '2022-06-09', '2022-07-22', '系統管理員', '系統管理員', 'T');-- ---------------------------- -- Table structure for 學生 -- ---------------------------- DROP TABLE IF EXISTS `學生`; CREATE TABLE `學生` (`學號` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`姓名` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`性別` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`班級名稱` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,PRIMARY KEY (`學號`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;-- ---------------------------- -- Records of 學生 -- ---------------------------- INSERT INTO `學生` VALUES ('A202220051', '小剛', '男', '22軟件一班'); INSERT INTO `學生` VALUES ('A202220052', '小于', '男', '22軟件二班'); INSERT INTO `學生` VALUES ('A202220053', '小紅', '女', '22軟件三班');-- ---------------------------- -- Table structure for 教師 -- ---------------------------- DROP TABLE IF EXISTS `教師`; CREATE TABLE `教師` (`職工編號` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`姓名` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`性別` char(1) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`部門名稱` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,PRIMARY KEY (`職工編號`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;-- ---------------------------- -- Records of 教師 -- ---------------------------- INSERT INTO `教師` VALUES ('JX9811', '徐老師', '男', '班主任'); INSERT INTO `教師` VALUES ('JX9812', '趙老師', '男', '體育部'); INSERT INTO `教師` VALUES ('JX9813', '王老師', '女', '藝術部');-- ---------------------------- -- Table structure for 藏書信息 -- ---------------------------- DROP TABLE IF EXISTS `藏書信息`; CREATE TABLE `藏書信息` (`圖書編號` char(12) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`ISBN編號` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`總藏書量` smallint NOT NULL,`剩余數量` smallint NOT NULL,`藏書位置` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`入庫時間` date NULL DEFAULT NULL ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = DYNAMIC;-- ---------------------------- -- Records of 藏書信息 -- ---------------------------- INSERT INTO `藏書信息` VALUES ('TP7040302363', '9787125201556', 30, 25, 'A-1-2', '2017-08-08'); INSERT INTO `藏書信息` VALUES ('TP7045241706', '9787125201632', 20, 20, 'A-1-1', '2017-09-09'); INSERT INTO `藏書信息` VALUES ('TP7040273144', '9787121121201478', 30, 30, 'A-1-1', '2015-06-10'); INSERT INTO `藏書信息` VALUES ('TP7040281286', '9787121201693', 20, 18, 'A-1-1', '2016-09-01'); INSERT INTO `藏書信息` VALUES ('TP1211025981', '9787125201735', 35, 30, 'A-1-2', '2017-12-11'); INSERT INTO `藏書信息` VALUES ('TP1156589325', '9781156589325', 32, 25, 'A-1-1', '2018-05-06'); INSERT INTO `藏書信息` VALUES ('TP1116589546', '9781116589546', 42, 42, 'A-1-3', '2018-04-09');-- ---------------------------- -- Table structure for 讀者類型 -- ---------------------------- DROP TABLE IF EXISTS `讀者類型`; CREATE TABLE `讀者類型` (`讀者類型編號` char(2) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`讀者類型名稱` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`限借數量` smallint NOT NULL,`限借期限` smallint NOT NULL,`續借次數` smallint NOT NULL,`借書證有效期` smallint NOT NULL,`超期日罰金` double NOT NULL,PRIMARY KEY (`讀者類型編號`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of 讀者類型 -- ---------------------------- INSERT INTO `讀者類型` VALUES ('01', '系統管理員', 30, 360, 5, 5, 1); INSERT INTO `讀者類型` VALUES ('02', '圖書管理員', 20, 180, 5, 5, 1); INSERT INTO `讀者類型` VALUES ('03', '特殊讀者', 30, 360, 5, 5, 1); INSERT INTO `讀者類型` VALUES ('04', '一般讀者', 20, 180, 3, 3, 1); INSERT INTO `讀者類型` VALUES ('05', '教師', 20, 180, 5, 5, 1); INSERT INTO `讀者類型` VALUES ('06', '學生', 10, 180, 2, 3, 0.5);SET FOREIGN_KEY_CHECKS = 1;一、Select語句的語法格式及其功能
1、Select語句的一般格式
? Select語句的一般格式如下:
Select <字段名或表達列表> From <數據表名或視圖名> Where <檢索條件表達式> Group By <分組的字段名或表達式> Having <篩選條件> Order By <排序的字段名或表達式> ASC(表升序)|DESC(表降序)2、Select語句的功能
??根據Where子句的檢索條件表達式,從From子句指定的數據表中找出滿足條件的記錄,再按Select子句選出記錄中的字段值,把查詢結果以表格的形式返回。
3、Select語句的說明
??Select關鍵字后面跟隨的是要檢索的字段列表,并且指定字段的順序。SQL查詢子句順序為Select、Into、From、Where、Group By、Having和Order By等。其中,Select子句和From子句是必需的,其余的子句都可以省略,而Having子句只能和Group By子句搭配起來使用。From子句返回初始結果集,Where子句排除不滿足搜索條件的行,Group By子句將選定的行進行分組,Having子句排除不滿足分組聚合后搜索條件的行。
??① From子句是Select語句所必需的子句,用于標識從中檢索數據的一個或多個數據表或試圖。
??② Where子句用于設定檢索條件以返回需要的記錄。(可以理解為Java中的if判斷語句)
??③ Group By子句用于將查詢結果按指定的一個字段或多個字段的值進行分組統計,分組字段或表達式的值相等的被分為同一組。
??④ Having子句與Group By子句配合使用,用于對由Group By子句分組的結果進一步限定搜索條件。,
??⑤ Order By子句用于將查詢結果按指定的字段進行排序。排序包括升序和降序,其中ASC表示記錄按升序排序,DESC表示記錄按降序排序,默認情況下,記錄按升序方式排列。
二、使用Select語句實現查詢
1、查詢時選擇與設置列
??Select語句使用通配符“ * ”選擇數據表中所有的字段,使用“All”選擇所有記錄,“All”一般省略不寫。Select關鍵字與第一個字段名之間使用半角空格分隔(可使用多個),其效果等效于一個空格。SQL語句中各部分之間必須使用空格分隔,SQL語句中的空格必須是半角空格,如果輸入全角空格,則會出現錯誤提示信息。
注意:
? SQL查詢語句中盡量避免使用 “ * ” 表示輸出所有的字段,其原因是使用 “ * ” 輸出所有的字段,不利于代碼的維護,該語句并沒有表明,哪些字段正在實際使用,這樣當數據庫的模式發生改變時,不容易只有已編寫的代碼將會怎樣改變。所以明確地指出要在查詢中使用的字段可以增加代碼的可讀性,并且代碼更易維護。當對表的結構不太清楚時,或要快速查看表中的記錄時,使用 “ * ” 表示輸出所有列是很方便的。
??使用Select語句查詢時,返回結果中的列標題與表或試圖中的列名相同。Select語句中Select關鍵字后面可以使用表達式作為檢索對象,表達式可以出現的檢索的字段列表的任何位置。如果是表達式是數學表達式,則顯示的結果是數學表達式的計算結果。
(1)查詢所有字段和使用Limit關鍵字查詢限定數量的記錄
查詢所有字段自然是不用解釋了!其是最簡單的SQL語句,如下所受:
select * from 數據表;對于Limit關鍵字,有兩種使用方式:
不指定初始位置:
當Limit關鍵字不指定初始位置時,記錄從第1條開始顯示,顯示記錄的數量由Limit關鍵字指定,其語法格式為:
Limit <記錄數量>指定初始位置:
Limit關鍵字可以指定從哪一條記錄開始顯示,并且可以指定顯示多少條記錄。其語法格式為:
Limit <初始位置> , <記錄數量>例如:查詢”出版社2“表中的數據
-- 一式 SELECT * FROM `出版社2`;-- 二式 SELECT * FROM `出版社2` LIMIT 3; -- 補充: -- LIMIT 子句可以被用于強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字參數。 -- 當只有一個參數的時候,表示的是總共取滿多少組數據 -- 同時在只有一個參數時,是按正常順序進行計算的,即第一個,第二個,...-- 三式 -- 當LIMIT子句后有兩個參數時,就代表的是從第幾個數據開始取,到第幾個數據結束取 -- 但對于只有一個參數時相比,有兩個參數時,它計數方式是和Java中的數組相同,亦是從0開始計數 SELECT * FROM `出版社2` LIMIT 1,2; -- 參數必須是一個整數常量。如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。結果一:
結果二:
結果三:
??以上中一式是查詢整張出版社2這張表;二式中的”LIMIT 3“指的是從下標0開始取滿3組數據;三式中的Limit有兩個參數,前一個參數表示的是從哪里開始查詢,第二個參數表示的是總共取多少組數據。
(2)查詢指定字段、經過計算后的字段和查詢數據時使用別名(AS/as)
???對于查詢,我們有時候并不需要得到全部的數據,只需要數據中的一部分而已,這個時候就要指定字段了。查詢時可以使用**“As”關鍵字來為查詢中的字段或表達式指定標題名稱,這些名稱既可以用來改善查詢輸出的外觀**,又可以用來為一般情況下沒有標題名稱的表達式分配名稱,稱為**“別名”**。使用As為字段或表達式分配標題名稱,只是改變輸出結果中的列標題的名稱,對該列顯示的內容沒有任何影響。使用As為字段和表達式分配標題名稱相對于實際的列名,是可以再被其他的SQL語句使用的。
例如:查詢“圖書信息2“表中圖書名稱、作者和出版日期。
-- 一式 SELECT 圖書名稱,作者,出版日期 FROM `圖書信息2`;-- 二式 SELECT ISBN編號 AS ISBN,圖書名稱 AS bookName,出版社ID AS publishingHouse FROM `圖書信息2`;結果一:
結果二:
(3)對于Order By的使用
??對于Order By的使用,其實就只要記住ASC(表升序)或DESC(表降序)這兩個即可。
格式為:Order By 表中的某個字段 ASC或DESC
SELECT * FROM `出版社2` ORDER BY `出版社ID` DESC; -- 這是查詢出版社2表中的所有數據,輸出的結果是按“出版社ID”倒序的順序輸出的。 -- 如果將DESC改成ASC時,那么輸出的結果將是按“出版社ID”正序的順序輸出的。(4)查詢時數據的分組與匯總
???一般情況下,使用統計函數返回的是所有行數據的統計結果,如果需要按某一列數據值進行分類,在分類的基礎上再進行查詢,就要使用Group By子句。如果要對分組或聚合指定查詢條件,則可以使用Having,該子句用于限定對統計組的查詢,一般與Group By子句一起使用,對分組數據進行過濾。
-- 一式 -- 使用GROUP BY進行分組(對于其中的聚合函數后面會解釋) SELECT 出版社ID,AVG(價格) AS 平均定價,COUNT(*) AS 圖書種類 FROM `圖書信息2` GROUP BY `出版社ID`; -- 以出版社ID進行分組-- 二式 -- 不使用GROUP BY SELECT 出版社ID,AVG(價格) AS 平均定價,COUNT(*) AS 圖書種類 FROM `圖書信息2`; -- 根據以上兩個查詢的結果可以得出:GROUP BY的用法-- 三式 SELECT 出版社ID,AVG(價格) AS 平均定價,COUNT(*) AS 圖書種類 FROM `圖書信息2` GROUP BY `出版社ID` HAVING AVG(價格) > 20 AND COUNT(*) > 1 ORDER BY 平均定價 DESC; -- 對于這個查詢的理解:先以出版社ID進行分組,然后再通過Having匯總限定。結果一:
結果二:
結果三:
知識點補充:
- Group By子句可以和Where子句結合在一起使用,但必須保證Where子句必須在Group By之前。(其實這很好理解,只有先篩選出滿足條件的,才能進行下一步的分組);
- Having只能用在Group By之后,對分組后的結果進行篩選(即使用Having的前提條件是分組);
- Where是對記錄的限定,Having是對分組后的限定;
- Where子句后的條件表達式里不能使用聚合函數,而Having可以(也就是說,當使用到聚合函數時,就必須要使用到Group By)。
2、查詢時選擇行
Where子句的描述
??Where子句后面是一個邏輯表達式表示的條件,用來限制Select語句檢索的記錄,即查詢結果中的記錄都應該是滿足該條件的記錄。使用Where子句并不會影響所要檢索的字段,Select語句要檢索的字段由Select關鍵字后面的字段列表決定。數據表中所有的字段都可以出現在Where子句的表達式中,不管它是否出現在檢索的字段列表中。
Where子句后面的邏輯表達式中可以使用以下各種運算符。
(1)比較運算符
??對于這種運算符的使用,不必做過多的解釋。特別記住:當比較運算符連接的數據類型不是數字時,要用單引號把比較運算符后面的數據引起來,并且兩邊運算符兩邊表達式的數據類型必須保持一致。(=、<>、!=、<、>、<=、>=、<=>等)
SELECT 出版社ID,出版社名稱 FROM `出版社2` WHERE `出版社ID`>=3; -- 這里查詢的結果為: -- 輸出“出版社ID”大于等于3的“出版社ID”、“出版社名稱”這倆列的數據。這里補充一個知識點:關于+號的。
在Java中,“+”號有兩種用法:第一種是做運算符的,用來去計算數值類型的;第二種是做拼接的,用來拼接字符串的。而在MySQL中,“+”號只有一種用法,那就是做運算符。當出現字符串時,會試圖將字符串類型轉換成數值類型。如果轉換成功,則繼續做加法運算,就比如:select “123” + 90,得到的結果是“213”;如果沒有轉換成功,則會將字符串類型轉換成0,就比如:select “name” + 90,得到的就是90。還有當出現null時,則其結果肯定為null,如:select null + 90這種情況。
(2)邏輯運算符
???邏輯與And表示多個條件都為真時才返回結果,邏輯或Or表示多個條件中有一個條件為真就返回結果,邏輯非Not表示當表達式不成立時才返回結果。(And或&&、Or或||、Not或!、Xor)
SELECT ISBN編號,圖書名稱,價格,出版日期 FROM `圖書信息2` WHERE `價格` >= 30 AND YEAR(`出版日期`)>=2014; -- 輸出的結果為:價格大于等于30的并且出版日期大于等于2014(3)模糊匹配運算符
??在Where子句中,使用字符匹配符Like或Not Like可以把表達式與字符串進行比較,從而實現模糊查詢。所謂模糊查詢就是查找數據表中與用戶輸入關鍵字相近或相似的記錄信息,模糊匹配通常與通配符一起使用,使用通配符時必須將字符串和通配符都用單引號引起來。MySQL提供了如下所示的模糊匹配的通配符。
| % | 表示0~n個任意字符 | ‘XY%’:匹配以XY開始的任意字符串。‘%X’:匹配以X結束的任意字符。‘X%Y’:匹配包含XY的任意字符串。 |
| _ | 表示單個任意字符 | ‘_X’:匹配以X結束的2個字符的字符串。 |
由以上的代碼可以得出:模糊匹配運算符一般用于查詢以某個姓氏開頭的或者年份等。
(4)范圍運算符
??Where子句可以使用范圍運算符指定查詢范圍,當要查詢的條件是某個值的范圍時,可以使用Between關鍵字。
??在Where子句中,使用In關鍵字可以方便地限制檢查數據的范圍。使用In關鍵字可以確實表達式的取值是否屬于某一值列表,當與值表中的任一匹配時,即返回true,否則返回false。同樣,如果查詢表達式不屬于某一值列表時可使用Not In關鍵字。(Between、Not Between、In、Not In)
SELECT ISBN編號,圖書名稱,價格,出版社ID FROM `圖書信息2` WHERE 價格 BETWEEN 20 AND 36; -- 表示的是取在[20,36]范圍內的數據SELECT ISBN編號,圖書名稱,價格,出版社ID FROM `圖書信息2` WHERE 價格 IN(26,31,35,40); -- 表示的是取符合括號內的(5)空值比較運算符
??空值比較運算符一共只有兩個,分別是Is Null和Is Not Null。這兩個運算符的意思很簡單,分別是判斷這一列是空的數據;判斷這一列不是空的數據。
SELECT ISBN編號,圖書名稱,價格,出版社ID FROM `圖書信息2` WHERE 圖書簡介 IS NOT NULL; -- 表示的是尋找到在圖書簡介這一列中不是空的數據(6)子查詢比較運算符(重要)
(All、Any、Some)這些將在之后會學習。
3、查詢時結果不重復
??當我們查詢數據時,有時候查詢到的數據中有重復的,但是我們并不需要重復的,那么該怎么辦?這個時候就要使用到一個關鍵字Distinct了,它可以實現去重。這個要牢牢記住!
-- 一式 -- 就比如上圖中的圖書信息2表,我們查詢該表中的出版社ID: SELECT 出版社ID FROM `圖書信息2`; -- 這樣得到的是有重復的數據。-- 二式 -- 我們可以使用Distinct關鍵字,它可以將重復的值清除掉。 SELECT DISTINCT 出版社ID FROM `圖書信息2`; -- 這樣即可。結果對比如下所示:
4、使用聚合函數查詢
??聚合函數對一組數據值進行計算并返回單一值,所以也被稱為組合函數。Select子句中可以使用聚合函數進行計算,計算結果作為新列出現在查詢結果集中。在聚合運算的表達式中,可以包括字段名、常量以及運算符連接起來的函數。以下便是常用的聚合函數:
| Count(*) | 統計數據表中的總記錄數 |
| Avg | 計算各個字段值的平均值 |
| Max | 計算表達式的最大值 |
| Count | 統計滿足條件的記錄數 |
| Sum | 計算所有字段值的總和 |
| Min | 計算表達式的最小值 |
??在使用聚合函數時,Count、Sum、Avg可以使用Distinct關鍵字,以保證計算時不包含重復的行。
注意:在Where子句中不能使用聚合函數。
-- 一式 Select Count(*) As 圖書種類 From 圖書信息2 Where 價格 Between 20 And 45;-- 二式 Select SUM(總藏書量) As 藏書總數量 From 藏書信息;5、創建多表連接查詢
??之前,我們所學的查詢都只是基于單表查詢。現在,我們將要學習多表連接查詢。
??實現從兩個或兩個以上數據表中查詢數據且結果集中出現的字段來自于兩個或兩個以上的數據表的檢索操作稱為連接查詢。連接查詢實際上是通過各個數據表之間的共同字段的相關性來查詢數據的,首先要在這些數據表中建立連接,然后從數據表中查詢數據。
??連接的類型分為內連接、外連接和交叉連接。其中,外連接包括左外連接、右外連接和全外連接3種。
? 連接查詢的格式有以下兩種。
格式一:
Select<輸出字段或表達式列表> From<表1>,<表2> [Where<表1.列名> <連接操作符> <表2.列名>]連接操作符可以是=、<>、!=、>、<、<=、>=,當操作符是“=”時表示等值連接。
格式二:
Select <輸出字段或表達式列表> From <表1> <連接類型> <表2> [On(<連接條件>)]??連接類型用于指定所執行的連接類型,內連接為Inner Join,外連接為Out Join,交叉連接為Cross Join,左外連接為Left Join,右外連接為Right Join,完整外連接為Full join。(交叉連接又稱為笛卡爾積,返回的結果集的行數等于第1個數據表的行數乘以第2個數據表的行數。交叉連接只用于測試一個數據庫的執行效率,一般情況下很少用)
??在<輸出字段或表達式列表>中使用多個數據表來源且有同名字段時,就必須明確定義字段所在的數據表名稱。
(1)創建基本連接查詢
??所謂的基本連接查詢其實就是Select語句的字段名或表達式列表中引用多個數據表的字段,其From子句中用半角逗號","將多個數據表的名稱隔開。使用基本連接操作時,一般使用主表中的主鍵字段與從表中的外鍵字段保持一致,以保持數據的參照完整性。
-- 使用基本連接查詢ISBN編號,圖書名稱,價格,出版社名稱,出版日期,出版社地址 -- 由于這些字段在各自表都是 SELECT ISBN編號,圖書名稱,價格,出版社名稱,出版日期,出版社地址 -- 來自以下兩張表 FROM `圖書信息2`,`出版社2` -- 通過兩表中共同有的字段出版社ID進行連接(也就是根據圖書信息2的出版社ID去出版社2中查找到出版社名稱) WHERE `圖書信息2`.`出版社ID` = `出版社2`.`出版社ID`;(2)多表連接查詢
??在多個數據表之間創建連接查詢與在兩個數據表之間創建連接查詢相似,只是在Where子句中需要使用到And關鍵字來連接兩個連接條件。這個一般都是用在三表以上的連接。
-- 查詢圖書編號,ISBN編號,圖書名稱,出版社名稱,總藏書量 SELECT 圖書編號,`藏書信息`.`ISBN編號`,圖書名稱,出版社名稱,總藏書量 FROM `藏書信息`, `圖書信息2`, `出版社2` WHERE `藏書信息`.`ISBN編號` = `圖書信息2`.`ISBN編號` AND `圖書信息2`.`出版社ID` = `出版社2`.`出版社ID`;創建多表連接,要找出中間連接,也就是找出即能連接前一個表,也能連接后一個表。
(3)創建內連接查詢
??內連接是組合兩個表的常用方法。內連接使用比較運算符進行多個源表之間數據的比較,并返回這些源表中與連接條件相匹配的數據行。一般使用Join或者Inner Join關鍵字實現內連接。內連接執行連接查詢后,要從查詢結果中刪除在其他表中沒有匹配行的所有記錄,所以使用內連接可能不會顯示數據表的所有記錄。
??內連接可以分為等值連接、非等值連接和自然連接。
1、等值連接查詢
在連接條件中使用**“=”**比較運算符的連接操作稱為等值連接。
-- 題目:查詢“借書證”和“圖書借閱”中的姓名,借書證編號,圖書編號,借出數量 SELECT 姓名, `圖書借閱`.借書證編號, 圖書編號, 借出數量 FROM `借書證` Inner Join 圖書借閱 On `借書證`.`借書證編號` = `圖書借閱`.`借書證編號`;2、非等值連接查詢
在連接條件中使用其他運算符(包括<、>、<=、>=、<>、Between等)的內連接稱為非等值連接。
-- 這是使用內連接的非等值連接 -- 題目:查詢“圖書信息2”和“藏書信息”中出版日期在2014年1-1到2016年9-9(包括入庫時間),并且價格在30元以上的“學習”類型的圖書信息(包括總藏書量) -- 查詢出它們的ISBN編號,圖書名稱,作者,價格,出版日期、圖書類型、總藏書量和入庫時間 SELECT `圖書信息2`.`ISBN編號`, 圖書名稱, 作者, 價格, 出版日期, 圖書類型, 總藏書量, 入庫時間 FROM `圖書信息2` INNER JOIN `藏書信息` ON `圖書信息2`.`ISBN編號` = `藏書信息`.`ISBN編號` AND 出版日期 BETWEEN "2014-1-1" AND "2016-9-9" AND 入庫時間 BETWEEN "2012-1-1" AND "2017-9-9" AND 價格 >= 30 AND 總藏書量 >= 20 AND 圖書類型 = "學習";3、自然連接
當等值連接中的連接字段相同,并且在Select語句中去除了重復字段時,該連接操作稱為自然連接。自然連接不需要連接條件。
SELECT 姓名,圖書編號,借出數量 FROM `借書證` NATURAL JOIN 圖書借閱;(4)創建外連接查詢
??在內連接中,只有在兩個數據表中匹配的記錄才能在結果集中出現。而在外連接中可以只限制一個數據表,而對另一個數據表不加限制(即所有的行都出現在結果集中)。參與外連接查詢的數據表有主從表之分,主表的每行數據去匹配從表中的數據行,如果符號連接條件,則直接返回到查詢結果中。如果主表中的行在從表中沒有找到匹配的行,那么主表的行仍然保留,相應的,從表中的行被填入Null值并返回到查詢結果中。
??外連接分為左外連接、右外連接和全外連接。只包括左表的所有行、不包括右表的不匹配行的外連接稱為左外連接;只包括右表的所有行,不包括左表的不匹配行的外連接稱為右外連接;既包括左表不匹配的行,又不包括右表不匹配的行的連接稱為全外連接。
1、左外連接查詢
??在左外連接查詢中左表就是主表,右表就是從表。左外連接返回關鍵字Left Join左邊的表中所有的行,但是這些行必須符合查詢條件。如果左表的某些數據行沒有在右表中找到相對應的匹配數據行,則結果集中右表的對應位置填入Null。
-- 創建左外連接查詢 -- 從“藏書信息”和“圖書信息”兩表中查詢圖書編號,圖書名稱,作者,價格 SELECT 圖書編號,圖書名稱,作者,價格 FROM `藏書信息` LEFT JOIN `圖書信息2` ON `藏書信息`.`ISBN編號` = `圖書信息2`.`ISBN編號`; -- 對于結果,由于有兩個圖書編號于圖書信息2表中是沒有的,所以需要在相應的位置填入null2、右外連接查詢
??在右外連接查詢中右表就是主表,左表就是從表。右外連接返回關鍵字Right Join右邊的表中所有的行,但是這些行必須符合查詢條件。如果右表的某些數據行沒有在左表中找到相對應的匹配數據行,則結果集中左表的對應位置填入Null。
-- 創建右外連接查詢 -- 從“圖書信息2”和“出版社2”兩表中查詢ISBN編號,圖書名稱,出版社名稱,出版社地址,出版日期 SELECT ISBN編號,圖書名稱,出版社名稱,出版社地址,出版日期 FROM `圖書信息2` RIGHT JOIN `出版社2` ON `圖書信息2`.`出版社ID` = `出版社2`.`出版社ID`;6、Union語句的使用
??我們可以通過使用Union語句來創建多表聯合查詢。
??聯合查詢指將多個不同的查詢結果連接在一起組成一組數據的查詢方式。聯合查詢使用Union關鍵字連接各個Select子句,聯合查詢不同于對兩個數據表中的字段進行連接查詢,而是組合兩個數據表中的行。使用Union關鍵字進行聯合查詢時,應保證聯合的數據表中具有相同數量的字段,并且對應的字段應具有相同的數據類型,或者可以自動將其轉換為相同的數據類型。在自動轉換數據類型時,對于數值類型,系統將低精度的數據類型轉換為高精度的數據類型。
-- 使用聯合查詢將兩個數據表的數據合并(教師數據在前,學生數據在后),聯合查詢時增加1個新列“借閱者類型”,其值分別為“教師”和“學生”,查詢結果中“職工編號”和“學號”對應的字段名修改為“借閱者編號” Select 職工編號 As 借閱者編號, 姓名, 性別, 部門名稱, '教師' As 借閱者類型 From 教師 Union All Select 學號, 姓名, 性別, 班級名稱, '學生' From 學生;??使用Union運算符將兩個或多個Select語句的結果組合成一個結果集時,可以使用關鍵字“All”,指定結果集中將包含所有行而不刪除重復的行。如果省略All,則將從結果集中刪除重復的行。使用Union聯合查詢時,結果集的字段名與Union運算符中第1個Select語句的結果集中的字段名相同,另一個Select語句的結果集的字段名將被忽略。
7、創建子查詢/嵌套查詢
??在SQL語句中,將一條Select語句作為另一條Select語句的一部分,這稱為嵌套查詢,也可以稱為子查詢。外層的Select語句稱為外部查詢,內層的Select語句稱為內部查詢。其實,所謂的嵌套查詢就是一種比較特殊的表連接查詢。
注意:
嵌套查詢是按照邏輯順序由里向外執行的,即先處理內部查詢,然后將結果作為外部查詢的查詢條件(這與Java和JavaScript的嵌套是不同的,它們是從外向里執行的,也就是從上到下一層一層的執行)。SQL允許使用多層嵌套查詢,即在子查詢中還可以嵌套其他子查詢。
(1)單值嵌套查詢
單值嵌套就是通過子查詢返回一個單一的數據值。當子查詢返回的結果是單個值時,可以使用比較運算符參加相關表達式的運算。
-- 以下是單值子查詢的實例 -- 題目:查詢圖書“軟件工程基礎”的出版社ID和出版社名稱 SELECT 出版社ID,出版社名稱 FROM `出版社2` WHERE `出版社ID` = (SELECT `出版社ID`FROM `圖書信息2`WHERE 圖書名稱 = "軟件工程基礎" );??對以上進行分析:我們要查詢的出版社ID和出版社名稱都在出版社2這張表中,而查詢的條件卻在圖書信息2這張表中。我們可以將兩張表連接一起后進行查詢,但是沒有那個必要。因為我們所需要的數據都只在一張表中,所以我們使用子查詢。
【問題】:什么時候用子查詢?
當所要查詢的數據在一張表,而查詢的條件在另一種表時,就可以使用子查詢。**注:**處于外層查詢的是目標表,而處于內層查詢的是條件表。
(2)使用In關鍵字創建子查詢
??子查詢的返回結果是多個值的嵌套查詢稱為多值嵌套查詢。多值嵌套查詢經常使用In操作符,In操作符可以測試表達式的值是否與子查詢返回結果集中的某一個值相等,如果列值與子查詢的結果一致或存在與其匹配的數據行,則查詢結果集中就包含該數據行。
-- 以下是多值嵌套查詢的實例 -- 查詢作者“陳承歡”,“劉國良”,“王青青”的ISBN編號,圖書名稱,價格,出版社名稱,出版社簡稱,出版社ID SELECT 出版社名稱,出版社簡稱,出版社ID FROM `出版社2` WHERE `出版社ID` IN(SELECT `出版社ID`FROM `圖書信息2`WHERE 作者 IN('陳承歡','劉國良','王青青') );(3)使用Exists關鍵字創建子查詢
??使用“Exists”關鍵字創建子查詢時,內層查詢語句不返回查詢的記錄,而是返回一個邏輯值。如果內層查詢語句查詢到滿足條件的記錄,就返回一個邏輯真(true),否則返回一個邏輯假(false)。當內層查詢返回的值為true時,外層查詢可繼續進行查詢,返回符號條件的記錄;反之,若符合是發false,則將不再進行查詢。
??“Exists”關鍵字還可以與Not結合使用,即“Not Exists”,其返回值與“Exists”正好相反。(其實這和Java中的布爾類型是很相似的)
-- 使用Exists關鍵字創建子查詢 -- 查詢借書證的全部數據 SELECT * FROM `借書證` WHERE EXISTS(SELECT *FROM 圖書借閱WHERE `借書證`.`借書證編號` = 圖書借閱.`借書證編號` );-- 使用Not Exists關鍵字創建子查詢 -- 查詢借書證的全部數據 SELECT * FROM `借書證` WHERE NOT EXISTS(SELECT *FROM 圖書借閱WHERE `借書證`.`借書證編號` = 圖書借閱.`借書證編號` );-- 以上的結果分別是:前一個是得到全部數據,后一個則是得到空結果一:
結果二:
(4)使用Any關鍵字創建子查詢
??Any與Some關鍵字是同義詞,表示滿足其中任一條件。使用Any關鍵字時,表達式只要與子查詢結果集中的某個值滿足比較的關系時,就返回true,否則返回false。只有內層查詢語句返回結果中的任何一個滿足比較關系,就可以通過該條件來執行外層查詢語句。Any關鍵字通常與比較運算符一起使用,如“>Any”表示大于任何一個值,“=Any”表示等于任何一個值。
-- 首先是對Any關鍵字的使用 -- 查詢圖書信息2表中價格不低于出版社ID為4的數據 SELECT ISBN編號,圖書名稱,價格 FROM `圖書信息2` WHERE 價格 >ANY(SELECT `價格`FROM `圖書信息2`WHERE `出版社ID` = 2 );SELECT ISBN編號,圖書名稱,價格 FROM `圖書信息2` WHERE 價格 >(SELECT MIN(價格)FROM `圖書信息2`WHERE `出版社ID` = 2 );以上最終得到的結果是相同的。由此我們可以推演出:使用Any關鍵字時,若是大于,則表示只要大于最小的那個即可;若是小于,則表示只要小于最大那個即可。這就是Any關鍵字的用法和理解。
(5)使用All關鍵字創建子查詢
??All關鍵字表示滿足所有條件,使用All關鍵字時,只有滿足內層查詢語句返回的所有結果,才可以執行外層查詢語句。All關鍵字經常與比較運算符一起使用,如“>All”表示大于所有值,“<All”表示小于所有值。
??All關鍵字與Any關鍵字的使用方式相同,但二者有很大的區別。使用Any關鍵字時,只要滿足內層查詢返回結果中的任何一個,就可通過該條件來執行外層查詢語句。而All關鍵字正好相反,只有滿足內層查詢語句返回的所有查詢結果,才可以執行外層查詢語句。
-- 查詢圖書信息2表中價格高于出版社ID為4的數據——ISBN編號,圖書名稱,價格 SELECT ISBN編號,圖書名稱,價格 FROM `圖書信息2` WHERE 價格 >ALL(SELECT `價格`FROM `圖書信息2`WHERE `出版社ID` = 4 );SELECT ISBN編號,圖書名稱,價格 FROM `圖書信息2` WHERE 價格 >(SELECT MAX(`價格`)FROM `圖書信息2`WHERE `出版社ID` = 4 );以上最終得到的結果是相同的。由此我們可以推演出:使用All關鍵字時,若是大于,則表示只要大于最大的那個即可;若是小于,則表示只要小于最小那個即可。這就是All關鍵字的用法和理解。
(七)小結:
??這一部分的重點自然是學會如何去查詢表中的數據。首先要記住的是查詢中Select和From語句是必不可少的,這是不能省略的,其他都可以不寫(非必要);第二:就是要熟練的使用SQL語句去實現查詢;第三:知道如何使用Distinct、Limit等關鍵字,還要掌握聚合函數的用法(千萬要記住使用聚合函數的時候,是不能使用Where子句的);第四:學會進行多表連接查詢,這是本章的核心之一;第五:學會創建子查詢。
三、使用Delete語句實現刪除
刪除數據表中記錄的語法格式如下:
Delete From <表明> [Where<條件表達式>];
??Delete語句中如果沒有Where子句,則表示無條件,會將數據表中的所有記錄都刪除。如果包含Where子句,則只會刪除符合條件的記錄,其他記錄不會被刪除。
DELETE FROM `出版社2` WHERE 出版社ID IN (1,2); -- 刪除出版社2中出版社ID分別為1和2的數據四、使用Insert語句實現添加
??插入數據即向數據表中寫入新的記錄(數據表的一行數據錯誤一條記錄)。相比于刪除,插入的要求就比較嚴格了。插入的新記錄必須完全遵守數據的完整性約束,所謂完整性約束指的是:新記錄的中的數據類型、約束條件都必須與字段相同。若不滿足任何一條,都可能導致插入記錄不成功。
??在MySQL中,我們可以通過“Insert”語句來實現插入數據的功能。“Insert”語句有兩種方式插入數據:插入特定的值,即所有的值都是在“Insert”語句中明確規定的;插入某查詢的結果,結果指的是插入到數據表中的是那些值,“Insert”語句本身看不出來,完全由查詢結果確定。
向數據表插入記錄時需要注意的幾點:
- 插入字符型(Char和Varchar)和日期時間型(Date等)數值時,必須在值前后加半角單引號,只有數值型(Int、Float等)的值前后可不加單引號;
- 對于Date類型的數值,插入時,必須使用“YYYY-MM-DD”的格式,且日期數據必須用半角單引號引起來;
- 若某字段不允許為空,且無默認值約束,則表示向數據表插入一條記錄時,該字段必須寫入值,默認插入不成功。若某字段不允許為空,但它有默認值約束,則插入記錄時自動使用默認值代替;
- 若某字段設置為主鍵約束,則插入記錄時不允許出現重復數值。
(1)插入一條記錄
插入一條完整的記錄可以理解為向數據表的所有字段插入數據,一般有以下兩種方法可實現。
1.1、不指定字段,按默認順序插入數值
在MySQL中,按默認的數值順序插入數據的語法格式如下:
Insert Into <表名> Values(<值1>, <值2>, ... , <值n>);這個方法需要注意的是:若某字段的值允許為空,且插入的記錄該字段的值也為空或不確定,則必須在Values后面的對應位置寫上Null。
??這個方法插入記錄只指定數據表名,不指定具體的字段,按字段的默認順序填寫數據,然后插入記錄,可以實現一次插入一條完整的記錄,但不能實現插入一條不完整的記錄。
1.2、指定字段名,按指定順序插入數值
在MySQL中,按指定的順序插入數值的語法格式如下:
Insert Into <表名> (<字段1>, <字段2>, ... , <字段n>) Values(<值1>, <值2>, ... , <值n>);**注意:**該方法的Insert語句中的數據順序與字段順序的必須完全一致,但字段的排列順序與數據表的字段排列順序可以不一致。
??這種方法既可以實現插入一條完整記錄,也可以實現插入一條不完整的記錄。如果部分字段的值為空,在插入語句中可以不寫出字段名及Null。
-- 插入一條記錄 -- 向“讀者類型”表中插入記錄 -- 這是使用第一種插入的方法 -- INSERT INTO `讀者類型` -- VALUES('07','校外人員',30,180,2,2,2);-- 這是使用第二種插入的方法 INSERT INTO `讀者類型`(讀者類型編號,讀者類型名稱,限借數量,限借期限,續借次數,超期日罰金,借書證有效期) VALUES('07','校外人員',30,180,2,2,2);(2)插入多條記錄
在MySQL中,一次插入多條記錄的語法格式如下:
Insert Into <表名> (<字段1>, <字段2>, ... , <字段n>) Values(<值11>, <值12>, ... , <值1n>), (<值21>, <值22>, ... , <值2n>), ...... (<值m1>, <值m2>, ... , <值mn>);??這種方法將所插入的多條記錄的數據按相同的順序寫到Values后面,每一條記錄對應值使用半角括號“()”括起來,且使用半角逗號“,”分隔。注意:一條Inset語句只能配一個Values關鍵字,如果要寫多條記錄,則只需要在取值列表(即小括號中的數據)后面再跟另一條記錄的取值列表即可。
-- 插入的第二種形式 -- 一次插入多條完整記錄INSERT INTO `讀者類型`(讀者類型編號,讀者類型名稱,限借數量,限借期限,續借次數,超期日罰金,借書證有效期) VALUES('07','校外人員',30,180,2,2,2), ('08','工作人員',30,180,3,5,3), ('09','小孩子',30,250,5,5,0.5);注意:對于自動編號的標識列的值不能使用Insert語句插入數據。
(3)插入查詢語句的執行結果
將查詢語句的執行結果數據插入到數據表中的語法格式如下:
Insert Into <表名> [<字段列表>] <Select語句>;??這種方法必須合理地設置查詢語句的結果字段順序,并保證查詢的結果值和數據表的字段相匹配,否則會導致插入數據不成功。
-- 先創建好數據表圖書_total Create Table 圖書_total(出版社 varchar(50), 數量 smallint, 金額 float);-- 插入的第三種形式——插入查詢語句 -- 將一個數據表中的數據添加到另一個數據表中 INSERT INTO 圖書_total SELECT `出版社2`.出版社名稱,SUM(`藏書信息`.總藏書量),SUM(`藏書信息`.總藏書量 * `圖書信息2`.價格) FROM `藏書信息`,`圖書信息2`,`出版社2` WHERE `藏書信息`.ISBN編號 = `圖書信息2`.ISBN編號 AND `圖書信息2`.出版社ID = `出版社2`.出版社ID GROUP BY `出版社2`.出版社名稱;五、使用Update語句實現修改
??數據表中已經存在的數據也可能需要修改,此時,我們可以只修改某個字段的值,而不用再去管其他數據。修改數據的操作可以看做把數據表先從行的方向上篩選出那些要修改的記錄,然后將篩選出來的記錄的某些字段的值進行修改。
修改數據用“Update”語句實現。其語法格式如下:
Update <表名> Set <字段名1> = <值1>, <字段名2> = <值2>, ... , <字段名n> = <值n> Where<條件表達式>;對于修改也是可以細分的。修改也是很簡單。
(1)修改單個數據
-- 首先添加數據,為后面的修改提高數據 -- INSERT INTO `出版社2` VALUES('10','上海交通大學出版社','上海交大','上海市1038號','102091','7-132'), -- ('11','西安電子科技大學出版社','西安電子','西安市2000號','110077','7-152'); -- INSERT INTO `圖書信息2` VALUES('9787121201478','Java設計語言','劉威',10,2,'2017-02-28','學習',NULL,NULL);-- 修改單個數據 -- 修改圖書信息2表中的ISBN編號為9787121201478的價格 UPDATE `圖書信息2` SET 價格 = 20 WHERE `ISBN編號` = '9787121201478';(2)修改多個數據
-- 修改多個數據 UPDATE `圖書信息2` SET 價格 = 30,`出版社ID` = 1,`圖書簡介` = '好書' WHERE `ISBN編號` = '9787121201478';(3)使用Top表達式更新多行數據
-- 使用Top表達式更新多行數據 UPDATE `藏書信息` SET `藏書位置` = 'A-1-2' LIMIT 5;六、總結
??對于MySQL中的SQL語句實現增刪改查的這些知識,主要難點在于數據表的查詢。對于簡單的單表查詢是沒有什么問題的,難就難在當遇到多個表的情況要去查找,這個時候就需要依靠對多表聯查的熟練才能完成。而對于刪除、修改和插入,它們沒有太多的變化,所以難,特別是刪除,就一個語法。最后,對于這些,靠的就是練。
總結
以上是生活随笔為你收集整理的第4章_1——SQL语句实现MySQL增删改查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机删除默认共享怎样操作,清除wind
- 下一篇: 互联网泡沫2.0