1. 程式人生 > 實用技巧 >資料庫(一)資料庫優點,常用資料庫,建立資料庫,設計建立資料表,資料型別,資料表操作,完整性約束(非空,主鍵,唯一,預設,外來鍵)

資料庫(一)資料庫優點,常用資料庫,建立資料庫,設計建立資料表,資料型別,資料表操作,完整性約束(非空,主鍵,唯一,預設,外來鍵)

資料庫:就是存放資料的倉庫,是按照資料結構來組織、儲存和管理資料的倉庫,是對資料持久化的工具

使用資料庫的優點
儲存大量資料
保持資料資訊的完整、一致性
資料的共享和安全

常用資料庫
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關鍵字

  2.函式,每個資料庫有著獨立的函式庫,函式可以在SQL中直接呼叫
  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;