使用終端操作數據庫
1.如何查看有什么數據庫?
show databases;
2.如何選擇數據庫?
use databasesName;
3.如何查看該數據庫中有哪些表?
show tables;
4.如何查詢表中的數據?
select * from tableName;
5.如何退出數據庫服務器?
exit;
6.如何在數據庫服務器中創建自己的數據庫?
create database databaseName;
7.如何創建一個數據表? 創建一個pet表
create TABLE pet(
name VARCHAR(20),
owner VARCHAR(20),
specise VARCHAR(20),
sex CHAR(1),
brith DATAE,
death DATE );
注意事項:
1:var()與varchar()的區別在於var()是定常的,哪怕存儲的字符串沒有達到"()"中數字的上限,var()依然會占用空格來填充空間.而varchar()則是不定長的,沒有達到"()"中的上限則會自動去掉后面的空格;
2:性別不要用:sex 要用:gender 一個是性 一個是性別;
3:定義最后一個字段的時候不要加",";
4:上面的"VAR","VARCHAR","DATE"可以用小寫.不過最好用大寫來表示區分關鍵字,若不然也許寫到后面你自己都不知道這個詞是數據庫中的關鍵字還是你自己自定義的一些數據,同時一定要用英文的標點符號也必須半角輸入
8.如何查看數據表的架構?
describe tableName;
說明:
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
Field : 字段的名稱
Type : 字段的類型,可以有int var varchar
Key : 是否是關鍵字 如可以定義為: primary key 或者 unique key ...
Default: : 若是該字段沒有主動設置值的時候,該字段的默認值是什么?
9.如何插入數據?
INSERT INTO pet VALUES('kk','cc','dog','1','1998-8-2',null);
+------+-------+---------+------+------------+-------+
| name | owner | specise | sex | brith | death |
+------+-------+---------+------+------------+-------+
| kk | cc | dog | 1 | 1998-08-02 | NULL|
+------+-------+---------+------+------------+-------+
注意:
NULL:代表的是空,表示該字段還沒有數據.千萬不要主動填寫'NULL',這代表你的字段有一個值叫做'null'.
其實還有一種寫法:
INSERT INTO pet(name,owner) VALUES ('xx','cc');
代表我只在name和owner字段上面插入的一條,其他皆為NULL/默認值的數據
10.mysql 常用數據類型
注意:金錢最好用int/bigint(整數,單位用分,拿出來進行*100換成元),千萬不要直接用浮點,會有精度損失.
11.如何刪除數據
先插入數據:
INSERT INTO pet VALUES('kk1','cc1','dog1','1','1998-1-2',null);
INSERT INTO pet VALUES('kk2','cc2','dog2','2','1998-2-2',null);
INSERT INTO pet VALUES('kk3','cc3','dog3','1','1998-3-2','1998-12-2');
INSERT INTO pet VALUES('kk4','cc4','dog4','2','1998-4-2',null);
刪除語句:
DELETE FROM tablesName WHRER 條件;
修改數據:
UPDATE tableName SET 字段1=值1,字段2=值2 ... WHERE 條件;
總結:1.table的操作 2.表操作的總結
12.mysql建表中的約束
1.主鍵約束:
它能夠唯一確定一張表中的一條記錄,增加主鍵約束之后,就可以使得字段不重復而且不為空
create table user(
id int PRIMARY KEY,
name VARCHAR(20)
);
INSERT INTO user VALUES (1,'張三');
+----+------+
| id | name |
+----+------+
| 1 | 張三 |
+----+------+
運行DESCRIBE user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
發現 id是不可以為null 而且 key的值 也變為:PRI(primary)
2.復合主鍵:
CREATE TABLE user2(
id INT,
name VARCHAR(20),
password VARCHAR(20),
PRIMARY key(id,name)
);
運行DESCRIBE user2;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| password | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
INSERT INTO user2 VALUES (1,'老王','123456');
INSERT INTO user2 VALUES (2,'老王','123456');
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | 老王 | 123456 |
| 2 | 老王 | 123456 |
+----+------+----------+
說明了復合主鍵只要所有的字段都不是相同的情況下可以允許其中的字段重復:
INSERT INTO user2 VALUES (1,'老李','123456');
SELECT * FROM user2;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | 老李 | 123456 |
| 1 | 老王 | 123456 |
| 2 | 老王 | 123456 |
+----+------+----------+
場景:表中有班級號以及學生座位號,我們可以用班級號+學生的座位號可以准確的定位一個學生,如:(1班5號可以准確的確定一個學生)
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('李四');
+----+------+
| id | name |
+----+------+
| 1 | 張三 |
| 2 | 李四 |
+----+------+
沒有自定義id值 但是自動生成了id
4.唯一約束:
CREATE TABLE user5(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
運行 DESCRIBE user5;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
新增name為唯一約束:
ALTER TABLE user5 ADD UNIQUE(name);
運行 DESCRIBE user5;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES |
UNI | NULL | |
+-------+-------------+------+-----+---------+----------------+
測試:插入數據
INSERT INTO user5(name) VALUES ('cc');
運行 SELECT * FROM user5; 查看結果:
+----+------+
| id | name |
+----+------+
| 1 | cc |
+----+------+
再次插入INSERT INTO user5(name) VALUES ('cc');
出現:ERROR 1062 (23000): Duplicate entry 'cc' for key 'name'
換個試試 INSERT INTO user5(name) VALUES ('aa');
運行 SELECT * FROM user5; 查看結果:
+----+------+
| id | name |
+----+------+
| 3 | aa |
| 1 | cc |
+----+------+
總結一下:
主鍵約束(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.非空約束:
在上面的藍字中已經添加了非空約束: NOT NULL;
name和phone_number都設置了非空,先只設置name參數不設置phone_number參數試一試
INSERT INTO user_test (name) VALUES ('張三');
會出現Field 'phone_number' doesn't have a default value
兩個非空參數一起設置:
INSERT INTO user_test (name,phone_number) VALUES ('張三','12345678901');
+----+------+--------------+
| id | name | phone_number |
+----+------+--------------+
| 1 | 張三 | 12345678901 |
+----+------+--------------+
6.默認約束
CREATE TABLE user6(
id int PRIMARY KEY AUTO_INCREMENT COMMENT'主鍵id',
name VARCHAR(20) NOT NULL COMMENT'用戶姓名不能為空',
phone_number VARCHAR(20) NOT NULL COMMENT'用戶手機號,不能為空',
status INT DEFAULT 0 COMMENT'用戶狀態0:啟用 1:禁封 默認:0'
);
運行DESCRIBE user6;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| phone_number | varchar(20) | NO | | NULL | |
| status | int(11) | YES | | 0 | |
+--------------+-------------+------+-----+---------+----------------+
插入數據:
INSERT INTO user6(name,phone_number) VALUES ('aa','123');
INSERT INTO user6(name,phone_number) VALUES('bb','1234');
INSERT INTO user6(name,phone_number) VALUES('cc','1263456');
查看數據:SELECT * FROM user6;
+----+------+--------------+--------+
| id | name | phone_number | status |
+----+------+--------------+--------+
| 1 | aa | 123 | 0 |
| 2 | bb | 1234 | 0 |
| 3 | cc | 1263456 | 0 |
+----+------+--------------+--------+
我們沒有設置status的值,但是給我們創建了默認值 0.
應用場景:
業務需求:找正常的用戶,對這些正常用戶進行發放優惠卷或者積分之類的東西,而被禁封的用戶我們不讓其參加多動.
我們想要封用戶只要將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'班級名稱'
);
運行DESCRIBE classes;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
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:應用,參考
運行DESCRIBE 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 | |
+----------+-------------+------+-----+---------+----------------+
班級插入數據:
INSERT INTO CLASSES (name) VALUES ('一班');
INSERT INTO CLASSES (name) VALUES ('二班');
INSERT INTO CLASSES (name) VALUES ('三班');
INSERT INTO CLASSES (name) VALUES ('四班');
查看數據 SELECT * FROM classes;
+----+------+
| id | name |
+----+------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
+----+------+
學生插入數據:
INSERT INTO student (name,class_id) VALUES ('小趙',1);
INSERT INTO student (name,class_id) VALUES ('小錢',2);
INSERT INTO student (name,class_id) VALUES ('小孫',3);
INSERT INTO student (name,class_id) VALUES ('小李',4);
查看數據 SELECT * FROM student;
+----+------+----------+
| id | name | class_id |
+----+------+----------+
| 1 | 小趙 | 1 |
| 2 | 小錢 | 2 |
| 3 | 小孫 | 3 |
| 4 | 小李 | 4 |
+----+------+----------+
若是像插入班級為5的數據 如:
INSERT INTO student (name,class_id) VALUES ('小周',
5);
報錯: Cannot add or update a child row
我們刪除正在被學生表引用的'四班'試試:
DELETE classes WHERE name = '四班';
出現:Cannot delete or update a parent row:不能刪除主表中的行
我們先刪除學生表中的 '小李'從而解除班級中'四班'的外鍵約束,再來刪除'四班'(因為小李引用了四班)
DELETE FROM student WHERE name = '小李';
再次刪除classes表中的'四班';
DELETE FROM classes WHERE name = '四班';
最后: SELECT * FROM classes;
+----+------+
| id | name |
+----+------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
+----+------+
'四班'被成功刪除!
總結:
1.主表中沒有的數據,在附表中,是不可以使用的.
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 | |
+-------+-------------+------+-----+---------+----------------+
modify只能改字段數據類型完整約束,不能改字段名,但是change可以。