本筆記來自bilibili:一天學會 MySQL 數據庫
以及參考某位大佬的筆記
MySQL數據庫使用筆記(一):終端使用與約束
MySQL數據庫使用筆記(二):範式設計
MySQL數據庫使用筆記(三):查詢練習
MySQL數據庫使用筆記(四):鏈接查詢與事務
MySQL數據庫使用筆記(一):終端使用與約束
如何使用終端操作數據庫?
如何登陸數據庫服務器?
windows安裝完MySql之後,點擊下圖,輸入密碼即可進入。
如何查詢數據庫服務器中所有的數據庫?
輸入:show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bilibili |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.02 sec)
如何選擇數據庫?
輸入:use test;
輸出:Database changed
如何查看該數據庫中有哪些表?
輸入:show tables;
輸出:Empty set (0.00 sec)
如何查詢表中的數據?
輸入:select * from tableName;
如何退出數據庫服務器?
輸入:exit;
如何在數據庫服務器中創建自己的數據庫?
輸入:create database databaseName;
如何創建一個數據表? 創建一個pet表
輸入:
CREATE TABLE pet(
name VARCHAR(20),
owner VARCHAR(20),
specise VARCHAR(20),
sex CHAR(1),
brith DATE,
death DATE );
注意事項:
- 1:var()與varchar()的區別在於var()是定常的,哪怕存儲的字符串沒有達到"()“中數字的上限,var()依然會佔用空格來填充空間.
而varchar()則是不定長的,沒有達到”()"中的上限則會自動去掉後面的空格; - 2:性別不要用:sex 要用:gender 一個是性 一個是性別;
- 3:定義最後一個字段的時候不要加",";
- 4:上面的"VAR",“VARCHAR”,"DATE"可以用小寫.不過最好用大寫來表示區分關鍵字,若不然也許寫到後面你自己都不知道這個詞是數據庫中的關鍵字還是你自己自定義的一些數據,同時一定要用英文的標點符號也必須半角輸入
如何查看數據表的架構?
輸入:describe pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| specise | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| brith | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.02 sec)
如何插入數據?
輸入:INSERT INTO pet VALUES('black','jack','dog','1','2020-05-29',null);
輸出:Query OK, 1 row affected (0.02 sec)
- NULL:代表的是空,表示該字段還沒有數據.千萬不要主動填寫’NULL’,這代表你的字段有一個值叫做
'null'
. - 還有一種寫法:
INSERT INTO pet(name,owner) VALUES ('xx','cc');
。代表我只在name和owner字段上面插入的一條,其他皆爲NULL/默認值的數據
查看剛剛插入的數據:select * from pet;
+-------+-------+---------+------+------------+-------+
| name | owner | specise | sex | brith | death |
+-------+-------+---------+------+------------+-------+
| kk | cc | dog | 1 | 1998-08-02 | NULL |
| black | jack | dog | 1 | 2020-05-29 | NULL |
+-------+-------+---------+------+------------+-------+
2 rows in set (0.00 sec)
mysql 常用數據類型
(來自菜鳥教程)
MySQL中定義數據字段的類型對你數據庫的優化是非常重要的。
MySQL支持多種類型,大致可以分爲三類:數值、日期/時間和字符串(字符)類型。
- 數值類型
- 日期和時間類型
- 字符串類型
如何刪除/修改數據
首先插入數據:
INSERT INTO pet VALUES('n1','o1','dog1','1','2020-1-2',null);
INSERT INTO pet VALUES('n2','o2','dog2','0','2020-2-2',null);
INSERT INTO pet VALUES('n3','o3','dog3','1','2020-3-2','2020-12-2');
INSERT INTO pet VALUES('n4','o4','dog4','0','2020-4-2',null);
-
刪除語句:
delete from tablesName where 條件;
比如:delete from pet where name='n1';
-
修改數據:
update tableName set 字段1=值1,字段2=值2 ... where 條件;
比如:update pet set name='newn2' where name='n2';
數據記錄常見操作?
- 增加:
INSERT
- 刪除:
DELETE
- 修改:
UPDATE
- 查詢:
SELECT
mysql建表中的約束
1.主鍵約束:
它能夠唯一確定一張表中的一條記錄,增加主鍵約束之後,就可以使得字段不重複而且不爲空 。
先創建一個表:
create table user(
id int PRIMARY KEY,
name VARCHAR(20)
);
查看錶的描述:describe user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
插入數據:INSERT INTO user VALUES (1,'張三');
再次插入報錯:ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
。這是PRIMARY KEY
造成的,所有可以改成:INSERT INTO user VALUES (2,'張三');
插入完後查看:select * from user;
+----+------+
| id | name |
+----+------+
| 1 | 張三 |
| 2 | 張三 |
+----+------+
其實id
是不可以爲null
而且 key的值 也變爲:PRI(primary)。
2.聯合主鍵:
只要聯合的主鍵值加起來不重複就可以
CREATE TABLE user2(
id INT,
name VARCHAR(20),
password VARCHAR(20),
PRIMARY key(id,name)
);
這裏把id
和name
進行聯合約束。
查看錶的描述:describe user2;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| name | varchar(20) | NO | PRI | | |
| password | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
插入數據:
INSERT INTO user2 VALUES (1,'老王','123456');
INSERT INTO user2 VALUES (2,'老王','123456');
INSERT INTO user2 VALUES (1,'老李','123456');
查看數據:SELECT * FROM user2;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | 老李 | 123456 |
| 1 | 老王 | 123456 |
| 2 | 老王 | 123456 |
+----+------+----------+
3.自增約束
先創建一個表:
CREATE TABLE user3(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
查看描述:describe user3;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
插入數據:INSERT INTO user3(name) VALUES('張三');INSERT INTO user3(name) VALUES('李四');
查看數據:SELECT * FROM user3;
+----+------+
| id | name |
+----+------+
| 1 | 張三 |
| 2 | 李四 |
+----+------+
沒有自定義id
值 但是自動生成了id
,並且id
自增。
- 如果說我們創建表的時候,忘記創建主鍵約束了?改怎麼辦?
create table user4 (
id int,
name varchar(20 )
);
alter table user4 add primary key(id);
- 使用modify 修改字段,添加約束
alter table user4 modify id int primary key;
4.唯一約束:
約束脩飾的字段的值不可以重複
創建表:
CREATE TABLE user5(
id INT ,
name VARCHAR(20)
);
新增name爲唯一約束:alter table user5 add unique(name);
查看錶:describe user5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
name那個地方有了UNI
。
插入數據:insert into user5 values(1, 'jack');
,再次插入,報錯:ERROR 1062 (23000): Duplicate entry 'jack' for key 'name'
,修改name
值,再次插入:insert into user5 values(1, 'rose');
查看數據:select * from user5;
+------+------+
| id | name |
+------+------+
| 1 | jack |
| 1 | rose |
+------+------+
- 如何刪除一個約束?
alter table tablename drop index name ;
- modify添加約束:
alter table tablename modify name varchar(20) unique;
總結一下:
- 1、建表的時候就添加約束
- 2、可以使用alter。。。add。。。。添加約束
- 3、alter。。。modif。。。添加約束
- 4、刪除約束alter。。。。drop。。。
主鍵約束(primary key)中包含了唯一約束
場景:業務需求:設計一張用戶註冊表,用戶姓名必須要用手機號來註冊,而且手機號和用戶名稱都不能爲空,那麼:
CREATE TABLE user_test(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'主鍵id',
name VARCHAR(20) NOT NULL COMMENT'用戶姓名,不能爲空',
phone_number VARCHAR(20) UNIQUE NOT NULL COMMENT'用戶手機,不能重複且不能爲空'
);
運行 DESCRIBE user_test;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| phone_number | int(11) | NO | UNI | NULL | |
+--------------+-------------+------+-----+---------+----------------+
這樣的話就達到了每一個手機號都只能出現一次,達到了每個手機號只能被註冊一次.
用戶姓名可以重複,但是手機號碼卻不能重複,複合正常的邏輯需求。
5.非空約束
修飾的字段不能爲空NULL
創建表:
CREATE TABLE user9(
id INT ,
name VARCHAR(20) NOT NULL
);
查看錶:desc user9;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
插入數據:insert into user9 (id) values(1);
報錯:ERROR 1364 (HY000): Field 'name' doesn't have a default value
。
重新插入:
insert into user9 values(1,'張三');
insert into user9 (name) values('jack');
查看數據:select * from user9;
+------+------+
| id | name |
+------+------+
| 1 | 張三 |
| NULL | jack |
+------+------+
6.默認約束
當插入字段值的時候,如果沒有傳值,就會使用默認值
創建表:
CREATE TABLE user10(
id INT ,
name VARCHAR(20),
age int default 10
);
查看錶:desc user10;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | 10 | |
+-------+-------------+------+-----+---------+-------+
插入數據:insert into user10 (id, name) values(1, 'zhangsan' ) ;
查看數據:select * from user10;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
+------+----------+------+
其中age
爲默認值10
傳了值,就不會使用默認值:insert into user10 values(1, 'zhangsan', 19);
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 1 | zhangsan | 19 |
+------+----------+------+
應用場景:
業務需求:找正常的用戶,對這些正常用戶進行發放優惠卷或者積分之類的東西,而被禁封的用戶我們不讓其參加多動.
我們想要封用戶只要將status的值從0改爲1就行了,當然我們取用戶的時候必須要先判斷status是否是0.若是1.說明該用戶已經被禁封.
先封手機號爲’1234’的用戶:
UPDATE user6 SET status = 1 WHERE phone_number= '1234';
SELECT * FROM user6;
+----+------+--------------+--------+
| id | name | phone_number | status |
+----+------+--------------+--------+
| 1 | aa | 123 | 0 |
| 2 | bb | 1234 | 1 |
| 3 | cc | 1263456 | 0 |
+----+------+--------------+--------+
status爲1,說明用戶已經被封,該用戶不可以參加活動
我們取用戶的時候加上status的判斷,如:
SELECT * FROM user6 WHERE status = 0;
+----+------+--------------+--------+
| id | name | phone_number | status |
+----+------+--------------+--------+
| 1 | aa | 123 | 0 |
| 3 | cc | 1263456 | 0 |
+----+------+--------------+--------+
7.外鍵約束
涉及到兩個表:父表,子表(主表,副表)。
創建班級表:
CREATE TABLE classes(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'班級表id',
name VARCHAR(20) COMMENT'班級名稱'
);
查看班級表:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
創建學生表:desc classes;
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'學生表id',
name VARCHAR(20) COMMENT'學生姓名',
class_id int COMMENT'教室id,這張表中的class_id是classes表中id的值',
FOREIGN KEY (class_id) REFERENCES classes(id)
);
//FOREIGN :外來 REFERENCES:應用,參考
查看學生表:desc student;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| class_id | int(11) | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+----------------+
classes
表插入數據:
insert into classes values(1,'一班');
insert into classes values(2,'二班');
insert into classes values(3,'三班');
insert into classes values(4,'四班');
查看數據:select * from classes;
+----+------+
| id | name |
+----+------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
+----+------+
student
表插入數據:
insert into student values(1001, '張三', 1);
insert into student values(1002, '張三', 2);
insert into student values(1003, '張三', 3);
insert into student values(1004, '張三' ,4);
查看student數據:select * from student;
+------+------+----------+
| id | name | class_id |
+------+------+----------+
| 1001 | 張三 | 1 |
| 1002 | 張三 | 2 |
| 1003 | 張三 | 3 |
| 1004 | 張三 | 4 |
+------+------+----------+
再次插入數據:insert into student values(1005, 'jack' ,5);
報錯:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bilibili`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
classes
表中沒有班級5
,所有student
不可能有班級5
。
刪除數據:delete from classes where id=4;
報錯:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`bilibili`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
這是因爲student
中已經創建了class_id = 4
的數據,所以class
不能刪除。
總結一下:
- 1.主表
classes
中沒有的數據值,在副表中,是不可以使用的。 - 2.主表(父表)中的記錄被副表(子表)引用,是不可以被刪除的。
- 3.若要想刪除,先將附表中的數據刪除在刪除主表數據
- 4.對於外鍵約束大家可以聯想 省,市 來進行聯想 (市必須要依賴於省,只要省還有一個市在引用,那麼就不可以刪除省,要不然市就沒有省了. 那麼我們想刪除省,必須要將該省下所有的市全部刪除之後,纔可以刪除這個省)
8.如何建表之後添加主鍵約束
CREATE TABLE user4(
id INT,
name VARCHAR(20)
);
運行DESCRIBE user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
加入主鍵約束:
ALTER TABLE user4 add PRIMARY KEY(id);
再次運行DESCRIBE user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
刪除主鍵約束:
ALERT TABLE user4 DROP PRIMARY KEY;
運行DESCRIBE user4
查看錶結構:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
使用modify 修改字段.添加約束:
ALTER TABLE user4 MODIFY id INT PRIMARY key;
使用DESCRIBE user4
查看錶結構:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
給主鍵設置自增長:
ALTER TABLE user4 MODIFY id INT AUTO_INCREMENT;
運行 DESCRIBE user4
查看錶結構:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+