MySQL數據庫


一、 mysql數據庫概述

關系型數據庫,默認監聽端口:tcp:3306 。mariadb,mysql;

關系型:構建模型是關系-實體圖,E-R圖;

實體:具有屬性的對象

聯系:實體與實體之間的關系

屬性:用來描述實體

實體集:實體的集合

 

 

二、 mysql安裝與配置

  1. mysql的編譯安裝
  2. yum安裝或者apt-get

CentOS7為例:

1) 配置安裝環境

  IP,防火牆,Selinux

2) 配置yum源

  echo -e “[local]\nname=local\nbaseurl=file:///mnt\nenabled=1\ngpgcheck=0” > /etc/yum.repos.d/local.repo

  mount /dev/sr0 /mnt

3) 安裝

  yum install -y mariadb-server mariadb

  1. MySQL數據庫配置:

1) 配置文件: /etc/my.cnf

一般配置寫在:[mysqld]字段下。

2) mysql數據庫本地登錄的root用戶賦予密碼:

  mysqladmin -u root password ‘123.com'

 

  1. 數據庫本地登錄

mysql -u root -p123.com [數據庫名]

三、 數據庫操作:

  1. 查看命令:

1) 查看數據庫:

  show databases;

2) 進入數據庫:

  use 數據庫名稱;

3) 查看數據表

  show tables;

4) 查看數據表的結構:

  desc 表名稱;

5) 查看表中的數據:

  select * from 表名稱\G; (\G:數據以行的形式輸出。)

  2.數據庫操作:

1) 創建數據庫

  create database 數據庫名稱;

2) 刪除數據庫

  drop database 數據庫名稱;

  3.數據表操作:

1) 創建數據表

  create table 數據表名稱(字段名  數據類型,...);

例子:

create table stu_info(stuID int, stuName varchar(20), stuSex varchar(20), stuAge tinyint, stuAddress varchar(200), stuPhone varchar(11));

2) 刪除數據表

  drop table 數據表名稱;

3) 修改數據表

  alter table 數據表名稱();

  4.數據結構:

mysql數據庫中的數據類型

1)精准數字

int:整型,-2^31~2^31-1,占用4字節

tinyint:整型,0~255,占用1字節

decimal[(p[,s])]:p,數據長度;s,小數點后保留位數;

numeric[(p[,s]):-10^38+1~10^38-1

2)浮點數

real:正負十進制數;-3.40E+38~3.40E+38

float:-1.79E+308~-2.23E-308、0以及2.23E+308~1.79E-308

3)字符串

nchar:定長字符串;char(10),定長10個字符

nvarchar:可變長度字符串,varchar(10),最大10個字符

char:2倍的nchar存儲容量

varchar:2倍的nvarchar存儲容量

text:存儲文本數據

4)日期

date:只存儲日期;公元元年~地球爆炸

time:只存儲時間;精確到毫秒;10:13:00-000

datetime:存儲日期及時間;1753-1-1至9999-1-1; 2021-08-20:10:13:00-000

5)貨幣

money:存儲貨幣值,取值范圍為正負922 337 213 685 477.580 8之間

6)二進制

bit:位數據類型,只取0或1為值

binary:存儲固定長度二進制數據;1~8000

  

  5.數據操作:

1) 數據添加

insert [into] 數據表名稱(字段1, 字段2,.....)  values(數字, ‘字符串’....)

注意: 字段數量一定要等於值的數量。

全表插入數據:

  insert into stu_info values(2, 'John', 'male', 21, 'lanou for china', '11011011011');

2) 數據刪除

全表刪除:

  delete from 數據表名稱;

指定行刪除:(使用where子句)

  delete from 數據表名稱 where 字段=值;

3) 數據更新

全表更新:

update 數據表名稱 set 字段=新值;

指定單字段更新:(使用where子句)

update 數據表名稱 set 字段=新值 where 字段=值;

指定多字段更新:

update 數據表名稱 set 字段1=新值1, 字段2=新值2  where 字段=值;

案例:

update stu_info set stuPhone='13337373377',stuAddress='dalian for china'  where stuID=2;

 

4) 數據查詢

單表查詢:

(1) 全表查詢:

select * from 數據表名稱;

(2) 條件查詢(where子句)

條件表達式:

 

 

like通常結合通配符查詢:

_:通配單個字符

%:通配所有字符

select * from stu_info where stuName like ‘T%’;

(3) 排序查詢

默認是升序排列,若要降序排列:desc

select * from stu_info order by stuAge desc;

(4) 分頁查詢

select * from 數據表名稱 limit 起始行號,步長(查詢多少行);

(查詢從起始行號下一行開始)

案例:

select * from stu_info limit 0,3;

(5) 聚合查詢

sum():求和

select sum(stuAge) from stu_info;

avg():平均值

select avg(stuAge) from stu_info;

min():最小值

select min(stuAge) from stu_info;

max():最大值

select max(stuAge) from stu_info;

下午:

(6) 特定字段查詢

select stuName,stuAge from stu_info;

(7) 將查詢結果存儲到新表

create table stu_info_new(select * from stu_info);

(8) 統計查詢count()

select count(*)  from stu_info;

(9) 去重查詢

select distinct stuSex from stu_info;

(10) 別名顯示結果集:

select stuName [as] 姓名 from stu_info;

(11) 分組查詢

select sum(stuAge) age, stuSex from stu_info group by stuSex;

分組前條件查詢:

select sum(stuAge) age, stuSex from stu_info where stuSex='female' group by stuSex;

分組后條件查詢:

select sum(stuAge) age, stuSex from stu_info  group by stuSex having sum(stuAge) > 45;

 

多表查詢:

1) 聯合查詢

select * from A union all select * from B

注意:A和B表的數據結構要一致

2) 子查詢

select * from stu_info where stuName in (select stuName from stu_info_new);

3) 內連接查詢

select * from A,B where A.name=B.name;  或者

 select * from A inner join B on A.name=B.name;

4) 外連接查詢:(兩張或多張表必須有共同的字段名稱)

左外連接查詢:

select * from A left join B on A.name=B.name;

完整顯示左邊的表數據。

右外連接查詢:

select * from A right join B on A.name=B.name;

完整顯示右邊的表數據。

數據庫擴展:

一、 主鍵

主鍵(PRIMARY KEY)的完整稱呼是“主鍵約束”,是 MySQL 中使用最為頻繁的約束。一般情況下,為了便於 DBMS(數據據庫管理系統) 更快的查找到表中的記錄,都會在表中設置一個主鍵。

 

主鍵分為單字段主鍵和多字段聯合主鍵,本節將分別講解這兩種主鍵約束的創建、修改和刪除。

 

使用主鍵應注意以下幾點:

 

    每個表只能定義一個主鍵。

    主鍵值必須唯一標識表中的每一行,且不能為 NULL,即表中不可能存在有相同主鍵值的兩行數據。這是唯一性原則。

    一個字段名只能在聯合主鍵字段表中出現一次。

    聯合主鍵不能包含不必要的多余字段。當把聯合主鍵的某一字段刪除后,如果剩下的字段構成的主鍵仍然滿足唯一性原則,那么這個聯合主鍵是不正確的。這是最小化原則。

 

在創建表時設置主鍵約束

在創建數據表時設置主鍵約束,既可以為表中的一個字段設置主鍵,也可以為表中多個字段設置聯合主鍵。但是不論使用哪種方法,在一個表中主鍵只能有一個。下面分別講解設置單字段主鍵和多字段聯合主鍵的方法。

1)設置單字段主鍵

CREATE TABLE 語句中,通過 PRIMARY KEY 關鍵字來指定主鍵。

 

在定義字段的同時指定主鍵,語法格式如下:

 

<字段名> <數據類型> PRIMARY KEY [默認值]

1

test_db 數據庫中創建 tb_emp3 數據表,其主鍵為 id,SQL 語句和運行結果如下。

 

mysql> CREATE TABLE tb_emp3

    -> (

    -> id INT(11) PRIMARY KEY,

    -> name VARCHAR(25),

    -> deptId INT(11),

    -> salary FLOAT

    -> );

Query OK, 0 rows affected (0.37 sec)

mysql> DESC tb_emp3;

+--------+------------------+------+------+---------+-------+

| Field  | Type              | Null | Key | Default | Extra |

+--------+------------------+------+------+---------+-------+

| id         | int(11)          | NO   | PRI | NULL    |       |

| name   | varchar(25) | YES  |       | NULL    |       |

| deptId | int(11)           | YES  |       | NULL    |       |

| salary | float              | YES  |        | NULL    |       |

+--------+-----------------+--------+------+----------+------+

4 rows in set (0.14 sec)

 

 

或者是在定義完所有字段之后指定主鍵,語法格式如下:

 

[CONSTRAINT <約束名>] PRIMARY KEY [字段名]

2

test_db 數據庫中創建 tb_emp4  數據表,其主鍵為 id,SQL 語句和運行結果如下。

 

mysql> CREATE TABLE tb_emp4

    -> (

    -> id INT(11),

    -> name VARCHAR(25),

    -> deptId INT(11),

    -> salary FLOAT,

    -> PRIMARY KEY(id)

    -> );

Query OK, 0 rows affected (0.37 sec)

mysql> DESC tb_emp4;

+--------+------------------+------+------+----------+--------+

| Field  | Type               | Null | Key | Default | Extra |

+--------+------------------+------+------+----------+-------+

| id       | int(11)            | NO   | PRI  | NULL  |         |

| name | varchar(25)   | YES  |        | NULL   |         |

| deptId | int(11)          | YES  |         | NULL   |         |

| salary | float             | YES  |          | NULL   |        |

+--------+-----------------+--------+-------+----------+------+

4 rows in set (0.14 sec)

 

2)在創建表時設置聯合主鍵

所謂的聯合主鍵,就是這個主鍵是由一張表中多個字段組成的。

 

比如,設置學生選課數據表時,使用學生編號做主鍵還是用課程編號做主鍵呢?如果用學生編號做主鍵,那么一個學生就只能選擇一門課程。如果用課程編號做主鍵,那么一門課程只能有一個學生來選。顯然,這兩種情況都是不符合實際情況的。

 

實際上設計學生選課表,要限定的是一個學生只能選擇同一課程一次。因此,學生編號和課程編號可以放在一起共同作為主鍵,這也就是聯合主鍵了。

 

主鍵由多個字段聯合組成,語法格式如下:

 

PRIMARY KEY [字段1,字段2,…,字段n]

注意:當主鍵是由多個字段組成時,不能直接在字段名后面聲明主鍵約束。

3

創建數據表 tb_emp5,假設表中沒有主鍵 id,為了唯一確定一個員工,可以把 name、deptId 聯合起來作為主鍵,SQL 語句和運行結果如下。

 

mysql> CREATE TABLE tb_emp5

    -> (

    -> name VARCHAR(25),

    -> deptId INT(11),

    -> salary FLOAT,

    -> PRIMARY KEY(name,deptId)

    -> );

Query OK, 0 rows affected (0.37 sec)

mysql> DESC tb_emp5;

+--------+------------------+------+-----+---------+-------+

| Field  | Type              | Null | Key | Default | Extra |

+--------+------------------+------+-----+---------+-------+

| name   | varchar(25) | NO   | PRI | NULL |         |

| deptId  | int(11)          | NO   | PRI | NULL |         |

| salary  | float              | YES |        | NULL |         |

+--------+------------------+-------+------+--------+-------+

3 rows in set (0.14 sec)

 

在修改表時添加主鍵約束

主鍵約束不僅可以在創建表的同時創建,也可以在修改表時添加。但是需要注意的是,設置成主鍵約束的字段中不允許有空值。

 

在修改數據表時添加主鍵約束的語法格式如下:

 

ALTER TABLE <數據表名> ADD PRIMARY KEY(<字段名>);

查看 tb_emp2 數據表的表結構,SQL 語句和運行結果如下所示。

 

mysql> DESC tb_emp2;

+--------+-----------------+------+-------+---------+-------+

| Field  | Type             | Null | Key | Default | Extra |

+--------+-----------------+------+-------+---------+-------+

| id        | int(11)          | NO   |         | NULL   |         |

| name  | varchar(30) | YES  |         | NULL   |         |

| deptId | int(11)          | YES  |         | NULL  |         |

| salary | float             | YES  |         | NULL   |         |

+--------+-----------------+-------+-------+----------+------+

4 rows in set (0.14 sec)

 

4

修改數據表 tb_emp2,將字段 id 設置為主鍵,SQL 語句和運行結果如下。

 

mysql> ALTER TABLE tb_emp2

    -> ADD PRIMARY KEY(id);

Query OK, 0 rows affected (0.94 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC tb_emp2;

+--------+-----------------+------+-----+---------+-------+

| Field  | Type             | Null  | Key| Default | Extra |

+--------+-----------------+------+-----+---------+-------+

| id       | int(11)           | NO  | PRI | NULL    |       |

| name | varchar(30)  | YES |        | NULL    |       |

| deptId | int(11)         | YES  |        | NULL    |       |

| salary | float            | YES  |        | NULL    |       |

+--------+----------------+-------+------+-----------+------+

4 rows in set (0.12 sec)

 

通常情況下,當在修改表時要設置表中某個字段的主鍵約束時,要確保設置成主鍵約束的字段中值不能夠有重復的,並且要保證是非空的。否則,無法設置主鍵約束。

刪除主鍵約束

當一個表中不需要主鍵約束時,就需要從表中將其刪除。刪除主鍵約束的方法要比創建主鍵約束容易的多。

 

刪除主鍵約束的語法格式如下所示:

 

ALTER TABLE <數據表名> DROP PRIMARY KEY;

5

刪除 tb_emp2 表中的主鍵約束,SQL 語句和運行結果如下。

 

mysql> ALTER TABLE tb_emp2

    -> DROP PRIMARY KEY;

Query OK, 0 rows affected (0.94 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

由於主鍵約束在一個表中只能有一個,因此不需要指定主鍵名就可以刪除一個表中的主鍵約束。

二、 外鍵

  1. 基本概念

 

1) MySQL中“鍵”和“索引”的定義相同,所以外鍵和主鍵一樣也是索引的一種。不同的是MySQL會自動為所有表的主鍵進行索引,但是外鍵字段必須由用戶進行明確的索引。用於外鍵關系的字段必須在所有的參照表中進行明確地索引,InnoDB不能自動地創建索引。

 

2) 外鍵可以是一對一的,一個表的記錄只能與另一個表的一條記錄連接,或者是一對多的,一個表的記錄與另一個表的多條記錄連接。

 

3) 如果需要更好的性能,並且不需要完整性檢查,可以選擇使用MyISAM表類型,如果想要在MySQL中根據參照完整性來建立表並且希望在此基礎上保持良好的性能,最好選擇表結構為innoDB類型。

 

4) 外鍵的使用條件

 

① 兩個表必須是InnoDB表,MyISAM表暫時不支持外鍵

 

② 外鍵列必須建立了索引,MySQL 4.1.2以后的版本在建立外鍵時會自動創建索引,但如果在較早的版本則需要顯式建立;

 

③ 外鍵關系的兩個表的列必須是數據類型相似,也就是可以相互轉換類型的列,比如int和tinyint可以,而int和char則不可以;

 

5) 外鍵的好處:可以使得兩張表關聯,保證數據的一致性和實現一些級聯操作。

 

  1. 使用方法

 

創建外鍵的語法:

 

外鍵的定義語法:

 

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)

 

REFERENCES tbl_name (index_col_name, ...)

 

[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

 

[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

 

該語法可以在 CREATE TABLE 和 ALTER TABLE 時使用,如果不指定CONSTRAINT symbol,MYSQL會自動生成一個名字。

 

ON DELETE、ON UPDATE表示事件觸發限制,可設參數:

 

① RESTRICT(限制外表中的外鍵改動,默認值)

 

② CASCADE(跟隨外鍵改動)

 

③ SET NULL(設空值)

 

④ SET DEFAULT(設默認值)

 

⑤ NO ACTION(無動作,默認的)

示例

1)創建表1

create table repo_table(

repo_id char(13) not null primary key,

repo_name char(14) not null)

type=innodb;

創建表2

mysql> create table busi_table(

-> busi_id char(13) not null primary key,

-> busi_name char(13) not null,

-> repo_id char(13) not null,

-> foreign key(repo_id) references repo_table(repo_id))

-> type=innodb;

2)插入數據

insert into repo_table values("12","sz"); //success

insert into repo_table values("13","cd"); //success

insert into busi_table values("1003","cd", "13"); //success

insert into busi_table values("1002","sz", "12"); //success

insert into busi_table values("1001","gx", "11"); //failed,提示:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`smb_man`.`busi_table`, CONSTRAINT `busi_table_ibfk_1` FOREIGN KEY (`repo_id`) REFERENCES `repo_table` (`repo_id`))

3)增加級聯操作

mysql> alter table busi_table

-> add constraint id_check

-> foreign key(repo_id)

-> references repo_table(repo_id)

-> on delete cascade

-> on update cascade;

ENGINE=InnoDB DEFAULT CHARSET=gb2312; //另一種方法,可以替換type=innodb;

 

3、相關操作

外鍵約束(表2)對父表(表1)的含義:

在父表上進行update/delete以更新或刪除在子表中有一條或多條對應匹配行的候選鍵時,父表的行為取決於:在定義子表的外鍵時指定的on update/on delete子句。

CASCADE

刪除包含與已刪除鍵值有參照關系的所有記錄

SET NULL

修改包含與已刪除鍵值有參照關系的所有記錄,使用NULL值替換(只能用於已標記為NOT NULL的字段)

RESTRICT

拒絕刪除要求,直到使用刪除鍵值的輔助表被手工刪除,並且沒有參照時(這是默認設置,也是最安全的設置)

NO ACTION

 

 

三、 自動增長列

語法:

auto_increment unique;

或者

auto_increment primary key;

特點:默認起始值為1,步長為1;

案例:

create table user(userID int not null auto_increment unique, username varcar(20) not null primary key, password varchar(20) not null);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM