首先,創建表以及插入數據
create table t_text(id int primary key auto_increment,name varchar(20) unique not null,gender char(5) not null check(gender in ("男","女")),deed varchar(255) not null default "事例不詳");
insert into t_text (id, name, gender, deed) VALUES
(1, '賈寶玉', '男', '榮國府的公子,與林黛玉的愛情故事令人唏噓。'),
(2, '林黛玉', '女', '才情出眾,多愁善感,最終因病早逝。'),
(3, '薛寶釵', '女', '賢淑端莊,最終與賈寶玉成婚。'),
(4, '孫悟空', '男', '齊天大圣,保護唐僧西天取經,神通廣大。'),
(5, '唐僧', '男', '取經團隊的核心人物,慈悲為懷。'),
(6, '豬八戒', '男', '貪吃懶惰,但也有勇有謀,是孫悟空的得力助手。'),
(7, '沙僧', '男', '忠誠老實,負責挑擔和保護唐僧。'),
(8, '劉備', '男', '蜀漢開國皇帝,仁德之君。'),
(9, '關羽', '男', '忠義之士,武藝高強,被尊為武圣。'),
(10, '張飛', '男', '勇猛善戰,性格豪爽。'),
(11, '諸葛亮', '男', '蜀漢丞相,智慧過人,被譽為臥龍先生。'),
(12, '宋江', '男', '梁山泊首領,人稱及時雨。'),
(13, '林沖', '男', '八十萬禁軍教頭,武藝高強。'),
(14, '武松', '男', '打虎英雄,性格剛烈。'),
(15, '魯智深', '男', '花和尚,力大無窮,行俠仗義。');
1.數據庫約束
1.1主鍵約束
primary:主鍵約束
auto_increment:自增屬性
一個表中只能有一個主鍵,主鍵字段非空且唯一,主鍵是一個表中唯一確定一行數據的字段。???
當建立主鍵約束時,MySQL為主鍵創建對應的索引——主鍵索引,主鍵約束名總為PRIMARY。 ????
主鍵約束還有一種寫法:
create table t_text(id int auto_increment,name varchar(20),primary key(id));
插入數據測試:
insert into t_text values(1,"曹操","男","寧可我負天下人,不可天下人負我");
insert into t_text values(16,"曹操","男","寧可我負天下人,不可天下人負我");
delete from t_text where id = 16;-- 刪除id為16的語句# 因為有auto_increment自增屬性,可以寫null
insert into t_text values(null,"曹操","男","寧可我負天下人,不可天下人負我");# 因為存在自增,所以可以這樣寫
insert into t_text(name,gender,deed) values("華佗","男","在世神醫");
測試結果:
代碼報錯:主鍵非空且唯一,id為1已經存在,所以報錯。
1.2唯一約束
唯一約束的作用,是保證該字段的值是唯一的,值不允許重復。
unique:唯一約束
唯一約束條件確保所在字段或者字段組合不出現重復值
唯一性約束條件的字段允許出現一個NULL
同一張表內可建多個唯一約束
唯一約束可由多列組合而成
建唯一約束時MySQL會為之建立對應的索引——唯一索引。
如果不給唯一約束起名,該唯一約束默認與列名相同。
唯一約束的另一種寫法:
create table t_text(id int auto_increment,name varchar(20),primary key(id),unique(name));
插入數據測試:
insert into t_text values(null,"曹操","男","寧可我負天下人,不可天下人負我");
insert into t_text values(null,"項羽","男","虞姬的真愛");
測試結果:(在測試主鍵約束的時候我們已經插入了一條name為"曹操"的數據)
代碼報錯:已經存在name="曹操"的數據,而name為unique,該值是唯一的,所以該條插入語句報錯。
1.3默認值約束
給給定的字段設置默認值
?默認值約束的寫法:
create table t_text(id int primary key auto_increment,name varchar(20) unique,deed varchar(255) default "事例不詳");
插入數據測試:
# 存在自增,id可以寫default
insert into t_text values(default,"劉禪","男","扶不起的阿斗");# 存在默認值約束,deed可以寫成default
insert into t_text values(default,"孫尚香","女",default);# 可以不寫id、deed,id默認自增,deed為默認值
insert into t_text(name, gender) values("孫臏","男");
測試結果:?
1.4非空約束
不允許字段的值為空
create table t_text(id int primary key auto_increment,name varchar(20) unique not null,gender char(5) not null,deed varchar(255) not null default "事例不詳");
插入數據測試:
# id、deed,都有默認值
insert into t_text(name, gender) values("趙云","男");# gender存在非空約束,又沒有默認值約束,這里沒有gender會報錯
insert into t_text(name,deed) values("馬超","西涼猛將,曾與張飛大戰不分勝負,后歸順劉備。");# gender存在非空約束,又沒有默認值約束,這里沒有gender會報錯
insert into t_text(gender) values("黃忠");
測試結果:
1.5檢查約束
注:檢查約束在MySQL8之前是不生效的,當然也不報錯
create table t_text(id int primary key auto_increment,name varchar(20) unique not null,gender char(5) not null check(gender in ("男","女")),deed varchar(255) not null default "事例不詳");
插入數據測試:
# gender的值只能為"男"或者"女"
insert into t_text values(null,"貂蟬","美女","以連環計離間董卓與呂布,促成董卓覆滅。");insert into t_text values(null,"貂蟬","女","以連環計離間董卓與呂布,促成董卓覆滅。");
測試結果:
2.修改表的結構---ALTER
修改列類型
?? ?ALTER TABLE 表名 MODIFY 列名 列類型; ? -- 注意存在值的情況,類型不一定能成功
增加列
?? ?ALTER TABLE 表名 ADD 列名 列類型;
刪除列
?? ?ALTER TABLE 表名 DROP 列名;
列改名
?? ?ALTER TABLE 表名 CHANGE 舊列名 新列名 列類型;
更改表名
?? ?ALTER TABLE 表名 RENAME 新表名;
?? ?RENAME TABLE 表名 TO 新表名;
2.1修改列類型
案例:?ALTER TABLE 表名 MODIFY 列名 列類型;
alter table t_text modify gender varchar(5) not null;
?類型修改前:
類型修改后:
注意:修改列類型時,需注意值情況,例如:
首先先添加一列:alter table t_text add number int default 0;
然后試著將gender的類型修改為int類型,將number的類型修改為char類型
alter table t_text modify gender int;-- "男"無法修改為int類型
alter table t_text modify number char(2);
alter table t_text modify number int;
所以,修改時需注意列的值是否可以轉換為該類型
alter table t_text add number int default 0;
desc t_text;alter table t_text modify gender int;alter table t_text modify number char(2);
alter table t_text modify number int;
desc t_text;alter table t_text drop number;-- 刪除列
?剛添加完列:
?修改后:
?2.2增加列
案例:ALTER TABLE 表名 ADD 列名 列類型;
alter table t_text add number int default 0;
?增加列前:
增加列后:

2.3刪除列
案例:ALTER TABLE 表名 DROP 列名;
alter table t_text drop number;
刪除列后:
2.4更改列名
案例:ALTER TABLE 表名 CHANGE 舊列名 新列名 列類型;
alter table t_text change name hero_name varchar(20);
?更改過后:
2.5更改表名
案例:ALTER TABLE 表名 RENAME 新表名;
???????????RENAME TABLE 表名 TO 新表名;
alter table t_text rename t_test;
raname table t_test to t_text;
將 t_text更改為t_test
?將 t_test更改為t_text
3.sql之DML
3.1增加語句
增加語句:給某張表進行數據插入
語法:
insert INTO table_name[(field1 [, field2 ……]) values(value1 [, vaule2 ……]) ?[,()]];
# 插入多條數據
insert into t_text VALUES
(null, '趙云', '男', '長坂坡單騎救主,七進七出曹軍,劉備麾下五虎上將之一。'),
(null, '馬超', '男', '西涼猛將,曾與張飛大戰不分勝負,后歸順劉備。'),
(null, '黃忠', '男', '定軍山斬殺夏侯淵,老當益壯的五虎上將之一。'),
(null, '周瑜', '男', '東吳大都督,赤壁之戰以火攻大破曹操,智勇雙全。'),
(null, '呂布', '男', '武力冠絕天下,但反復無常,最終被曹操處決。'),
(null, '貂蟬', '女', '以連環計離間董卓與呂布,促成董卓覆滅。'),
(null, '司馬懿', '男', '曹魏權臣,多次抵御諸葛亮北伐,奠定晉朝基業。'),
(null, '孫尚香', '女', '孫權之妹,劉備之妻,性格剛烈,善武藝。'),
(null, '龐統', '男', '號“鳳雛”,獻計取西川,中箭身亡于落鳳坡。'),
(null, '董卓', '男', '殘暴軍閥,挾持漢獻帝,后被呂布刺殺。'),
(null, '張遼', '男', '威震逍遙津,曹魏名將,以少勝多擊敗孫權。'),
(null, '徐庶', '男', '劉備早期謀士,因母被曹操挾持而被迫歸曹。'),
(null, '典韋', '男', '曹操護衛,宛城之戰力戰身亡,勇猛過人。'),
(null, '許褚', '男', '曹操虎衛,赤膊戰馬超,以勇力著稱。'),
(null, '荀彧', '男', '曹操首席謀士,戰略家,后因反對稱魏公而自盡。'),
(null, '姜維', '男', '諸葛亮繼承人,九伐中原延續蜀漢大業。'),
(null, '鄧艾', '男', '曹魏名將,偷渡陰平滅蜀漢,功高震主被殺。'),
(null, '鐘會', '男', '與鄧艾共滅蜀漢,后謀反失敗被殺。'),
(null, '袁紹', '男', '官渡之戰敗于曹操,北方割據勢力首領。'),
(null, '華佗', '男', '神醫,為關羽刮骨療毒,后因曹操猜忌被殺。');插入單條數據
insert into t_text values(null,"虞姬","女",default); -- 因為存在自增和唯一約束
insert into t_text(hero_name,gender) values("孫權","男");
3.2刪除語句和TRUNCATE
注意:請注意刪除的條件,如果不帶條件,則刪除全表數據
語法:
delete from table_name [where 條件];? -- 如果不帶條件,清空全表數據
truncate table table_name; --?清空全表,注:truncate刪除數據是不經過數據字典
案例:
delete from t_text where id = 51;
delete from t_text where id = 52;
3.3更新語句
修改表中的數據
語法:
update table_name set 字段1=新值 [, 字段2=新值, 字段3=字段3 + 1] ? [where 條件];
案例:
update t_text set deed = "取經絆腳石" where hero_name = "唐僧";
select * from t_text where hero_name="唐僧";
replace語句
該語句是集更新和插入為一體的一個語句。
如果表中沒有這條數據,則執行插入,否則執行更新。
# 插入
replace into t_text(id, hero_name, gender, deed) values(100, "紅孩兒", "男",default);
select * from t_text where hero_name="紅孩兒";# 更新
replace into t_text(id, hero_name, gender, deed) values(100, "哪吒", "男","風火輪,乾坤圈");
select * from t_text where id=100;