資料庫(一)資料庫優點,常用資料庫,建立資料庫,設計建立資料表,資料型別,資料表操作,完整性約束(非空,主鍵,唯一,預設,外來鍵)
資料庫:就是存放資料的倉庫,是按照資料結構來組織、儲存和管理資料的倉庫,是對資料持久化的工具
使用資料庫的優點
儲存大量資料
保持資料資訊的完整、一致性
資料的共享和安全
常用資料庫
ORACLE
甲骨文公司的產品
第一個支援SQL的資料庫,在高階資料應用中分佈最廣
SQLServer
微軟公司的產品
將關係型資料庫應用推向普及化,在小型機中很好的適用性
DB2
IBM公司的產品
基於UNIX系統,主要應用在商務大型平臺
MySQL
瑞典MySQLAB公司產品,ORACLE旗下產品
主要應用在中小型網站,速度快體積小,成本低,開源
什麼是DBMS
(DataBase Management System)資料庫管理系統,負責對資料庫進行統一的管理和操作,確保資料操作的安全性和完整性。使用者通過DBMS訪問資料庫中的資料
資料庫中的資訊是如何記錄的?
MySQL以庫為單位儲存資料,具體的資料內容儲存在資料表中
什麼是DBMS
(DataBase Management System)資料庫管理系統,負責對資料庫進行統一的管理和操作,確保資料操作的安全性和完整性。使用者通過DBMS訪問資料庫中的資料
資料庫中使用SQL語句訪問
Java語言智慧被JVM識別執行,在資料庫中無法識別。開發人員需要和資料庫互動就需要使用資料庫所能識別的語言
SQL:(Structured Query Language)結構化的查詢語言,是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關係資料庫系統
SQL語言包含4個部分
1.DDL (Data Definition Language ) 資料定義語言 如資料表的建立修改刪除等
2.DML (Data Manipulation Language) 資料操作語言 如對資料的增刪改
3.DQL (Data Query Language ) 資料查詢語言 如對資料的查詢
4.DCL (Data Control Language) 資料控制語言 如事務的提交回滾,許可權控制等
不同的資料庫雖然都通用SQL語言,但是還是會存在一定的差異性,主要體現在以下幾個方面:
1.SQL中的關鍵字,如SQLServer中有top關鍵字,mysql中有limit關鍵字
3.SQL程式設計擴充套件:定義變數、條件結構、迴圈結構
資料庫的高階應用主要體現在SQL程式設計上:觸發器、儲存過程、函式、遊標
SQL的注意項:
1.SQL語句不區分大小寫
2.每行SQL語句使用分號結束(不寫分號也可以,但是多條語句同時執行的時候必須要有分號,所以最好平時都寫分號)
SQL中的註釋:
單行註釋使用 --
多行註釋使用 /* */
建立資料庫:(在Navicat點選新建查詢,然後在彈出的介面中進行編寫)
CREATE DATABASE 資料庫名 [CHARACTER SET 字符集](中括號中的可寫可不寫,只要安裝時指定了UTF-8字符集就可以不寫)
建立以後查詢建立的文件實在C——Users——Administrator——文件——Navicat——MySQL——Servers——localhost_3306——找到指定的資料名稱
-- 建立資料庫 create database geekhome;
刪除和建立可以在同一個介面,因為可以單獨執行一句程式碼,即使寫了刪除語句,但是沒有執行,也是刪除不了的
-- 刪除資料庫 drop database geekhome;
選擇使用的資料庫:選擇的是哪個庫,新建的資料就會儲存在哪個庫
-- 選擇使用的資料庫 use geekhome;
建立資料表
-- 建立資料表 create table test_table( test_name varchar(20); )
建立表之前要先進行設計
資料表設計:
良好的資料庫設計
節省資料儲存空間
保證資料的完整性
方便進行資料庫應用程式的開發
糟糕的資料庫設計:
資料冗餘,空間浪費
資料修改或插入造成異常
資料表設計步驟:
分析需求,實現資料建模
滿足資料表的三正規化
建立資料表
實施資料表的完整性約束
資料庫三正規化:完成資料分析建模後,資料表要需要進行三正規化設計
第一正規化
確保列的原子性,每個資料列都是不可分割的單元
第二正規化
每行資料都應根據一個依賴列被唯一區分
第三正規化
行中的每列都應直接關聯主鍵,即不能存在其他表主鍵以外的欄位
特殊情況:
編號和欄位進行與表格間的關聯是,編號佔存更少,欄位字串產生的冗餘更多
但是如果對一個欄位有著非常高度的查詢,則可以犧牲記憶體產生冗餘使用欄位進行表格間的關聯
所有結構相同的資料,都應儲存在一個表格中,不同點用一個屬性進行區分
建立資料表:
create table 表名(
欄位名 資料型別(長度),
欄位名 資料型別(長度)
)
char是定長字元 如果宣告文字型別為char(10),實際的值為’tom’,在磁碟中分配的位元組空間還是要佔據10個位元組
varchar 是變長字元 如果宣告文字型別為varchar(10),實際的值為’tom’,在磁碟中分配的位元組空間還是要佔據3個位元組
資料表操作
刪除資料表:
drop table 表名
新增列:
alter table 表名 add 列名 資料型別
修改列型別:表中沒有資料的時候才能修改
altertable 表名 modify 列名 新資料型別
修改列名:
alter table 表名 change 原列名 新列名 型別
刪除列:
altertable 表名 drop column 列名
檢視資料表:
select * from 表名
完整性約束
建立資料表後需要新增表的約束條件,確保表資料的完整性
完整性=資料+可靠+準確
完整性約束
輸入的型別是否正確?
年齡必須是數值
輸入的格式是否正確
身份證號碼為18位
是否在允許的範圍內
性別只能為男女
是否存在重複輸入
同一個學生檔案錄入了兩次
域完整性:對列提出要求
實體整型:對行提出要求
引用完整性:關聯的值不能隨便寫
實體完整性約束:主鍵約束和唯一約束
主鍵約束:
一張表中只能擁有一個主鍵
主鍵應具備唯一性和穩定性
主鍵值不能為空
主鍵約束的使用
方法一:
create table `user`(
userId int primary key,
)
方法二:
create table`user`(
userId int,
constraint 約束名 primary key(主鍵列名稱)
)
方法三:
alter table 表名 add constraint 約束名 primary key(主鍵列名稱)
刪除主鍵:
alter table 表名 drop primary key
唯一約束:防止重複資料的產生
表中可以擁有多個唯一約束
唯一約束的使用:
alter table 表名 addconstraint 約束名 unique(列名稱)
域完整性約束:
1.非空約束:資料列是否必填
在列名後面新增 not null
CREATE TABLE `user`( userId int primary key, userName varchar(20) not null )
2.預設約束:資料列是否具備預設值
在列名設定後面新增 default ‘ 預設值內容’
CREATE TABLE `user`( userId int primary key, userName varchar(20) default ‘預設值’ )
3.檢查約束(MySQL中無效):資料列是否有效
如果部門表的經理編號引用自員工表的員工編號,需要通過外來鍵約束限制經理編號只能寫入員工表的員工編號
在該過程中,部門表引用員工表,部門表稱為外表,員工表稱為主表
外表中的經理編號又稱為外來鍵,外來鍵只能引用主表的主鍵或者是唯一鍵
引用完整性約束:
外來鍵約束:
alter table 外表表名[引用表] add constraint 約束名 foreign key(外來鍵列) reference 主表名名[被引用表](主表中的主鍵)
alter table score add constraint fk_uid foreign key(uid) references user(userId)
刪除主鍵約束
alter table 表名 drop primary key
刪除唯一約束
alter table 表名 drop index約束名
刪除外來鍵約束
alter table 表名 dropforeign key 外來鍵名
例項一:
-- 建立資料庫 create database geekhome; -- 刪除資料庫 drop database geekhome; -- 選擇使用的資料庫 use geekhome; -- 建立資料表 create table users ( userid int, userName varchar(20), birthday datetime, email varchar(50), detail text ); -- 建立表的時候新增主鍵約束方式一 -- 每張表中只能具備一個主鍵 create table users ( userid int primary key, userName varchar(20), birthday datetime, email varchar(50), detail text ); -- 建立表的時候新增主鍵約束方式二 create table users ( userid int, userName varchar(20), birthday datetime, email varchar(50), detail text, constraint pk_userid primary key(userid) ); -- 在建立表之後單獨新增主鍵 alter table//修改表 users add constraint pk_userid primary key(userid); -- 新增唯一約束 alter table users add constraint uq_username unique(username); -- 刪除主鍵 alter table users drop primary key -- 建表時新增非空約束 -- 預設約束 create table users ( userid int, userName varchar(20) not null, -- 非空約束 birthday datetime, email varchar(50) default '[email protected]', -- 預設約束 detail text, constraint pk_userid primary key(userid) ); -- 建立部門表 create table department ( depId int primary key, depName varchar(50) not null, managerId int -- 部門經理的編號來自於users表的編號 ) -- 為部門表中的經理編號新增外來鍵約束 alter table department add constraint fk_managerId foreign key(managerId) references users(userid) -- 刪除資料表 drop table users; drop table department; -- 新增新的資料列 alter table users add age int; -- 修改列的資料型別 alter table users modify email tinytext; -- 修改列的名稱 alter table users change email address varchar(100); -- 刪除列 alter table users drop column detail; -- 檢視資料表 select * from users; select * from department;
例項二:
-- 建立資料庫 資料庫名稱不能重複 create database geekhome; -- 使用資料庫 use geekhome; -- 刪除資料庫 drop database geekhome; -- 建立資料表 create table `user`( -- 新增主鍵 userId int primary key, username varchar(50), birthday date, registDate timestamp, remoke text ) create table `user`( -- 新增主鍵 userId int, username varchar(50), birthday date, registDate timestamp, remoke text, -- 新增主鍵 constraint pk_userId primary key(userId) ) create table `user`( -- 新增主鍵 userId int, username varchar(50), birthday date, registDate timestamp, remoke text ) create table `user`( -- 新增主鍵 userId int primary key, username varchar(50) not null,-- username非空 email varchar(50) default '[email protected]', birthday date, registDate timestamp, remoke text ) -- 建立成績表 create table score( uid int, courseName varchar(20) not null, score DECIMAL(4,1) ) -- 新建資料表後新增主鍵 alter table user add constraint pk_userid primary key(userId); -- 新增唯一約束,表中可以有多個唯一鍵 alter table user add constraint uq_username unique(username); -- 新增外來鍵約束,被引用的表稱為主表,引用主表的表稱為外表; -- 外表中引用主表的列稱為外來鍵列,主表中被引用的列必須是主鍵或者唯一鍵 alter table score add constraint fk_uid foreign key(uid) references user(userId) -- 刪除主鍵約束 alter table `user` drop primary key; -- 刪除唯一約束 alter table user drop index uq_username -- 刪除外來鍵 alter table score drop foreign key fk_uid -- 新增表列 alter table user add sex varchar(1) -- 刪除列 alter table user drop column sex -- 修改列的資料型別 alter table user modify username varchar(50) -- 修改列的名稱 alter table user change username uname varchar(50) -- 刪除資料表 drop table user; drop table score; -- 檢視資料 select * from user;