文章目錄
1 數據庫概述
1.1 什麼是數據庫
- 數據庫就是一個文件系統,只不過我們需要通過命令(SQL)來操作這個文件系統。
- 數據庫是“按照數據結構來組織、存儲和管理數據的倉庫”。是一個長期存儲在計算機內的、有組織的、可共享的、統一管理的大量數據的集合。
- 數據庫是以一定方式儲存在一起、能與多個用戶共享、具有儘可能小的冗餘度、與應用程序彼此獨立的數據集合,可視爲電子化的文件櫃——存儲電子文件的處所,用戶可以對文件中的數據進行新增、查詢、更新、刪除等操作。
1.2 數據庫的作用
- 存儲數據,數據的倉庫,帶有訪問權限,限制不同的人有不同的操作。
1.3 爲什麼要學數據庫
- 操作的都是後臺數據,取到後臺數據進行封裝,然後交給前臺去展現。
1.4 常見的數據庫
- MySQL:開源免費的適用於中小型企業的免費數據庫,sun 公司收購了 MySQL,sun 公司被 Oracle 收購了,Oracle 收購之後就開始收費了。
- Mariadb:由 MySQL 創始人搞出來的,直接是 MySQL 開源版本的一個分支,基本上所有的命令都是一樣的。
- Oracle:甲骨文公司,商業收費,適用於大型電商網站,收購 sun 公司和Java。
- db2:IBM 公司,主要提供解決方案,軟件和硬件,服務器架構。銀行系統大多數採用的是 db2。
- SQLserver:Windows 裏面,政府網站 asp.net,大多數大學教學通常都是採用 SQLserver,圖形化工具不錯。
- Sybase:已經被淘汰了。
- NoSQL 非關係型數據庫:key:value 的形式,常見的有 Mongodb、Redis 等。
1.5 關係型數據庫
- 主要是用來描述實體與實體之間的關係。
- E-R 圖表示:實體-方框,屬性-橢圓,關係-菱形。
1.6 MySQL數據庫服務器
- MySQL 數據庫:數據庫管理軟件。
- 服務器:類似一臺電腦,這臺電腦安裝相關的服務器軟件,這些軟件會監聽不同的端口號,根據用戶訪問的端口號,提供不同的服務。
2 MySQL的SQL語句
- SQL:Structure Query Language 結構化查詢語言。
- DDL:數據定義語言。定義數據庫,數據庫表及結構。create(創建),drop(刪除),alter(修改)。
- DML:數據操縱語言:主要是用來操作數據。insert(插入),update(修改),delete(刪除)。
- DCL:數據控制語言:定義訪問權限,取消訪問權限,安全設置 grant。
- DQL:數據查詢語言:select(查詢),from子句,where子句。
2.1 數據庫的CRUD的操作
- 首先要登錄數據庫服務器:
mysql -u [用戶名] -p [密碼]
2.1.1 創建數據庫
-
create database 數據庫名字; create database sql_1;
-
create database 數據庫名字 character set 字符集; create database sql_2 character set utf8;
-
create database 數據庫名字 character set 字符集 collate 校對規則; create database sql_3 character set utf8 collate utf8_bin;
2.1.2 查看數據庫
-
-- 查看所有的數據庫 show databases;
-
-- 查看數據庫定義的語句 show create database 數據庫的名字 show create database sql_1; show create database sql_2;
2.1.3 修改數據庫
-
-- 修改數據的字符集 alter database 數據庫的名字 character set 字符集; alter database sql_1 character set gbk;
2.1.4 刪除數據庫
-
drop database 數據庫名字; drop database sql_2; drop database sql_3;
2.1.5 其它數據庫操作命令
-
-- 切換數據庫(選中數據庫) use 數據庫的名字; use sql_1;
-
-- 查看當前正在使用的數據庫 select database();
2.2 表的CRUD操作
2.2.1 創建表
-
create table 表名( 列名1 列的類型(長度) 約束, 列名2 列的類型(長度) 約束, . . . . . . ); create table student( sid int primary key, sname varchar(15), sex int, age int );
- 列的類型
-- int -- char/varchar[char:固定長度, varchar:可變類型] -- double, float, boolean -- date[YYYY-MM-DD] -- time[hh:mm:ss] -- datatime[YYYY-MM-DD hh:mm:ss] 默認值是null -- timestamp[YYYY-MM-DD hh:mm:ss] 默認使用當前時間 -- text[主要是用來存放文本] -- blob[存放的是二進制]
- 列的約束
-- 主鍵約束: primary key -- 唯一約束: unique -- 非空約束: not null
2.2.2 查看錶
-
-- 查看所有表 show tables;
-
-- 查看錶的定義 show create table 表的名字; show create table student;
-
-- 查看錶的結構 desc 表的名字; desc student;
2.2.3 修改表
- 添加列(add),修改列類型(modify),修改列名(change),刪除列(drop),修改表名(rename)。
-
-- 添加列 alter table 表名 add 列名 列的類型 列的約束 alter table student add grade int not null;
-
-- 修改列類型 alter table 表名 modify 列名 列的類型; alter table student modify sex varchar(2);
-
-- 修改列名 alter table 表名 change 原列名 新列名 新列的類型; alter table student change sex tel varchar(20);
-
-- 刪除列 alter table 表名 drop 列名; alter table student drop tel;
-
-- 修改表名 rename table 原表名 to 新表名; rename table student to stus;
-
-- 修改表的字符集 alter table 表名 character set 字符集; alter table stus character set gbk;
2.2.4 刪除表
-
drop table 表名; drop table stus;
2.3 表中數據的CRUD操作
2.3.1 插入數據
-
insert into 表名(列名1, 列名2, 列名3) values(值1, 值2, 值3); insert into student(sid, sname, sex, age) values (1, 'liuyi', 1, 23);
-
-- 如果插入的是全列名的數據,表名後面的列名可以省略 insert into 表名 values(值1, 值2, 值3); insert into student values(2, 'chener', 1, 23);
-
-- 注意,如果插入的是部分列,列名不可省略 insert into student(sid, sname) values(3, 'zhangsan'); insert into student values(3, 'zhangsan'); --錯誤
-
-- 批量插入 insert into student values (4, 'lisi', 1, 23), (5, 'wangwu', 1, 23), (6, 'zhaoliu', 1, 23), (7, 'sunqi', 1, 23), (8, 'zhouba', 1, 23);
2.3.2 刪除記錄
-
delete from 表名 [where 條件]; delete from student where sid=10;
-
-- 如果沒有指定條件,會將表中的數據一條一條全部刪除掉 delete from student;
- delete 刪除數據和 truncate 刪除數據的區別
-- delete: DML 一條一條刪除表中的數據 -- truncate: DDL 先刪除表再重建表 -- 關於哪條執行效率高,具體要看錶中的數據 -- 如果數據比較少,delete 比較高效 -- 如果數據比較多,truncate 比較高效
2.3.3 更新表記錄
-
update 表名 set 列名1=列1的值, 列名2=列2的值 [where 條件];
-- 如果參數是字符串或日期,要加上單引號 update student set sname='李四' where sid=4;
-- 沒有條件,那麼每一條記錄都會執行 update student set sname='李四', sex=20;
2.3.4 查詢記錄
-
select [distinct] [*] [列名1, 列名2] from 表名 [where 條件]; -- distinct 去除重複數據
-
先創建兩個表,用於操作:
-- 商品分類 -- 1. 分類ID -- 2. 分類名稱 -- 3. 分類描述 create table category( cid int primary key auto_increment, cname varchar(10), cdesc varchar(31) ); -- 所有商品 -- 1. 商品ID -- 2. 商品名稱 -- 3. 商品價格 -- 4. 生產日期 -- 5. 商品分類ID -- 商品和商品分類:所屬關係 create table product( pid int primary key auto_increment, pname varchar(10), price double, pdate timestamp, cno int ); -- 關於數據這裏就不再操作了,隨便一點數據就行
-
簡單查詢
-- 查詢所有商品 select * from product;
-- 查詢商品名稱和商品價格 select pname, price from product;
-
別名查詢,as 關鍵字,as 可以省略
-- 表別名(主要用於多表查詢) select p.pname, p.price from product as p;
-- 列別名 select pname as 商品名稱, price as 商品價格 from product;
-- 省略 as 關鍵字 select pname 商品名稱, price 商品價格 from product;
-
去掉重複的值
-- 查詢商品所有的價格 select price from product; select distinct price from product;
-- select 運算查詢:僅僅在查詢結果上做了運算,不改變表中的數據 select *, price*1.5 from product; select *, price*0.9 from product; select *, price*0.5 as 折後價 from product;
-
條件查詢 [where關鍵字], 指定條件,確定要操作的記錄
-- 查詢商品價格>60的所有商品信息 select * from product where price > 60;
-- where 後的條件寫法 -- 關係運算符:> >= < <= = != <> -- <> 不等於,標準 SQL 語法 -- != 不等於,非標準 SQL 語法
-- 查詢商品價格不等於 88 的所有商品 select * from product where price <> 88;
-- 查詢商品價格在 10 到 100 之間 select * from product where price > 10 and price < 100;
-- between...and... select * from product where price between 10 and 100;
-
邏輯運算:and, or, not
-- 查詢出商品價格小於 100 或者商品價格大於 900 的商品 select * from product where price < 100 or price > 900;
-
like 模糊查詢
-- _:代表一個字符 -- %:代表多個字符
-- 查詢出名字中帶有'餅'的所有商品 '%餅%' select * from product where pname like '%餅%';
-- 查詢第二名是'煙'的所有商品 '_煙%' select * from product where pname like '_煙%';
-
in 在某個範圍中獲取值
-- 查詢出商品分類ID在1,4,5裏面的所有商品 select * from product where cno in (1, 4, 5);
-
排序查詢:order by 關鍵字
-- asc: ascend 升序,默認的排序方式 -- desc: descend 降序
-- 查詢所有商品,按照價格進行排序 select * from product order by price;
-- 查詢所有商品,按價格進行降序排序 select * from product order by price desc;
-- 查詢名稱有'小'的商品,按價格升序 select * from product where pname like '%小%' order by price asc;
-
聚合函數
sum():求和 avg():求平均值 count():統計數量 max():最大值 min():最小值
-- 獲取所有商品價格的總和 select sum(price) from product;
-- 獲取所有商品的平均價格 select avg(price) from product;
-- 獲取所有商品的個數 select count(*) from product;
- 注意,where 條件後面不能接聚合函數
-
子查詢
-- 查詢商品價格大於平均價格的商品 select * from product where price > (select avg(price) from product);
-
分組:group by
-- 根據 cno 字段分組,分組後統計商品個數 select cno, count(*) from product group by cno;
-- 根據 cno 分組,分組統計每組商品的平均價格並且商品平均價格>60 select cno, avg(price) from product group by cno having avg(price) > 60;
-- having 關鍵字,可以接聚合函數,出現在分組之後 -- where 關鍵字,不可以接聚合函數,出現在分組之前
-
編寫順序
-- S..F..W..G..H..O -- select .. from .. where .. group by .. having .. order by
-
執行順序
-- F..W..G..H..S..O -- from .. where .. group by .. having .. select .. order by
2.3 分頁查詢
-
limit [索引], [顯示的個數]
select * from product limit 0, 3; -- 出來的是第1~3條的3條數據 select * from product limit 3, 3; -- 出來的是第4~6條的3條數據
2.4 多表之間的關係維護
- 外鍵約束: foreign key
-- 給 product 中的 cno 添加一個外鍵約束(兩張表:product,category) alter table product add foreign key(cno) references category(cid);
- 刪除的時候, 先刪除外鍵關聯的所有數據,再才能刪除分類的數據。
-
主鍵約束:默認就是不能爲空,唯一。
- 外鍵都是指向另外一張表的主鍵
- 一張表只能有一個主鍵
-
唯一約束:列裏面的內容必須是唯一,不能出現重複情況,可爲空。
- 唯一約束不可以作爲其它表的外鍵
- 可以有多個唯一約束
2.4.1 建數據庫原則
- 通常情況下,一個項目/應用建一個數據庫。
2.4.2 多表之間的建表原則
-
一對多:商品和分類
- 建表原則:在多的一方添加一個外鍵,指向一的一方的主鍵。
-
多對多:老師和學生,學生和課程
- 建表原則:建立一張中間表,將多對多的關係,拆分成一對多的關係,中間表至少要有兩個外鍵,分別指向原來的那兩張表。
-
一對一:班級和班長, 公民和身份證, 國家和國旗
- 建表原則:
- 將一對一的情況,當作是一對多情況處理,在任意一張表添加一個外鍵,並且這個外鍵要唯一,指向另外一張表
- 直接將兩張表合併成一張表
- 將兩張表的主鍵建立起連接,讓兩張表裏面主鍵相等
- 實際用途: 用的不是很多(拆表操作).
- 拆表操作:將個人的常用信息和不常用信息拆分出來,減少表的臃腫。
- 建表原則:
2.5 多表查詢
2.5.1 笛卡爾積(交叉連接查詢)
-
-- 查出來的就是兩張表的乘積,查出的結果沒有意義。 select * from product, category;
-
-- 過濾出有意義的數據 select * from product, category where cno = cid; select * from product as p, category as c where p.cno = c.cid; select * from product p, category c where p.cno = c.cid;
2.5.2 內連接查詢
-
-- 隱式內連接 select * from product p, category c where p.cno = c.cid;
-
-- 顯式內連接 select * from product p inner join category c on p.cno = c.cid;
-
-- 區別 -- 隱式內連接:在查詢出結果的基礎上去做 where 條件過濾 -- 顯式內連接:帶着條件去查詢結果,執行效率要高
2.5.3 左外連接
- 左外連接,會將左表中的所有數據都查詢出來,如果右表中沒有對應的數據,用 null 代替。
-
select * from product p left outer join category c on p.cno = c.cid;
2.5.4 右外連接
- 右外連接,會將右表中的所有數據都查詢出來,如果左表中沒有對應的數據,用 null 代替。
-
select * from product right outer join category c on p.cno = c.cid;
3 END
感謝看到這裏的各位讀者朋友們,如果你感到本文寫的不錯,就順手點個贊👍收藏一下,也可以關注一波~~