MySQL 數據庫中的基礎操作
3、表的修改
對表的表名、字段、字段類型、字段長度、約束等進行修改。
3.1 表的名稱修改
-- 語法:
ALTER TABLE 庫名.表名
RENAME TO 新表名;
-- 將foods表的名字修改為空food
ALTER TABLE test.`foods`
RENAME TO food;
3.2 修改表的字段或者約束(修改表結構)
3.2.1 為表添加/刪除主鍵約束
-- 語法:
ALTER TABLE 庫名.表名
ADD PRIMARY KEY(字段名);
-- 為表aa中的字段salary 添加主鍵約束 ALTER TABLE test.`aa` ADD PRIMARY KEY(salary); DESC test.`aa`; -- 查看添加主鍵約束結果
-- 語法:
ALTER TABLE 庫名.表名
DROP PRIMARY KEY;
-- 刪除sales表的主鍵customer_no約束 ALTER TABLE test.`sales`
DROP PRIMARY KEY; -- 刪除主鍵約束
3.2.2 為表添加非空約束
-- 語法:
ALTER TABLE 庫名.表名
MODIFY 字段名 數據類型(數據長度) NOT NULL;
-- 修改sales表約束,使客戶名稱customer_name不允許為空 ALTER TABLE test.`sales` MODIFY customer_name INT(10) NOT NULL;
3.2.3 修改表中某個字段的名稱
-- 語法:
ALTER TABLE 庫名.表名
CHANGE 原字段名 新字段名 字段類型(數據長度);
-- 修改表sales,將字段`product_name`名稱修改為pct_name ALTER TABLE test.`sales` CHANGE product_name pct_name VARCHAR(30);
3.2.4修改表中某個字段的數據類型
-- 語法:
ALTER TABLE 庫名.表名
MODIFY [COLUMN] `字段名` 新數據類型(新數據長度);
-- 修改sales表中字段`pct_name`的字段類型為char(20) ALTER TABLE test.`sales` MODIFY pct_name CHAR(20); -- 修改數據庫長度
3.2.5添加字段
-- 語法:
ALTER TABLE 庫名.表名
ADD [COLUMN] `字段名` 數據類型(數據長度);
ALTER TABLE test.`sales` ADD COLUMN product_name VARCHAR(30);
3.2.6刪除表中指定的字段
-- 語法:
ALTER TABLE 庫名.表名
DROP COLUMN 字段名;
-- 刪除表sales中的字段pct_name (面試題) ALTER TABLE test.`sales` DROP COLUMN pct_name;
3.2.7將表中指定字段設置為外鍵
-- 語法:
ALTER TABLE 庫名.表名
ADD CONSTRAINT 外鍵約束名稱 FOREIGN KEY(本表設置為外鍵字段的名稱)
REFERENCES 庫名.`被引用字段的表名稱`(被引用字段的名稱);
-- 為test庫中表student的字段classno添加外鍵約束, -- 該外鍵字段的數據引用自表sclass的主鍵字段cno ALTER TABLE test.`student` ADD CONSTRAINT student_classno_fk FOREIGN KEY(classno) REFERENCES test.`sclass`(cno);
3.2.8刪除表中指定字段的外鍵約束
步驟一:刪除外鍵約束
-- 語法
ALTER TABLE 庫名.表名
DROP FOREIGN KEY 外鍵約束名稱;
步驟二:刪除外鍵索引
DROP INDEX 索引名稱 ON 庫名.表名;
-- 刪除test庫student表的字段classno的外鍵約束student_classno_fk -- 步驟一 刪除約束 ALTER TABLE test.`student` DROP FOREIGN KEY student_classno_fk; -- 步驟二 刪除索引 DROP INDEX student_classno_fk ON test.`student`;
3.2.9修改指定表的表名
-- 語法
RENAME TABLE 庫名.舊表名 TO 新表名;
-- 將test庫class表的名稱修改為classb RENAME TABLE test.`class` TO classb;
4、 表結構的刪除(就是刪除表)
-- 語法:
DROP TABLE 庫名.表名;
--刪除classb表 DROP TABLE test.`classb`;
表中數據的操作
1、往表中插入數據
-- 語法
INSERT INTO 庫名.表名(字段名1,字段名2)
VALUES(字段值1,字段值2);
-- 往表zhaosheng3種插入一條數據,學號為3,姓名為鄭爽,班號為1, zsbh字段的值為4 -- 方法一、 INSERT INTO test.`zhaosheng3` VALUES(3,"鄭爽",1,4); -- 方法二、 INSERT INTO test.`zhaosheng4`(xuehao,xingming,banhao,zsbh) VALUES(4,"鄭爽1",2,5);
-- 往表temp種插入100數據,數據來源於employees表 INSERT INTO hrdb.`temp` SELECT employee_id,first_name,salary FROM hrdb.`employees` LIMIT 100; -- limit 限制,limit 100,取前100條數據 -- select子句的字段數量、數據類型需要和insert子句中的對應
2、修改表中的數據
語法:
UPDATE 庫名.表名
SET 字段名1=新字段值1
WHERE 字段名2=字段值2;
2.1 修改單字段數據
-- 修改student數據庫表score中的數據,修改編號為1的記錄的姓名為孫琦
UPDATE student.`score` SET NAME="孫琦" WHERE id=1;
2.2 修改多字段數據
-- 修改student數據庫score 表中數據,修改姓名為李四的記錄,將語文成績修改為81,英語成績修改為90
UPDATE student.`score` SET chinese=81,english=90 WHERE NAME="李四";
2.3 修改多條記錄的數據
-- 修改student數據庫score 表中數據,修改語文成績大於80的記錄,將語文成績修改為100 UPDATE student.`score` SET chinese=100 WHERE chinese>80;
3.刪除表中的數據
3.1刪行
-- 方法一:
-- 語法:
DELETE FROM 庫名.表名 WHERE 字段名1=字段值1;(刪除指定數據)
-- 重點說明:刪除表中數據時,如果不加where默認刪除表中所有數據(清空表)
-- 重點說明:使用delete刪除表中數據時,delete后不能跟*號,delete不能和*號搭配使用。
-- 刪除student庫score表中english成績為84 DELETE FROM student.`score` WHERE english=84;
3.2刪全表
清空score表中所有記錄 方法一 DELETE FROM student.`score`; 方法二 TRUNCATE student.`score`; TRUNCATE school.`test`;
-- TRUNCATE 刪除的意思,使用truncate刪除的數據,無法恢復,
-- truncate不能和from、where配合使用
4、查詢表中的數據(重中之重)
4.1 查詢單個表中的數據
4.1.1結構化查詢語言-SQL語言
結構化查詢語言(Structured QUERY Language或簡稱為SQL),即SQL語言,是一種應用
最為廣泛的關系數據庫語言,該語言定義了操作關系數據庫的標准語法,幾乎所有的關系
數據庫管理系統都支持SQL語言。【關系型數據庫:mysql、oracle、SQL server、DB2、
sybase】
SQL語言分類:
下面的五大分類要能講出來
- DDL(Data Definition Language)(數據定義語言) - Create、Alter、Drop
- DQL(Data QueryLanguage)(數據查詢語言) - SELECT 查詢語句
- DML(Data Manipulation Language)(數據操縱語言) - Insert、Update、Delete
- DTL(Data Transaction Language)(事務控制語言) - COMMIT(提交)、Rollback(回滾) 事務提交與回滾語句
- DCL(Data Control Language)(數據控制語言) - GRANT(授權)、Revoke(回收權限) 授予權限與回收權限語句
Select語句語法如下:
(1)SELECT 字段列表
(2)FROM 數據表
(3)where條件
(4)GROUP BY 分組字段
(5)having條件
(6)ORDER BY 排序字段 ASC | DESC
(7)LIMIT START,LENGTH;
【划重點】:select語句中,各子句出現的順序不能亂,否則報錯
-- 邏輯運算符:not 非,and 和,or 或
-- not 表達式:取表達式計算結果相反的數據
4.1.2普通查詢
-- 查詢員工表(employees)中所有人員的所有信息 SELECT * FROM hrdb.`employees`;
-- 查詢員工表中員工編號為101的員工的員工編號、工資 SELECT employee_id,salary FROM hrdb.`employees` WHERE employee_id=101;
4.1.3關鍵字in在查詢語句中的用法
說明:當查詢條件給出的為多個類似的值時,可以使用關鍵字IN,不同值之間使用逗
號隔開,
-- 語法
-- in(值1,值2...)
-- 查詢工資分別為9000、10000、18000的員工編號、工資 SELECT employee_id,salary FROM hrdb.`employees` WHERE salary IN(9000,10000,18000);
4.1.4關鍵字between...and...的用法
說明:between...and...意思是在...和...之間
-- between 值1 and 值2,意思是在值1和值2之間
-- 查詢工資在3000-6000之間的人員的工資、員工編號、職位編號
SELECT salary,employee_id,job_id FROM hrdb.`employees` WHERE salary BETWEEN 3000 AND 6000; -- 查詢結果包括邊界3000和6000
4.1.5 null關鍵字在查詢語句中的用法
-- 說明:null為空、不確定的意思
-- 說明:
-- is null代表為空的意思, is not null為非空的意思
-- 判斷某個字段值為空,不能使用=null
-- 查詢部門表中經理編號為空的部門的編號、部門名稱、經理編號
SELECT department_id,department_name,manager_id FROM hrdb.`departments` WHERE manager_id IS NULL;
4.1.6聚合函數的用法
-- 說明:聚合函數即分組函數,主要包括:求最大值max()函數、最小值min()函數、
-- 平均值avg()函數、求和sum()函數
-- 統計條數count()函數。
-- 查詢員工表中的最高工資、最低工資、平均工資、工資總和 SELECT MAX(salary) AS 最高工資,MIN(salary) AS 最低工資, AVG(salary) AS 平均工資,SUM(salary) AS 工資之和 FROM hrdb.`employees`; -- as后為別名,as 是單詞alias單詞的簡寫,別名的意思 -- as 可以省略
4.1.7計數
-- 查詢員工表中的所有人員的工資之和以及人員的數量 方法一 SELECT SUM(salary),COUNT(employee_id) FROM hrdb.`employees`; 方法二 SELECT SUM(salary),COUNT(*) FROM hrdb.`employees`;-- *號代表所有記錄 方法三 SELECT SUM(salary),COUNT(1) FROM hrdb.`employees`;-- *號代表所有記錄
-- 在部門表中,統計部門表中部門的數量 SELECT COUNT(*) FROM hrdb.`departments`; SELECT COUNT(manager_id) FROM hrdb.`departments`;
-- 總結:
-- 使用count()函數統計表中記錄的數量時:
-- 使用*作為count()函數進行統計時,結果包含所有記錄
-- 使用單個字段作為count()函數的參數進行統計時,結果不統計字段值為null 的記錄。
4.1.8 分組查詢關鍵字group by用法
-- 說明:
-- group by 字段名/聚合函數, 意思是先通過給定的【字段名/聚合函數】先進行分組,
-- 再對分組后的數據進行分別處理【求和、求平均值、統計數量等】。
-- 查詢時,什么時候需要對數據進行分組?
-- 一般查詢問題為“每個...”,“各...”的時候,需要對數據進行分組
-- 查詢員工表中每個部門人員的平均工資,查詢結果顯示部門編號、平均工資 SELECT department_id,AVG(salary) FROM hrdb.`employees` GROUP BY department_id; -- 先對employees表的數據進行分組,再對每個組中的數據求平均值
4.1.9 使用group by關鍵字進行多字段分組
-- 查詢不同部門中,不同職位的人員的平均工資,查詢結果顯示部門編號、職位編號、平均工資 SELECT department_id,job_id,AVG(salary) FROM hrdb.`employees` GROUP BY department_id,job_id;
4.1.10對group by分組后的結果數據使用having關鍵字進行過濾
-- 說明:having關鍵字,可以對分組后的數據進行過濾,類似於where的作用,但又不同於where.
-- having 后的過濾條件,可以跟字段,也可以跟聚合函數。
-- 查詢員工表中不同部門人員的平均工資,查詢結果要求只顯示平均工資高於12000的部門編號、平均工資 SELECT department_id,AVG(salary) FROM hrdb.`employees` GROUP BY department_id HAVING AVG(salary) >12000;
4.1.11 對查詢結果使用order by關鍵字進行排序
-- 說明:mysql中查詢,查詢結果默認按升序(從上到下,按從小到大)排列
-- 升序排列:
--不加排序關鍵字/使用關鍵字 ASC
-- 降序排列:
-- 使用關鍵字DESC
-- 排序關鍵字使用語法:order by 字段名 [asc|desc],
-- 意思是通過給定的字段名將查詢結果進行排序(升序或者降序)
-- 查詢員工表中所有人員的工資,查詢結果按工資高低升序排列,結果顯示員工編號、工資 方法一 默認升序排列 SELECT employee_id,salary FROM hrdb.`employees` ORDER BY salary; 方法二、使用升序排列關鍵字asc SELECT employee_id,salary FROM hrdb.`employees` ORDER BY salary ASC; -- asc用於升序排列
4.1.12查詢關鍵字limit的用法-分頁查詢
-- 說明:limit限制的意思,在sql語句可以對查詢結果進行過濾
-- 在mysql中,limit m,n,意思是從第m+1條數據開始取數據,連續取n條數據,顯示在查詢結果中。
-- 查詢員工表中所有人員的工資,查詢結果按工資高低降序排列,結果顯示工資前四高的員工編號、工資 SELECT employee_id,salary FROM hrdb.`employees` ORDER BY salary DESC LIMIT 4;
-- 查詢員工表中所有人員的工資,查詢結果按工資高低降序排列,結果顯示工資第四高的員工編號、工資 SELECT employee_id,salary FROM hrdb.`employees` ORDER BY salary DESC LIMIT 3,1; -- 從第3+1條(即第4條)數據開始取數據,只取1條