1. 程式人生 > 資料庫 >資料庫筆記整理(一)

資料庫筆記整理(一)

(Ⅰ)資料庫及表的建立

  1. 資料庫的建立
create database Teacher -- 建立一個名為Teaacher的資料庫
  1. 表的建立
CREATE TABLE Teacher(
id INT(11) NOT NULL  auto_increment COMMENT '主鍵' PRIMARY KEY , 
userid INT(11) NOT NULL  COMMENT '使用者ID' ,
age INT(3)  COMMENT '年齡',
stu_name VARCHAR(50) COMMENT '名稱',
createTime datetime(0) DEFAULT  CURRENT_TIMESTAMP(0)  COMMENT '建立時間',
updateTime datetime(0)  ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新時間',
FOREIGN KEY(userid)	references  `info`(userid)
)

在上述程式碼中,NOT NULL 表示該欄位的值不能為空; auto_increment
表示該欄位的值自增,這裡需要注意的是:每個表只能有一個欄位的值是自增的;COMMENT表示該欄位的描述;PRIMARY KEY表示設定該欄位為主鍵,這裡還可以這樣設定主鍵:PRIMARY KEY(id);FOREIGN KEY表示設定該欄位為外來鍵,這需連線另一張表的欄位

  1. 表的欄位常用命令
alter table `user`   add  card_Id varchar(255) NULL COMMENT '身份證' ;  -- 新增欄位
alter table `user`   add  primary key(id);  -- 新增主鍵
alter table `user`   ALTER	age SET DEFAULT 11;  -- 修改預設值
alter table `user`   CHANGE  card_Id  cardId varchar(255) NULL COMMENT '身份證' ; -- 更新列名
alter table `user`  modify id INT(11)  auto_increment COMMENT '主鍵';    -- 修改列的約束	
alter table `user`  drop cardId;  -- 刪除某一列  
alter table `user` rename user2  -- 重新命名
alter table `user2`   add pay4 int(11) AFTER age;  -- 在某個值後面新增
alter table `user2`   add pay5 int(11) FIRST;  -- 新增到第一個
  1. 資料的新增
-- 新增英語系到學院表
INSERT INTO dept ( `name` ) VALUES ( '英語系' );-- 新增完整的一條記錄
-- 新增多條記錄
INSERT INTO teacher ( `name`, gender, age, e_mail, dept_id, phone ) VALUES ( '周玲', '男', 20, '[email protected]', 5, '18726598630' );

INSERT INTO teacher ( `name`, gender, age, e_mail, dept_id, phone )
VALUES
	( '周玲', '女', 23, '[email protected]', 4, '13168647943' ),
	( '吳達', '男', 22, '[email protected]', 4, '15626598630' ),
	( '吳孟', '男', 20, '[email protected]', 2, '13626598630' );
	
-- 新增時間
INSERT INTO teacher ( `name`, gender, age, e_mail, dept_id, phone, createtime )
VALUES
	( '王大海', '男', 20, '[email protected]', 3, '18726598630', '2021-01-15 10:20:02' );

-- 刪除某個資料(多條件、單條件)
DELETE  FROM teacher  WHERE age = 20;	-- 單條件刪除

DELETE  FROM teacher WHERE age = 20  AND gender = '女';	-- 多條件刪除

在sql語法中,用;來分割語句,如果不加;,則可能會將它錯誤的判斷為一個語句,從而試執行時報錯

  1. 資料的更新

在更新我們想要更新的資料之前,我們需要先查詢資料;資料的更新可以用關鍵字set來更新;下面演示一下簡單的資料更新

-- 將名字裡面有“輝”的人的電話號碼改為123456789
UPDATE teacher  SET phone = '123456789'  WHERE `name` LIKE '%輝%';
-- 將名字第一個字有“輝”的人的電話號碼改為123456789
UPDATE teacher  SET phone = '123456789'  WHERE `name` LIKE '輝%';
-- 名字最後一個字有“輝”的人的電話號碼改為123456789
UPDATE teacher  SET phone = '123456789'  WHERE `name` LIKE '%輝';
-- 名字第二個為輝的人的電話號碼改為123456789
UPDATE teacher  SET phone = '123456789'  WHERE `name` LIKE '_輝%';
-- 修改多條記錄,多條件修改
UPDATE teacher  SET phone = '987654321', e_mail = '[email protected]'  WHERE age = 20  AND gender = '男' ;

資料的查詢分為模糊查詢和精準查詢;模糊查詢有 LIKE 和 NOT LIKE 兩種,精準查詢則用“=”;%代表0個或多個字元 , _代表一個字元;修改多個欄位中間用,隔開,條件則用 and 或者 or 連線

(Ⅱ)資料的查詢

資料的查詢分為單表查詢和多表查詢兩種,單表查詢和多表查詢都有單條件查詢和多條件查詢,多表查詢還有連線查詢

  1. 單表查詢
SELECT*FROM stu;-- 查詢學生所有資訊
SELECT `name`,age FROM stu;-- 查詢學生姓名年齡
SELECT s.`name`,s.age FROM stu AS s;-- 查詢學生姓名年齡並建立表別名
SELECT s.`name`,s.age FROM stu s WHERE age<=20;-- 查詢年齡小於20歲的學生
SELECT s.`name`,s.age FROM stu s WHERE age BETWEEN 10 AND 30;-- BETWEEN AND 在某個範圍
SELECT s.`name`,s.age FROM stu s WHERE age NOT BETWEEN 10 AND 30;-- NOT BETWEEN AND 不在某個範圍
SELECT s.`name`,s.age FROM stu s WHERE `name` LIKE '%輝%'-- 找出所有名字裡面帶輝的
SELECT s.`name`,s.age FROM stu s WHERE `name` NOT LIKE '%輝%'-- 找出所有名字裡面不帶輝的
SELECT s.`name`,s.age FROM stu s WHERE dept_id IS NOT NULL;-- 系別不為空
SELECT s.`name`,s.age FROM stu s WHERE dept_id IS NULL;-- 系別為空
SELECT s.`name`,s.age FROM stu s WHERE dept_id IN (1,2)-- 查詢在部門1,2中的學生
SELECT s.`name`,s.age FROM stu s WHERE dept_id NOT IN (1,2)-- 查詢不在部門1,2中的學生
SELECT s.`name`,s.age,s.dept_id FROM stu s WHERE s.`name` LIKE '%王%' AND age=20;-- 找出名字裡面有王的 並且 年齡為20 歲
SELECT s.`name`,s.age,s.dept_id FROM stu s WHERE s.`name` LIKE '%王%' OR age=20;-- 找出名字裡面有王的 或者 年齡為20 歲
SELECT s.`name`,s.age,s.dept_id FROM stu s WHERE s.`name` LIKE '%王%' OR (age=19 OR age=20);-- 找出名字裡面有王的 或者 (年齡為19 或者 20)
SELECT s.`name`,s.age,s.dept_id FROM stu s WHERE s.`name` LIKE '%王%' AND age IN (19,20);-- 找出名字裡面有王的 並且 年齡為19 或者 20
SELECT s.`name`,s.age,s.dept_id FROM stu s WHERE s.`name` LIKE '%王%' AND (age=19 OR age=20);-- 找出名字裡面有王的 並且 (年齡為19 或者 20)
SELECT s.`name`,s.age FROM stu s ORDER BY s.age ASC;-- 年齡正序排序(預設自帶的排序)
SELECT s.`name`,s.age FROM stu s ORDER BY s.age DESC;-- 年齡倒序排序
SELECT s.`name`,s.age,s.dept_id FROM stu s ORDER BY s.age DESC,s,dept_id DESC;-- 年齡正序排序,ID倒序排序
SELECT s.`name`,s.age,s.dept_id FROM stu s LIMIT 2;-- 第一條開始篩選出鏈條
SELECT s.`name`,s.age,s.dept_id FROM stu s LIMIT 2,8;-- 第一個數字代表了標的下表,第二個數字代表提取的行數

上面的幾個簡單的例子列舉了單表查詢的常用查詢,其中包括模糊查詢、範圍查詢、條件查詢、多條件查詢,查詢結果的排序以及篩選等
“---------------------------------------------------------------------------------------------------------”
下面介紹幾個常用的聚合函式:
– 主要的聚合函式:
– 記數函式: count(列名) 計算元素的個數
– 求和函式: sum(列名) 對某一列的值求和,但屬性必須是整型
– 計算平均值:avg(列名)對某一列的值計算平均值
– 求最大值: max(列名) 找出某一列的最大值
– 求最小值: min(列名) 找出某一列的最小值

SELECT COUNT(1) AS num FROM stu-- 統計學生數量,並且重新命名列
SELECT COUNT(1) AS num,gender FROM stu s GROUP BY s.gender;-- 統計男女學生數量
SELECT count(s.dept_id) AS num,s.gender FROM stu s GROUP BY s.gender-- 統計男女學生數量,排除 dept_id 為null 的數
SELECT count(1) AS num,s.gender FROM stu s GROUP BY s.gender-- 統計男女學生數量
SELECT avg(s.age) avgAge FROM stu s;-- 統計說有學生的年齡
SELECT avg(s.age) avgAge,s.gender FROM stu s GROUP BY s.gender-- 統計男女學生平均年齡
SELECT sum(s.age) sumAge FROM stu s;-- 所有學生年齡和
SELECT sum(s.age) sumAge,s.gender FROM stu s GROUP BY s.gender-- 統計男女學生年齡之和
SELECT max(s.age) maxAge FROM stu s;-- 所有學生最大年齡
SELECT max(s.age) maxAge,s.gender FROM stu s GROUP BY s.gender;-- 統計男女學生年齡之最
SELECT max(s.age) maxAge,s.gender,s.class_id FROM stu s GROUP BY s.gender,s.class_id-- 統計出每個班級男女生年齡之最
SELECT AVG(s.age) AS avgage,s.gender FROM stu AS s WHERE s.age> 20 GROUP BY s.gender;-- 查詢年齡大於18歲的人的平均年齡
SELECT AVG(s.age) AS avgage,s.gender FROM stu AS s GROUP BY s.gender HAVING s.gender='女';-- 查詢性別為女的平均年齡
  1. 多表查詢

多表之間的連線方式有多種,比如內連線、左連線、右連線、自連線,下面將依次介紹常用的幾種多表之間的連線

-- 內連線
-- 內連線要求關聯的兩張表關係的欄位都必須存在,只展示關聯的資料
SELECT*FROM stu s INNER JOIN class c ON s.class_id=c.id;
-- 內連線的條件查詢
SELECT*FROM stu s INNER JOIN class c ON s.class_id=c.id WHERE s.age=20 AND c.id=1;-- 查詢年齡為20歲且班級為1班的學生
-- 自連線
SELECT*FROM stu s,class c WHERE s.class_id=c.id;

-- 左連線
-- 左連線顯示左邊的所有資料,右邊的資料不存在則置空(join的左右邊)
SELECT*FROM stu s LEFT JOIN class c ON s.class_id=c.id;

-- 右連線
-- 右連線顯示右邊的所有資料,左邊的資料不存在則置空
SELECT*FROM stu s RIGHT JOIN class c ON s.class_id=c.id;

表之間的連線可能不只是兩張表之間的連線,還可能是三張表或者更多長膘之間的連線,下面展示簡單的三表連線和子查詢

-- 三表連線查詢
-- 查詢學生班主任資訊
SELECT s.`name`,c.`name`,t.`name` FROM stu s LEFT JOIN class c ON s.class_id=c.id LEFT JOIN teacher t ON c.teacher_id=t.id;

-- 查詢年齡大於20的學生班主任資訊
SELECT s.`name`,c.`name`,t.`name` FROM stu s LEFT JOIN class c ON s.class_id=c.id LEFT JOIN teacher t ON c.teacher_id=t.id WHERE s.age> 20;

-- 查詢數學系一班的所有學生
SELECT*FROM stu s WHERE s.class_id IN (
SELECT c.ID FROM class c WHERE c.`name`='數學系一班');

-- 查詢出所有年齡大於18並且班級為數學系一班人員名稱(這邊使用子查詢)
SELECT*FROM stu s WHERE s.class_id IN (SELECT c.ID FROM class c WHERE c.`name`='數學系一班') AND s.age> 19;

-- 查詢出所有班主任為‘李海生′的學生資訊(這邊同樣適用子查詢)
SELECT*FROM stu WHERE stu.class_id IN (
SELECT class.id FROM class INNER JOIN teacher ON class.teacher_id=teacher.id WHERE teacher.`name`='李海生');

SELECT*FROM stu INNER JOIN class ON stu.class_id=class.id INNER JOIN teacher ON class.teacher_id=teacher.id WHERE teacher.`name`='李海生';-- 連線查詢

“---------------------------------------------------------------------------------------”
本人是資料庫小白,這是自己整理的資料庫筆記,以上資料庫的簡單使用就先暫時介紹到這裡了,有什麼不對的歡迎大家指出