MySQL是一種關系資料庫管理系統,關系資料庫将資料儲存在不同的表中,而不是将所有資料放在一個大倉庫内,這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于通路資料庫的最常用标準化語言。MySQL 軟體采用了雙授權政策,分為社群版和商業版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。
-- 單行注釋
/* 多行注釋 */
第一個字元必須是下列字元之一:
- Unicode 标準 3.0 所定義的字母(Unicode 中定義的字母包括拉丁字母 a-z 和 A-Z,以及來自其它語言的字母字元)。
- 下劃線 (_)、at 符号 (@) 或者數字元号 (#)
後續字元可以是:
- Unicode 标準 3.0 所定義的字母。
- 來自基本拉丁字母或其它國家/地區腳本的十進制數字。
- at符号(@)、美元符号 ($)、數字元号或下劃線。
- 辨別符不能是所用RDBMS的保留字。
- 不允許嵌入空格或其它特殊字元。
1. 建立一個資料庫:
CREATE DATABASE it1997;
重名錯誤:Can’t create database ‘it1997’; database exists
使用資料庫,選擇你要操作的資料庫
USE it1997;
删除資料庫;
drop database it1997;
建立表:
create table 表名 (
列名1 資料類型 限制,
列名2 資料類型 限制,
列名3 資料類型 限制 -- 最後一個列的後面,不要加逗号。
)
CREATE TABLE USER(
u_name CHAR,
u_age INT
);
删除表的結構和所有資料
DROP TABLE USER;
1. 整數:
INT -21億 - +21億
TINYINT 0-255
2. 浮點數:
float
double
decimal(m,d)
m必須大于d, 小數點和(負數)的‘-’符号不包括在M中。
3. 字元串類型:
char(n) n的可用範圍0-255, 無論存儲資料長、短,都是按N的大小來存儲。固定長度 varchar( n) n的範圍
65535 按實際的字元串長度來存儲 + 1,不是固定長度。
text 存儲大的字元串
BINARY 存儲二進制字元串
4. 日期時間類型
date : yyyy-mm-dd
datetime: yyyy-mm-dd hh:mm:ss
TIMESTAMP: 時間戳
為什麼要保證資料的完整性?
為了防止垃圾資料的産生,進而影響資料庫的執行效率!!!
如何保證資料的完整性呢?
可靠性 + 準确性 = 完整性
解決方案:
資料完整性的分類
1.實體完整性
保證一行資料是有效的
2.域完整性
保證一列資料是有效的
3.引用完整性
保證引用的編号是有效的
4.使用者自定義完整性
保證自定義規則
CREATE TABLE t_user(
u_id INT AUTO_INCREMENT PRIMARY KEY,
-- 添加主鍵限制, 一般來講id,都是自動增長的值;
-- 一定是整數類型,從1開始。
-- PRIMARY KEY:主鍵具有 唯一, 非空的特殊。
u_number CHAR(10) UNIQUE, -- 學号必須唯一。
-- UNIQUE:隻有唯一性, 允許為空。
u_name CHAR(50),
u_age TINYINT -- 0~255
)AUTO_INCREMENT = 10000;
觸發唯一限制時的錯誤提示:
Duplicate entry ‘xh001’ for key ‘u_number’ 重複值的輸入
觸發主鍵限制時的錯誤提示:
Duplicate entry ‘1’ for key ‘PRIMARY’
為什麼要域完整性
保證指定列的資料的有效性
什麼叫域完整性?
域完整性是指定列的輸入有效性
實作方法
非空限制:Not Null
預設限制:Default
學生表
CREATE TABLE t_user(
u_id INT AUTO_INCREMENT PRIMARY KEY,
u_number CHAR(10) UNIQUE NOT NULL, -- 學号
-- NOT NULL ,不允許為空;
u_name CHAR(50),
u_age TINYINT,
u_sex CHAR(1) DEFAULT "男"
)DEFAULT CHARSET = utf8 AUTO_INCREMENT = 10000;
-- DEFAULT CHARSET=utf8 設定字元編碼
成績表
CREATE TABLE t_score(
s_id INT AUTO_INCREMENT PRIMARY KEY,
s_u_number CHAR(10), -- 學生的學号,設計為外鍵, 需要和學生表的學号關鍵
s_yw DECIMAL(5,2) NOT NULL, -- 國文成績
s_sx DECIMAL(5,2) NOT NULL, -- 數學成績
-- 添加外鍵限制 FOREIGN KEY
-- CONSTRAINT(限制) FOREIGN KEY(外鍵列名) REFERENCES(參照) 主表名(主鍵名)
CONSTRAINT FOREIGN KEY(s_u_number) REFERENCES t_user(u_number)
)DEFAULT CHARSET = utf8;
添加外鍵限制失敗:
Cannot add foreign key constraint
原因:
- 從表的外鍵的資料類型與主表主鍵不一緻
- 寫錯了外鍵名,主表名,主鍵名中任何一個。
觸發外鍵限制時,的錯誤提示資訊
Cannot add or update a child row: a foreign key constraint fails
(外鍵限制失敗) (
.
it1997
, CONSTRAINT
t_score
FOREIGN KEY (
t_score_ibfk_1
) REFERENCES
s_u_number
(
t_user
))
u_number
- 從表添加資料時,不能添加主表沒有的資料;
- 從表修改資料時,不能設定主表沒有的資料;
- 主表要删除,修改主鍵的資料時,不能删除、修改從表中使用了的資料行。
DML 修改資料
1. 删除表
DROP TABLE t_user;
Cannot drop table ‘t_user’
referenced by a
foreign key constraint ‘t_score_ibfk_1’ on table ‘t_score’.
- 通過外鍵限制連接配接在一起的表不能被删除。
- 在删除表之前,必須先删除限制。 或 先删除從表
2. 複制表
CREATE TABLE user_bk SELECT * FROM t_user;
CREATE TABLE score_bk SELECT * FROM t_score;
-- 複制表,不能複制表的限制。 隻能複制表結構和資料
隻複制表結構,不要資料
CREATE TABLE user_bk_str SELECT * FROM t_user WHERE 1=0;
3. 插入新的資料
-- INSERT INTO <表名> (<列名清單>)
-- VALUES (<值清單>)
全字段插入:
INSERT INTO t_user(u_id,u_number,u_name,u_age,u_sex)
VALUES(NULL,10001,'張三', 24, DEFAULT);
– null 對應自動增長的值,
– default 對應預設值;
– 插入的值,必須與字段清單一一對應。
INSERT INTO t_user(u_id,u_number,u_name,u_age,u_sex)
VALUES(10003,10002,'李四', 23, '女');
INSERT INTO t_user(u_name,u_age,u_sex,u_id,u_number)
VALUES('王二小', 15, '女',10004,10003);
全字段插入時,省略字段清單:
值的順序,按照建立表的列的先後來安排值。
INSERT INTO t_user
VALUES(10005,10004,'王小三', 18, '女');
INSERT INTO t_user
VALUES(NULL,10005,'王小4', 18, '女');
插入多行資料的方法:
INSERT INTO t_user
VALUES
(NULL,10006,'蘇小姐',18,'女'),
(NULL,10007,'蘇二姐',19,'女'),
(NULL,10008,'蘇大姐',20,'女');
插入指定列的資料
INSERT INTO t_user(u_number,u_name,u_age)
VALUES(10009,'秋實', 19);
-- Column 'u_number' cannot be null, u_number 設定了null.
INSERT INTO t_user(u_name,u_age,u_number)
VALUES('秋實3','323','12122');
修改 更新資料
update 表名 set 列名=‘值1’,列名2=‘值2’,… where 表件表達式;
如何沒有where,就會把所有行都修改。
UPDATE t_user SET u_number = '10010' WHERE u_name = '秋實2' AND u_age = 19;
UPDATE t_user SET u_number = '10011' WHERE u_id = '10012';
UPDATE t_user SET u_number = '10012',u_age = 27 WHERE u_id ='10014';
UPDATE t_user SET u_sex = '0';
删除姓名叫王小4的名稱
UPDATE t_user SET u_name = NULL WHERE u_name='王小4';
-- update t_user set u_id = null where u_id=10000;
如果要删除某列的值,隻需要将該列設定為NULL即可。當然,這樣做的前提是該列允許為空,即沒有非空限制。
4. 删除表的資料;
4.1 delete删除表的資料;不能删除表的結構;
delete from 表名 where 條件表達式;
删除user_bk中, 11号學生
DELETE FROM user_bk WHERE u_number = '11'; -- 删除滿足條件的資料行
DELETE FROM user_bk ; -- 沒有條件時,删除所有的資料行;
4.2 truncate 删除表的所有資料
TRUNCATE user_bk;
4.3 drop table 删除表的所有資料及表的結構
delete from 與truncate 的差別:
DELETE會記錄日志,意味着删除後的資料還可以恢複,但是效率低。
TRUNCATE不會記錄日志,删除後的資料不能恢複,但是效率高。
TRUNCATE不能用于有外鍵限制引用的表。
DELETE FROM t_user WHERE u_number = 10001;
Cannot delete or update a parent row: a foreign key constraint fails
(`it1997`.`t_score`, CONSTRAINT `t_score_ibfk_1` FOREIGN KEY (`s_u_number`)
REFERENCES `t_user` (`u_number`))
Joker:世界對弱者的無情,比任何盾牌還要堅固!