05-数据库
1、 介紹
數據庫:本質上就是一個文件系統,通過標準的 sql 語句對數據進行 curd 操作。
解釋下 curd 的意思?A:對一張表中的數據進行增刪改查操作。
- C:create 創建
- U:update 修改
- R: read 讀 | 檢索 查詢
- D:delete 刪除
安裝數據庫管理系統:數據庫管理系統,大白話就是一個軟件。
常見的關系型數據庫:
① 關系型數據庫:存放實體與實體之間的關系的數據庫(就是二維表)
實體,例如: 用戶、訂單、商品
關系:用戶擁有訂單,訂單包含商品
| mysql | oracle | 開源的數據庫 |
| oracle | oracle | 大型的收費的數據庫 |
| DB2 | IBM | 大型的收費的數據庫 |
| sqlserver | 微軟 | 中大型的收費的數據庫 |
| sybase | sybase(powerdesigner) |
② 非關系型數據庫:存放的是對象,如 redis 、MongoDB 等數據庫。NO-sql(not only sql)
安裝了數據庫管理系統的計算機稱之為數據庫服務器。服務器:給別人提供提供服務器(軟件服務器)。我們可以通過標準的 sql 語句在服務器創建數據庫(database),有了數據庫之后,就可以在數據庫上創建表了,有了表之后,就可以在里面存放數據了.
2、SQL
SQL:結構化查詢語句,作用:管理數據庫。
sql 的分類:
- DDL:數據定義語言
操作對象:數據庫和表
關鍵詞:create alter drop - DML:數據操作語言
操作對象:記錄 - DQL:數據查詢語言(非官方)
- DCL:數據控制語言
操作對象:用戶 事務 權限
登錄數據庫: mysql -u root -p //root是用戶名,輸入這條命令按回車鍵后系統會提示你輸入密碼,輸入密碼即可登錄,或者mysql -u root -p 密碼 登錄,如果指定數據庫 ip 及端口,則格式類型 mysql -h ip -u root -p -P 3306
DDL:數據定義語言——操作對象為數據庫和表
操作數據庫:
- 創建數據庫:create database 數據庫名稱;
- 刪除數據庫:drop database 數據庫名稱;
- 查看所有數據庫:show databases;
操作表:
創建表:create table 表名(字段描述,字段描述);
create table user(id int primary key auto_increment,username varchar(20));create table user1(id int primary key auto_increment,username varchar(20));
字段描述:字段名稱 字段類型 [約束]
例如:修改表:alter table 表名 ....
- 修改表名:alter table 舊表名 rename to 新表名; 例如 alter table user1 rename to user10;
- 添加字段:alter table 表名 add [column] 字段描述; 例如 alter table user add password varchar(20);
- 修改字段名:alter table 表名 change 字段名稱 新字段描述; 例如 alter table 表名 change 字段名稱 新字段描述;
- 修改字段描述:alter table 表名 modify 字段名稱 字段類型 [約束]; 例如 alter table user modify pwd int;
- 刪除字段:alter table 表名 drop 字段名; 例如 alter table user drop pwd;
修改表:drop table 表名;
常用命令:
- 切換或者進入數據庫: use 數據庫名稱;
- 查看當前數據庫下所有表: show tables;
- 查看表結構: desc 表名;
- 查看建表語句: show create table 表名;
DML:數據操作語言——操作對象為記錄(行)
插入記錄:
格式1: insert into 表名 values(字段值1,字段值2...,字段值n);
insert into user values(1,'tom'); insert into user values('2','tom'); insert into user values('3');-- 錯誤的
注意:① 默認插入全部字段;② 必須保證 values 后面的內容的類型和順序和表結構中的一致;③ 若字段類型為數字,可以省略引號。
例如:格式2: insert into 表名(字段名,字段名1...) values(字段值,字段值1...);
insert into user (username,id) values('jack',4); insert into user (username) values('jack',5);-- 錯誤的
注意:① 插入指定的字段;② 必須保證values后面的內容的類型和順序和表名后面的字段的類型和順序保持一致。
例如:
- 修改記錄:update 表名 set 字段名=字段值,字段名1=字段值1... [where 條件]; 例如 update user set username=’jerry’ where username=’jack’;
- 刪除記錄:delete from 表名 [where 條件]; 例如 delete from 表名 [where 條件];
DQL:數據查詢語句
關鍵字: select
格式:select ... from 表名 where 條件 group by 分組字段 having 條件 order by 排序字段 ase|desc
以一個例子來說,初始化環境:
-- 創建商品表 create table products(pid int primary key auto_increment,pname varchar(20),price double,pnum int,cno int,pdate timestamp );insert into products values (null,'泰國大榴蓮',98,12,1,null); insert into products values (null,'新疆大棗',38,123,1,null); insert into products values (null,'新疆切糕',68,50,2,null); insert into products values (null,'十三香',10,200,3,null); insert into products values (null,'老干媽',20,180,3,null); insert into products values (null,'豌豆黃',20,120,2,null);簡單查詢:
將所有商品的價格+10元進行顯示(或取個別名):可以在查詢的結果之上進行運算,不影響數據庫中的值;給列取別名,格式 字段名 [as] 別名
select price+10 from products; select price+10 新價格 from products; select price+10 '新價格' from products; select price+10 新 價 格 from products;-- 錯誤 select price+10 '新 價 格' from products; select price+10 `新 價 格` from products;條件查詢:
① 匹配內容:%。"龍" 值為龍,"%龍" 值以”龍”結尾,"龍%" 值以”龍”開頭,"%龍%" 值包含”龍”
② 匹配個數:·__· 占兩個位置
sql:select * from products where pname like "%新%";
查詢價格為38,68,98的商品:
① select * from products where price = 38 or price = 68 or price=98;
②select * from products where price in(38,68,98);
where 后的條件寫法:
- > ,<,=,>=,<=,<>,!=
- like 使用占位符 _和 %, _代表一個字符,%代表任意個字符
- in 在某個范圍中獲得值
- between 較小值 and 較大值
排序查詢:
聚合函數: 對一列進行計算 返回值是一個,忽略 null 值
sum()、avg()、max()、min()、count();
分組: 使用 group by
① select cno,sum(pnum) from products group by cno;
② select cno,sum(pnum) from products group by cno having sum(pnum)>200;
注意:where 和 having 的區別
3、數據類型(了解)
| byte | tinyint |
| short | smallint |
| int | int(★) |
| long | bigint |
| char/String | varchar(★) | char |
| boolean | tinyint | int 代替 |
| float/double | float | double |
| java.sql.Date | date 日期 |
| java.sql.Time | time 時間 |
| java.sql.Timestamp | timestamp(★) 時間戳,datetime(★) 日期+時間 |
| java.sql.Clob(長文本) | mysql的方言(text) |
| java.sql.Blob(二進制) | blob |
幾點說的:
- varchar:可變長度(mysql 的方言)。varchar(20): 存放abc 只會占用三個
- char:固定長度。char(20) 存放 abc 占用20個
- double(5,2):該小數長度為5個,小數占2個 最大值:999.99
- timestamp 時間戳:若給定值為 null,數據庫會把當前的系統時間存放到數據庫中
4、約束
約束的作用:為了保證數據的有效性和完整性。
mysql 照片那個常用的約束有:
- 主鍵約束(primary key)
- 唯一約束(unique)
- 非空約束(not null)
- 外鍵約束(foreign key)
主鍵約束: 被修飾過的字段唯一非空。
PS:一張表只能有一個主鍵,這個主鍵可以包含多個字段。
方式1:建表的同時添加約束,格式: 字段名稱 字段類型 primary key
方式2:建表的同時在約束區域添加約束,所有的字段聲明完成之后,就是約束區域了,格式 primary key(字段1,字段2)
方式3:建表之后,通過修改表結構添加約束
create table pk02(id int,username varchar(20) );alter table pk02 add primary key(字段名1,字段名2..); alter table pk02 add primary key(id,username);insert into pk02 values(1,'tom');-- 成功 insert into pk02 values(1,'tomcat');-- 成功 insert into pk02 values(1,'tomcat');-- 失敗唯一約束: 被修飾過的字段唯一,對 null 不起作用。
方式1:建表的同時添加約束 格式: 字段名稱 字段類型 unique
create table un(id int unique,username varchar(20) unique ); insert into un value(10,'tom');-- 成功 insert into un value(10,'jack');-- 錯誤 Duplicate entry '10' for key 'id' insert into un value(null,'jack');-- 成功 insert into un value(null,'rose');-- 成功方式2:建表的同時在約束區域添加約束,所有的字段聲明完成之后,就是約束區域了 unique(字段1,字段值2...)
方式3:建表之后,通過修改表結構添加約束
非空約束: 被修飾過的字段非空。
create table nn(id int not null,username varchar(20) not null );insert into nn values(null,'tom');-- 錯誤的 Column 'id' cannot be null外鍵約束: 為了保證數據的有效性和完整性。
在多表(從表)的一方添加外鍵約束,格式 alter table 多表名稱 add foreign key(外鍵名稱) references 一表名稱(主鍵);
例如:alter table orders add foreign key(user_id) references user(id);
添加了外鍵約束之后有如下特點:★
開發中處理表之間的一對多關系:★
在多表中添加一個外鍵,名稱一般為主表的名稱_id,字段類型一般和主表的主鍵的類型保持一致,為了保證數據的有效性和完整性,在多表的外鍵上添加外鍵約束即可。
開發中處理之間的多對多關系:★
引入一張中間表,存放兩張表的主鍵,一般會將這兩個字段設置為聯合主鍵,這樣就可以將多對多的關系拆分成兩個一對多了,為了保證數據的有效性和完整性,需要在中間表上添加兩個外鍵約束即可。
其他
① truncate 清空表:truncate 表名; 干掉表,重新創建一張空表
和 delete from 區別:
- delete 屬于 DML 語句,truncate 屬于 DDL 語句
- delete 逐條刪除,truncate干掉表,重新創建一張空表
② auto_increment 自增
要求:
1. 被修飾的字段類型支持自增. 一般 int
2. 被修飾的字段必須是一個 key 一般是 primary key
5、多表查詢
- 內連接:
- 顯示的內連接:select a.* ,b.* from a join b on ab的連接條件;
- 隱式內連接:select a.*,b.* from a,b where ab的連接條件;
外連接:
- 左外連接:select a.*,b.* from a left [outer] join b on 連接條件;
意思:先展示 join 左邊的(a)表的所有數據,根據條件關聯查詢 join 右邊的表(b),符合條件則展示出來,不符合以null值展示。 右連接:select a.*,b.* from b right [outer] join a on 連接條件;
查詢用戶的訂單,沒有訂單的用戶不顯示隱式內連接:select user.*,orders.* from user ,orders where user.id=orders.user_id;顯示內連接select user.*,orders.* from user join orders on user.id=orders.user_id; 查詢所有用戶的訂單詳情左外連接: user在左select user.*,orders.* from user left join orders on user.id=orders.user_id; 查詢所有訂單的用戶詳情右外連接:orders 在右select orders.*,user.* from user right join orders on user.id=orders.user_id;
意思:先展示 jion 右邊的表(a)表的所有數據,根據條件關聯查詢 join 左邊的表(b),符合條件則展示出來,不符合以null值展示。
- 左外連接:select a.*,b.* from a left [outer] join b on 連接條件;
子查詢:一個查詢依賴另一個查詢.。例如:查詢出訂單的價格大于300的所有用戶信息 select * from user where id in(select user_id from orders where price >300);
笛卡爾積(了解):多張表無條件的聯合查詢,沒有任何意思。select a.*,b.* from a,b;
總結
- 上一篇: 04-JQuery
- 下一篇: 数据库视频(一)——整体认识