一、數據庫簡介
1、概念:人類在進化的過程中,創造了數字、文字、符號等來進行數據的記錄,但是承受着認知能力和創造能力的提升,數據量越來越大,對於數據的記錄和准確查找,成為了一個重大難題。計算機誕生后,數據開始在計算機中存儲並計算,並設計出了數據庫系統。
數據庫系統解決的問題:持久化存儲、優化讀寫、保證數據的有效性
當前使用的數據庫,主要分為兩類:
文檔型:如sqlite,就是一個文件,通過對文件的賦值完成數據庫的復制
服務型:如mysql、postgre,數據存儲在一個物理文件中,但是需要使用終端以tcp/ip協議連接,進行數據庫 的讀寫操作
2、三范式
概念:經過研究和對使用中問題的總結,對於設計數據庫提出了一些規范,這些規范被稱為范式
范式:
第一范式(1NF):列不可拆分
第二范式(2NF):唯一標識
第三范式(3NF):引用主鍵
3、E-R模型
當前物理的數據庫都是按照E-R模型進行設計的,E代表entry,實體,R代表relationship,關系
一個實體轉換為數據庫中的一個表
關系描述兩個實體之間的對應規則,包括:一對一,一對多,多對多
關系轉換為數據庫表中的一個列*在關系型數據庫中一行就是一個對象
4、主要操作
數據庫的操作,包括創建、刪除
表的操作,包括創建、修改、刪除
數據的操作,包括增加、修改、刪除、查詢、簡稱crud
二、數據完整性
1、概念:一個數據庫就是一個完整的業務單元,可以包含多張表,數據被存儲在表中。在表中為了更加准確的存儲數據,保證數據的正確有效,可以在創建表的時候,為表添加一些強制性的驗證,包括數據字段的類型、約束
2、字段類型
數字:int,decimal decimal(5,2)表示一共包含五位數,小數包含2位
字符串:char,varchar,text
日期:datatime
布爾:bit
3、約束
主鍵:primary key 主鍵只能有一個
非空:not null
唯一:unique 可以有多個,物理上存儲的結構是由主鍵維護的
默認:default
外鍵:foreign key
三、數據庫基本操作
net start mysql:啟動mysql服務,以管理員身份運行cmd
net stop mysql:關閉mysql服務,以管理員身份運行cmd
mysql –u root –p:啟動mysql客戶端
主鍵:可以保證數據的唯一性
基本命令:
連接數據庫:mysql –u 用戶名 –p 輸入密碼
退出登錄(斷開連接):quit或exit
查看版本(連接后可以執行):select version();
顯示當前時間(連接后可以執行):select now();
遠程連接:mysql –h ip地址 –u 用戶名 –p 輸入密碼
數據庫操作命令
創建數據庫:create database 數據庫名 charset=utf8;
刪除數據庫:drop database 數據庫名
切換數據庫:use 數據名;
查看當前選擇的數據庫:select database();
表操作命令
查看數據庫中所有表:show tables;
創建表:create table 表名(列及類型);
create table student(id int auto_increment primary key, name varchar(20) not null,age int not null,gender bit default 1,address varchar(20),isDelete bit default 0);
auto_increment:表示自增長
primary key:表示主鍵
not null:表示不為空
刪除表:drop table 表名;
查看表結構:desc 表名;
查看建表語句:show create table 表名;
重命名表:rename table 原表名 to 新表名;
修改表:alter table 表名 add|change|drop 列名 類型;
數據操作命令
增:
1.全列插入:insert into 表名values(…)
insert into student values(0,”習大大”,66,1,”北京”,0);
說明:主鍵列是自動增長,但是在全列插入時需要占位,通常使用0,插入成功以后以實際數據為准。
2.缺省插入:insert into 表名(列1,列2,…) values(值1,值2,…);
3.同時插入多條數據:insert into 表名 values(…),(…),…(…);
刪:delete from 表名 where 條件; 注意:沒有條件是全部刪除,慎用。
改:update 表名 set 列1 = 值1, 列2 = 值2… where 條件;
注意:沒有條件是全部列都修改,慎用。
查:select * from 表名;
說明:查詢表中的全部數據
查
基本語法:select * from 表名
from關鍵字后面是表名,表示數據來源於這張表
select后面寫表中的列名,如果是*表示在結果集中顯示表中的所有列
在select后面的列名部分,可以使用as為列名起別名,這個別名顯示在結果集中
如果要查詢多個列之間使用逗號分隔
消除重復行:在select后面列名前面使用distinct可以消除重復的行
條件查詢:
1.語法:select * from 表名 where 條件;
2.比較運算符:=、>、<、>=、<=、!=或<>
select * from student where id > 2;
3.邏輯運算符:and、or、not
select * from student where id > 2 and gender=0;
4.模糊查詢:like
%表示任意多個任意字符
_表示一個任意字符
5.范圍查詢:in
in:表示在一個非連續的范圍內
between:表示在一個連續的范圍內
select * from student where id in(4,6,8);
select * from student where id between 6 and 8;
6.空判斷
insert into student(name,age) values(“特朗普”,70);
注意:null與””是不同的
判斷空:is null 判斷非空:is not null
select * from student where address is null;
7.優先級
小括號,not,比較遠算符,邏輯運算符
and比or優先級高,如果同時出現並希望先選or,需要結合()來使用
聚合:為了快速得到統計數據,提供了5個聚合函數
1.count(*) 表示計算總行數,括號中可以寫*和列名
需求:查詢學生總數
示例:select count(*|id) from student;
2.max(列) 表示求此列的最大值
需求:查詢女生的編號最大值
示例:select max(id) from student where gender=0;
3.min(列) 表示求此列的最小值
需求:查詢女生的編號最小值
示例:select min(id) from student where gender=0;
4.sum(列) 表示求此列的和
需求:查詢所有學生的年齡和
示例:select sum(age) from student;
5.avg(列) 表示求此列的平均值
需求:查詢所有學生年齡的平均值
示例:select avg(age) from student;
分組:按照字段分組,表示此字段相同的數據會被放到一個集合中。分組后只能查詢出相同的數據列,對於有差異的數據列無法顯示在結果集中。可以對分組后的數據進行統計,做聚合運算
語法:select 列1,列2,聚合…from 表名 group by 列1,列2,…
需求:查詢男女生總數
示例:select gender,count(*) from student group by gender,age;
分組后的數據篩選:select 列1,列2,聚合…from 表名 group by 列1,列2,… having 列1,列2,列3,…聚合…
示例:select gender,count(*) from student group by gender having gender;
where與having的區別:
where是對from后面指定的表進行篩選,屬於對原始數據的篩選
having是對group by的結果進行篩選
排序:
語法:select * from 表名 order by 列1 asc|desc,列2 asc|desc,…
說明:1.將數據按照列1進行排序,如果某些列1的值相同,則按照列2進行排序
2.默認按照從小到大的順序排序
3.asc:升序 desc:降序
需求:將沒有被刪除的數據按年齡排序
示例:select * from student where isDelete=0 order by age asc,id desc;
分頁:
語法:select * from 表名 limit start,count;
說明:start索引從0開始
示例:select * from student where gender=1 limit 0,3;
關聯:
建表語句:create table class(id int auto_increment primary key,name varchar(20) not null,stuNum int not null);
create table students(id int auto_increment primary key, name varchar(20) not null,gender bit default 1,classid int not null,foreign key(classid) references class(id));
插入一些數據:
insert into class values(0,’python01’,55),(0,’python02’,50),
(0,’python03’,60),(0,’python04’,80);
insert into students values(0,’tom’,1,1);
insert into students values(0,’lilei’,1,10);
insert into students values(0,’jack’,1,2);
select * from students;
關聯查詢:
select students.name,class.name from class inner join students on class.id =students.classid;
分類:
1.表A inner join 表B
表A與表B匹配的行將會出現在結果集中
2.表A left join 表B
表A與表B匹配的行會出現在結果集中,外加表A中獨有的數據,未對應的數據使用null填充
3.表A right join 表B
表A與表B匹配的行會出現在結果集中,外加表B中獨有的數據,未對應的數據使用null填充