數據庫
定義
數據庫是持久存儲有組織可共享數據的容器
分類:
關係型數據庫:MySQL、Oracle、SQL Server、SQLite、DB2
非關係型數據庫:Redis、MongoDB
數據庫管理系統
定義
數據庫管理系統是操作和管理數據庫的軟件
包括:
MySql Oracle DB2
SQL分類
存儲引擎
定義
存儲引擎是給數據庫提供數據存儲、處理和保護等核心服務的程序
包括:
InnoDB MyISAM
注:MySQL5.5後的默認存儲引擎爲InnoDB
兩個存儲引擎的區別
數據庫操作的語法
創建數據庫: CREATE DATABASE [IF NOT EXISTS] 數據庫名;
查看數據庫: SHOW DATABASES;
使用數據庫: USE 數據庫名;
刪除數據庫: DROP DATABASE [IF EXISTS] 數據庫名;
數據表字段操作的語法
創建表語法(create 屬於ddl)
CREATE TABLE [ IF NOT EXISTS ] 表名
(
字段名1
數據類型 [屬性],
字段名2
數據類型 [屬性],
… …
字段名n
數據類型 [屬性]
) ;
設置存儲引擎和指定數據表編碼格式:
CREATE TABLE [ IF NOT EXISTS ] 表名
(
字段名1
數據類型 [屬性],
字段名2
數據類型 [屬性],
… …
字段名n
數據類型 [屬性]
) [ 存儲引擎 ] [ 表字符集 ];
加入註釋
CREATE TABLE [ IF NOT EXISTS ] 表名
(
字段名1
數據類型 [屬性] COMMENT [字段註釋],
字段名2
數據類型 [屬性] COMMENT [字段註釋],
… …
字段名n
數據類型 [屬性] COMMENT [字段註釋]
) [ 存儲引擎 ] [ 表字符集 ] [表註釋];
查看數據庫中的表:
SHOW TABLES;
顯示錶結構:
DESC 表名;
刪除表語法(DROP屬於DDL)
DROP TABLE [ IF EXISTS ] 表名;
修改表名: ALTER TABLE 舊錶名 RENAME AS 新表名
添加字段: ALTER TABLE 表名 ADD 字段名 字段類型 [ 屬性 ]
修改字段:
ALTER TABLE 表名 MODIFY 字段名 字段類型 [ 屬性 ]
修改屬性:
alter table student modify sex enum(‘男’,‘女’);
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 字段類型 [ 屬性 ]
刪除字段:
ALTER TABLE 表名 DROP 字段名;
展示表的創建過程
show create table 表名;
更改表的存儲引擎
ALTER TABLE 表名 ENGINE = 存儲引擎
數據表中數據的操作
dml 數據操作語言 insert 添加 數據的 delete 刪除數據 update 修改數據
1. 添加數據
-
標準的添加的sql語句
insert into student(id,name,sex,birthday,grade,scid) values(1,‘張三’,‘男’,‘2017-12-12’,60.23,2 ); -
常用的添加的sql語句 student 表名後面不寫字段默認的是 這個表的所有的字段名
insert into student values(2,‘李四’,‘女’,‘2006-06-06’,99,5); -
指定 字段添加數據
insert into student(id,name,sex,scid) values(3,‘王五’,‘男’,6); -
指定字段的賦值
insert into student set id=4,name=‘趙六1’,sex=‘男’,birthday=‘2016-11-01’ ;
insert into student set id=3, name=‘趙六’, sex=‘男’, birthday=‘2016-10-01’;
修改 update
指定字段名 的值
update student set name=‘李七’ where id=4;
update 表名 set 字段名=新字段值,字段名=新字段值,字段名=新字段值,字段名=新字段值 where 指定字段名=指定字段名的值;
update student set name=‘瀟瀟’, sex=‘女’ , grade =65, scid=9 where id=4;
update student set name=‘李七’;
刪除 delete 單刪
指定 一個 字段 進行刪除 前提條件 這個字段的值 是 唯一的
1.delete from student where id=4;
delete from student;
刪除數據
2.truncate table student;
3.drop table student;
DELETE語句和TRUNCATE TABLE語句對比
dql 數據查詢語言 selete 查詢 展示數據的
* 代表的是 所有的字段名
– 空 null
select * from student
– 要求 只展示studnet 表中的 編號 和名稱
select id,name,sex,birthday ,grade,scid from student;
– 要求 只展示studnet 表中的 編號 和名稱
select id ,name from student;
約束
定義
約束是爲了確保表中數據的完整性而做出的限制。
主鍵約束:primary key
唯一約束:unique
非空約束:not null
默認約束:default
外鍵約束:foreign key
檢查約束:check
約束 規則
在 創建表的時候 可以 添加約束 或者是在修改 表結構的時候 添加約束
create table student(
id int primary key , -- 主鍵 非空 null 且唯一 方便 外面的表便於數據引用 和 對錶中的字段的約束
name varchar(30) not null, -- 名稱不能 爲 空
sex varchar(3) default '男' , -- 默認 是 男
email varchar(60) unique -- 唯一約束
);
-- check 檢查性約束
外鍵約束
列後加入:references 主表名(主鍵列);
foreign key (字段名) references 主表名 (主鍵列);
alter table 表名 add foreign key(列名) references 主表名(主鍵列)
刪除約束 alter table 表名 drop foreign key 外鍵名;
唯一約束
列級約束 xs_idnum VARCHAR(11) unique
表級約束 unique(字段1,字段2)
修改表 alter table 表名 modify 字段名 字段類型 unique;
alter table 表名 add [constraint <唯一鍵名>] unique(字段名 字段類型);
alter table 表名 drop index 惟一鍵名稱;
檢查約束
列後加入:check(xs_sex=‘男’ OR xs_sex=‘女’);
刪除約束: alter table 表名 drop check 檢查約束名稱;
默認約束
修改表時添加約束:
alter table 表名 alter 字段名 set default 默認值
刪除約束 alter table 表名 alter 字段名 drop default;
非空約束
alter table 表名 modify 字段名 字段類型 not null;加入非空約束
alter table 表名 modify 字段名 字段類型 null;取消非空約束
E-R圖
定義:
E-R圖是用來描述現實世界實體及實體間關係的概念數據模型
E-R圖符號
數據表中的查詢
條件查詢是通過WHERE子句進行檢索的查詢方式
select * from 表名 where 字段 = 值;
select* from comments where cmtId=1;
多條件查詢是利用邏輯運算符把多個條件組合起來的條件查詢
select * from 表名 where 字段1=值 邏輯值 字段2=值;
SELECT * FROM comments WHERE cmtId=1 AND cmtAuthor=‘張三1’;
IN關鍵字(查詢符合括號內條件的數據 )
select 字段列1,字段2……from 表名 where 字段名 in(值1,zhi2);
SELECT * FROM comments WHERE newsId IN(1,2);
between and(查詢值1和值2區間的數據,並且包含值1和值2)
select 字段列1,字段2 ,…FROM 表名 where 字段x between 值1 and 值2;
SELECT * FROM comments WHERE cmtId BETWEEN 1 AND 10
模糊查詢是使用SQL 通配符替代一個或多個字符的條件查詢
select * from表名 where 字段 like ‘包含通配符的值’;
_ 一個字符 A LIKE ‘C_’ CS、 Cd等
% 任意長度的字符串 B LIKE ‘CO%’ CONST、COKE等
[ ] 括號中所指定範圍內的一個字符 C LIKE ‘9W0[1-2]’ 9W01或9W02
[^] 不在括號中所指定範圍內的一個字符 D LIKE ‘9W0[^1-2]’ 9W03或9W07等
distinct關鍵字(去掉SELECT查詢返回的記錄結果中重複的記錄, 相同記錄只返回一條)
SELECT DISTINCT 字段名1, 字段名2… FROM 表名
SELECT DISTINCT cmtContent FROM comments ;
order by 關鍵字(一組數據按照升序或降序排列)
SELECT 字段名列表 FROM 表名 [WHERE <查詢條件>]
[ORDER BY <排序的列名> [ASC 或 DESC]]
SELECT * FROM comments order by cmtId DESC
limit關鍵字(MySQL查詢語句中使用LIMIT子句限制結果集)
SELECT <字段名列表> FROM <表名> [WHERE <查詢條件>]
[ORDER BY <排序的列名> [ASC 或 DESC]] [LIMIT [位置偏移量, ]行數];
SELECT * FROM comments LIMIT 2,5
null 關鍵字
SELECT * FROM comments where cmtAuthor is null;(is not null )
聚合函數(聚合函數是可以對一組值進行計算,並返回單個值的函數)
SELECT 聚合函數 FROM <表名>
SELECT COUNT(*) AS 總數 FROM comments;
分組查詢(按照指定的字段分類彙總結果的查詢方式 )
SELECT <字段名列表> FROM <表名>
[WHERE <查詢條件>]
[GROUP BY <分組的字段名>]
[ORDER BY <排序的列名> [ASC 或 DESC]]
[LIMIT [位置偏移量, ]行數];
SELECT newsId 新聞編號,COUNT(*) AS 數量 FROM comments GROUP BY newsId
高級查詢
字符串連接
select concat(‘my’,‘s’,‘ql’)字符串連接;
– 字符串替換
select insert(‘這是sql語言’,2,3,‘mysql’)字符串替換;
– 字符串轉小寫
select lower(‘aADASDAFaFSDFGREW’)字符串轉小寫;
– 字符串轉大寫
select upper(‘asdafsdsaafs’)字符串轉大寫;
– 字符串截取 從1開始
select substring(‘老二是我兒’,1,3)字符串截取 ;
– 字符串字符個數
select char_length(‘老二是我兒’)字符串字符個數;
– 字符串去左右空格
select trim(’ 老二是我兒 ')字符串去左右空格;
– 將字符串重複count次後返回
select repeat(‘老二’,3)將字符串重複count次後返回;
– 將字符串反轉後返回
select reverse(‘老二是弟弟’)將字符串反轉後返回;
– 獲取當前日期
select curdate()獲取當前日期;
– 獲取當前時間
select curtime()獲取當前時間;
– 獲取當前時間日期
select now();
– 返回日期date爲一年中的第幾周
select week(now())返回日期date爲一年中的第幾周;
– 返回日期date的年份
select year(now())返回日期date的年份;
– 返回時間time的小時值
select hour(now())返回時間time的小時值;
– 返回時間time的分鐘值
select minute(now())返回時間time的分鐘值;
– 返回日期參數date和date之間相隔的天數
select datediff(now(),‘2018-8-8’);
– 計算日期參數date加上n天后的日期
select adddate(now(),5)計算日期參數date加上n天后的日期;
– 返回大於或等於數值X的最小整數
select ceil(2.3)向上取整;
– 返回小於或等於數值x的最大整數
select floor(2.3)向下取整;
– 返回0~1間的隨機數
select rand() 返回0到1間的隨機數;
– 求一個數的絕對值
select abs(-48954)絕對值;
– 求一個數的平方根
select sqrt(9)平方根;
– 求一個數的冪運算符
select power(2,3)冪運算;
– 返回當前數據庫名
select database()返回當前數據庫名;
– 返回當前客戶的連接id
select connection_id()返回當前客戶的連接id;
– 返回最後一個select查詢進行檢索的總行數
select found_rows()返回最後一個select查詢進行檢索的總行數;
– 返回當前登錄用戶名
select user()返回當前登錄用戶名;
– 返回mysql服務器的版本
select version()返回mysql服務器的版本;
連接查詢
– 兩表查詢
-- 查詢 員工 的 詳細信息 包含他的所在部門的名稱
select * from dept;
-- 隱式內連接
select * from emp e, dept d where e.deptno=d.did ;
-- 內連接 inner join on 篩選條件的關鍵字 查出的數據是兩表的交集的數據
select * from emp inner join dept on emp.deptno=dept.did;
外連接 左 left join on 連接 右連接 right join on
-- 左連接 是 以 左爲主 left join 表名 on 條件
select * from emp left join dept on emp.deptno=dept.did;
-- 右連接 是 以 左爲主 right join 表名 on 條件
select * from emp right join dept on dept.did=emp.deptno;
– 全連接 – FULL join
-- UNION
select * from emp left join dept on emp.deptno=dept.did
UNION
select * from emp right join dept on dept.did=emp.deptno;
-- 分組 group by
-- 查詢 每個部門中 的 員工的 數量 並顯示 部門的名稱 以及員工的數量
-- select dept.dname , count(*) from emp right join dept on emp.deptno = dept.did group by emp.deptno;
-- 按照 有員工的部門 的編號進行分組 並 計算出部門中的員工的個數
select dept.dname, count(*) from emp inner join dept on emp.deptno=dept.did group by dept.did;
-- 按照 有員工的部門 的編號進行分組 並 計算出部門中的員工的個數 且 員工的個數大於 1的
select dept.dname, count(*) from emp inner join dept on emp.deptno=dept.did group by dept.did having count(*) >1;
-- 各個部門薪水最高的員工信息
-- in()
select e.*, d.dname from emp e inner join dept d on e.deptno=d.did where e.sal in (select max(sal) from emp group by deptno )
子查詢
EXISTS子查詢
SELECT 字段 FROM 表名 WHERE EXISTS(子查詢);
注:子查詢有返回結果:EXISTS子查詢結果爲TRUE,外層查詢執行
子查詢無返回結果:EXISTS子查詢結果爲FALSE,外層查詢不執行
範式
定義
範式是爲了設計冗餘較小、結構合理的關係型數據庫而遵循的規範
- 第一範式是爲確保數據表的字段都符合原子性的範式
- 第二範式(2NF)是指在1NF的基礎上,表中必須有主鍵,
其它列必須與主鍵完全依賴的範式 - 第三範式(3NF)是 在2NF的基礎上,非主鍵列必須
直接依賴於主鍵的範式