MySQL及SQL語句筆記
除了用;結束語句,還可以使用\G
啟動MySQL服務
1 命令列形式管理window的Mysql
net start MySQL net stop MySQL
2 通過命令列直接進入MySQL目錄下bin目錄的mysqld.exe即可
3可以直接通過window提供的服務管理來操作MySQL服務。
通過命令列連線MySQL資料庫
可以將mysql的bin目錄添入命令汗的Path中,即可在命令列中直接操作。
右鍵我的電腦-屬性-高階系統設定-高階-環境變數-找到變數Path-編輯-在結尾處新增一個分號和路徑即可。
mysqld可以正常執行後,就可以使用客戶端來訪問操作了。
具體操作:
-h添上主機ip,-P(大寫的P)寫上埠號,-u使用者名稱,-p(小寫)密碼,可以直接輸入明文密碼,也可以回車之後輸入密文。
連線成功後:
後與直接操作mysql給我們提供的命令列操作工具是一樣的。
SQL分類
SQL分類
1 資料操作(管理)語言 DML
查詢,獲得資料 DQL
管理,增加,刪除,修改資料DML
2 資料定義語言(對儲存資料的格式進行定義)DDL
3 資料庫控制語言(針對資料庫軟體服務進行操作) DCL
識別符號(資料庫名)命名規則
大小寫取決於當前作業系統。原則上認為是區分大小寫的。
推薦使用下劃線的方式,不用駝峰法,因為大小寫的問題。
識別符號的字元:
原則上可以使用任意字元,數字,符號,甚至是中文。但是一些特色的組合,例如純數字組合,特殊符號,包括mysql是內部關鍵字,應該使用識別符號限定符來包裹,就可以使用了。
限定符:反引號` 就是鍵盤1234左邊的那個波浪線小寫。
表的建立和操作
表的建立
可以直接通過語法,致命資料表所屬的資料庫
語法:庫名.表名 這樣寫來代替原先的表名即可。
create table 表名 (結構)[表選項]
create table php_one.php_class (
class_no varchar(20),
date_start date
);
列定義:列名 列的資料型別[列的屬性(約束)],
簡單的字串型別:varchar() 有一個引數,表示儲存資料的最大字元長度(不是位元組長度)。
日期型別: date
查看錶
先選擇資料庫。
show tables;
依據表字首查看錶。
show tables [like ‘pattern’];
例如資料庫中有exam_為字首的表,則這樣檢視:
show tables like 'exam_%';
%萬用字元,表示任意字元的任意個數的組合。
資料庫的檢視也可以這樣來。如show databases like ‘aaa_%’;
檢視某個表的建立資訊
show create table 表名;
檢視資料庫的建立資訊同理。
當遇到客戶端輸出的結構比較混亂的時候。可以\G來代替;作為結束標記。
查看錶結構
describe 表名;
可簡寫成:desc 表名;
刪除表
drop table 表名;
drop table [if exists] 表名;
drop table if exists 表名;
上面同樣使用與database。
修改表
修改表名
rename table old_tbl_name to new_tbl_name;
rename table old_aa to new_aa,old_bb tonew_bb;一條可以連續對多個表名進行修改
支援跨資料庫重新命名。
重新命名相當於剪下貼上。跨資料庫重新命名後,在本資料庫中的表就沒了,出現在了另外一個數據庫。如:rename table php_class to shop php_c;
資料庫不支援重新命名。但是可以將舊資料庫中的表都rename到新的資料庫中,然後在刪除舊的資料庫即可。
修改列定義
增加一個新列
add
修改一個列的定義
modify
刪除一個列
drop
重新命名一個列(不提供直接的重新命名操作)
change
修改表結構,上面的是子命令,上級是,alter table 表名 [add|drop|modify]
新增一列,身高
alter table php_class add height int;
刪除一列,身高
alter table php_class drop height;
修改一個列的定義
alter table php_class modify class_novarchar(40);
重新命名(不提供直接的重新命名操作)
alter table php_class change class_noxuehao int;
交換兩個表的名字
先建立一箇中間表table3;
rename table table1 to table3,table2 totable1,table3 to table2;
修改表選項
alter table 新的表選項
alter table php_class character set utf8;
資料操作(CRUD)
create,read(retrieve) ,update ,delete
插入資料
insert into 表名 (欄位列表) values (值列表);
也可以不寫欄位列表,但是需要值列表中的順序與資料表的欄位順序一致。
insert into php_class(class_no,name,height) values ('php_001','xiaoming',175);
獲得資料
select 欄位 from 表名 where 條件。
select * from php_class; ó select * from php_class where 1; //1表示真。
若用*,則表示所有欄位
查詢條件可省略,表示所有的記錄都獲得。
刪除資料
delete from 表名 where 條件;
delete from php_class where height>190;
刪除不可逆,需要在邏輯上嚴格給條件,否則容易造成誤操作。語法上可以沒有where條件。如果需要刪除所有資料,使用where 1;整張表全沒了。
修改資料
update 表名 set 欄位=新值,欄位=新值,… where 條件;
update php_class set country='China' where1;
where 1即對所有資料操作。
校對規則
什麼是校對規則?在當前編碼下,字元間的比較關係。
show variables;
show variables like ‘character_set%’;
檢視字元編碼相關的變數。
每個字符集都支援不定數量的校對規則。
通常的命名規則是:字符集_語言名_ci|cs”bin
常見的ci不區分大小寫。cs區分大小寫。bin編碼比較
每個字符集都有一個預設的校對規則,如果不指定,就使用該預設的規則。
可以通過如下指令:
show collation;檢視校對規則
show collation like ‘utf8%’;檢視有關utf8的校對規則。
order by
order by關鍵字,可以在獲得資料時,將資料進行按照某個欄位的排序。
select * from 表名 order by 欄位名;
數值型別
數值型
數值型-整數型別
型別 |
位元組 |
最小值(有符號/無符號) |
最大值(有符號/無符號) |
TINYINT |
1 |
-128/0 |
127/255 |
SMALLINT |
2 |
-32768/0 |
32767/65535 |
MEDIUMINT |
3 |
-8388608/0 |
8388607/16777215 |
INT/INTEGE |
4 |
-2147483648/0 |
2147483647 /4294967295 |
BIGINT |
8 |
-9223372036854775808/0 |
9223372036854775807/18446744073709551615 |
可使用unsigned控制是否有正負,如tinyint unsigned 表示無符號的tinyint。
可以使用zerofill來進行前導零填充
也存在布林bool型別,但是就是tinyint(1)的別名。
定義顯示寬度
通過規定資料的顯示寬度,達到統一顯示的目的。
型別(M) 其中M就表示顯示的最小寬度值。如tinyint(3);
需要配合使用前導零填充來達到目的zerofill。
欄位名 tinyint(3) zerofill;
則顯示的時候,不夠3位寬度的前面用0來填充。超過最小寬度的按照真是寬度顯示,不會被擷取。
小數
數值型-小數型別
型別 |
儲存空間(位元組) |
最小值(理論) |
最大值(理論) |
FLOAT |
4 |
-3.402823466E+38 |
3.402823466E+38 |
DOUBLE |
8 |
-1.7976931348623157E+308 |
1.7976931348623157E+308 |
DECIMAL |
變長,大致是每9個數字,採用4個位元組儲存。整數和分數分開計算 |
M,最大是65 D,最大是30 預設是10,2 -(65個9) |
(+65個9) |
可以利用M,D控制數值範圍;可以無符號;
可以zerofill;可以使用科學計數法
DECIMAL定點數,原封不動的存進去。用於高精度的資料。跟浮點數的儲存方式不一樣,浮點數存在精度丟失。
DECIMAL(M,D)
M總位數
D小數位數。
M預設為10,D預設為2。
浮點數:
型別(M,D);
M表示所有數值位數(不包括小數和符號)
D表示允許的小數位數。
float(5,2) 一共5位,小數點佔了2位,double同理。位數不足不影響。超出了就不行。
以float(5,2)為例,123.12可以。1234.12不行,123.123不行。
浮點數支援科學計數法。
1.23E3 表示1.23*10^3。新增資料時可直接用上就行。
日期時間型別
日期時間型別
型別 |
顯示格式 |
取值 |
儲存空間 |
零值 |
DATETIME |
YYYY-MM-DD HH:MM:SS |
'1000-01-01 00:00:00'到'9999-12-31 23:59:59' |
8 |
0000-00-00 00:00:00 |
TIMESTAMP |
YYYY-MM-DD HH:MM:SS |
是‘1970-01-01 00:00:00’到2038-01-19 03:14:07 |
4 |
0000-00-00 00:00:00 |
DATE |
YYYY-MM-DD |
'1000-01-01'到'9999-12-31 |
3 |
0000-00-00 |
TIME |
HH:MM:SS |
-838:59:59'到'838:59:59' |
3 |
00:00:00 |
YEAR |
YYYY |
1901到2155 |
1 |
0000 |
沒有間隔福-也可以,或者使用其他的符號做間隔如‘:’,也可以正確輸入資料。
支援兩位數的年份,時間間隔是1970年到2069年。例如20-01-01表示2020年1月1日。89-01-01表示1989年1月1日。
即70-99 1900年+
00-69 2000年+
但是容易產生歧義,不建議使用。
如果datetime沒有給定具體時間,預設就是00:00:00。
檢索時欄位+0,得到的結果是時間戳。
time型別
表示意義:
1可以表示一天中的時間
2也可以表示時間間隔,在表示間隔時,可以使用天來表示。格式:
D HH:MM:SS 如7 12:34:56 7天12小時34分在資料庫中天會自動換成小時儲存。
D表示天。
year型別
佔用一個位元組。範圍1901-2155
字串型別
字串型別
型別 |
最大長度 |
備註 |
char |
255 |
Char(M),M字元數 |
varchar |
65535,但需要1-2個儲存資訊,同時由於記錄的限制,因此最大為65532 |
編碼不同字元數不同: Gbk<=32767 Utf8<=21845 |
tinyText,text,mediumText,longtext |
L + n。L為最大長度 2^8+1, 2^16+2, 2^24+3, 2^32+4 |
定義時,通常不用指定長度,可以自己計算。 |
enum |
1、2。列舉選項量(65535) |
內部儲存是整型表示。 欄位值只能是某一個 |
Set |
1、2、3、4、8。元素數量:64 |
|
Binary,varbinary,blob |
Binary(char),varbinary(varchar),blob(text) 做類比 |
二進位制資料(位元組而非字元) |
char - varchar
char(M) 固定長度
varchar(M) 可變長度
M表示允許的字串長度。而不是位元組數!!!但是,總的長度的使用是按照位元組計算的。即char,最大的位元組數是255位元組。varchar是65535位元組。即char中,M的最大取值與當前字元編碼有關,M=255/當前編碼一個字元佔用的位元組數。如雙位元組字元gbk佔用2,即char中M最大值為127。varchar同理。通常得到的最大值需要-1,取不到最大值。
varchar的真實長度。varchar特點,當型別資料超過255個字元時,採用2個位元組表示長度,即此時為65535-2。整條記錄需要有個額外位元組,用於儲存當前欄位的null值。除非所有的欄位都不是null,才可以省略這個位元組。所以在建立欄位的時候如果添上notnull那麼就可以多加一個位元組。
M在varchar中的表示,是允許的最大長度。即實際用了多少就是多少。
char內的M表示嚴格限定的長度。不管用了多少,都是佔用那麼多空間。
varchar中會比實際位元組多佔用一個位元組。需要一個位元組儲存字串的總長度。
列舉型別
create table table1(
sex enum(‘famale’,’male’)
);
insert into table1 values(‘male’);
insert into table1 values(‘female’);
插入其他的資料型別就不行了。
雖然看著建立的列舉型別是字串,但是其本質是字串,第一個字串是1,第二個是2。插入1與插入第一個字串型別相同。插入2與插入第二個字串型別相同。。。。。
最多允許65535個列舉量。
set型別
create table table1(
hobby set(‘basketball’ ,’football’ ,’pingpangqiu’,’swim’)
);
與列舉型別不同,這個可以多選,可以當選。
insert into table1 values (’football’ ,’pingpangqiu’);
列屬性
設定多個列屬性,用空格間隔就可以了。
null|notnull 是否為空
規定一個欄位的值是否為null
defaultvalue 欄位預設值
如:default ‘aaa’ 設定預設值為aaa
主鍵:PK ,primary key
可以唯一標識,某條記錄的欄位或者欄位的集合,就是主鍵
主鍵可以是真實實體的屬性。
但是常用的好的解決方案是:利用一個與實體資訊不相關的屬性,作為唯一標識。主鍵與業務邏輯不發生關係,只用來標識記錄。
主鍵唯一,主鍵不能為空。
設定主鍵語法:
兩種方案:
1欄位上設定:
create table table1(
t_id int primary key,
t_name varchar(5),
class_name varchar(6),
days tinyint unsigned
);
2在定義完欄位後,可以定義:
create table table1(
t_id int,
t_name varchar(5),
class_name varchar(6),
days tinyint unsigned
primary key (t_id)
);
這樣定義,可以定義多列主鍵(組合主鍵)。primarykey (欄位1,欄位2…)
一個主鍵上包含了多個欄位
而不是兩個欄位都是主鍵
兩個欄位一起組成了主鍵
一個表只能有唯一一個主鍵。
主鍵最好與實體沒有聯絡,不是實體屬性欄位。
自動增長auto_increment
自動增長是從當前最小值增長1。
可以手動插入值,但如果是主鍵的話,不能重複
可以更新修改值。
為每條記錄提供了一個唯一的標識。
每次插入記錄時,將某個欄位的值自動加1.
需要整型,還需要索引。
可以選擇插入null,也可以不插入。插入null時,資料庫中的值不是null。
自動增長的初始值是1,是可以設定的。
通過表選項:
alter table table1 auto_increment 10;
實體
1一對一
設計:
兩個實體表內,存在相同的主鍵欄位。
如果記錄的主鍵值等於另一個關係表內記錄的主鍵值
則兩條記錄一一對應。
2一對多
一個實體,對應多個其他實體
例如一個班級對應多個學生
設計:
在多的那端,增加一個欄位,用於指向該實體所屬的另外實體的標識
3多對多
設計:
典型的,利用一箇中間表,表示實體之間的對應關係。
將兩個關聯表的主鍵合在一個表內就可以了。中間表的每個記錄,表示一個關係。
外來鍵 foreign key
概念:如果一個實體(php_student)的某個欄位(student:class_id),指向(引用)另外一個實體(php_class)的主鍵,就稱當前student實體的class_id是外來鍵。
被指向的實體,稱之為主實體(主表),也叫父實體(父表)。(php_class)
負責指向的實體,稱為從實體(從表),也叫子實體(子表)。(php_student)
作用:
用於約束處於關係內的實體。
增加子表記錄時,是否有與之對應的父表記錄。
在刪除或者更新主表記錄時,從表應該如何處理相關的記錄。
定義一個外來鍵:
在從表上建立一個外來鍵欄位,指向主表的主鍵。
使用關鍵字foreign key。
foreignKey (外來鍵欄位) references 主表名(關聯欄位) [主表記錄刪除時的動作] [主表記錄更新時的動作]
set names gbk; //奇怪,沒這個,漢字插不進去。
drop table if exists php_class;
create table php_class(
class_id int primary key auto_increment,
class_name varchar(10) not null default'itcast_php' comment '班級名稱'
)characterset utf8 ;
create table php_student(
stu_id int primary key auto_increment,
stu_name varchar(10) not null default '',
class_id int,
foreign key (class_id) references php_class (class_id)
) character set utf8;
insert into php_class values (1,'php0331');
insert into php_student values (null,'張三丰',1);
設定級聯操作
在主表資料發生改變時,與之關聯的從表資料應該如何處理:
兩大類:
主表更新
主表刪除
使用關鍵字:
on update
on delete
來標識
允許的級聯動作
cascade:關聯操作,如果主表被更新或刪除,那麼從表也會執行相應的操作。
set null:設定為null,表示從表不指向任何主表記錄。
restrict:拒絕主表的相關操作。
ondelete 和on update 是可以同時出現的。但是一個on delete或on update只能有一個級聯動作。
- - - - - - - - - - - - - - - -- set null- - - - - - - - - - - - - - - - - - - -
修改這個外來鍵:
先刪除,在新建,通過修改表來完成。
alter tablephp_student drop foreign key php_student_ibfk_1;(通過show create table中的foreign資訊獲得)
執行完該操作後,show createtable中,這個資訊就沒了。
刪除外來鍵需要通過制定外來鍵名稱達到目的:
可以通過在建立外來鍵時,制定名稱,或者使用mysql預設生成的名稱。
這樣的操作不會刪除資料,資料仍在,只是這個約束(規則沒了,需要重新在定義)
alter table php_student add foreign key(class_id) references php_class (class_id) on delete set null;
執行完該語句,show create table又能查詢到如下資訊:
CONSTRAINT `php_student_ibfk_1` FOREIGN KEY(`class_id`) REFERENCES `php_class
` (`class_id`) ON DELETE SETNULL
on delete set null 當主表中的記錄被刪除後,從表中的對應記錄的外來鍵值變為null。
建議使用set null。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - -
- - - - - - - - - - - -- - - - -- - -cascade- - - - - - - - -- - - - - - - - --
大體同上
alter table php_student drop foreign keyphp_student_ibfk_1;
alter table php_student add foreign key(class_id) references php_class (class_id)on delete cascade;
on delete cascade當主表中的記錄被刪除後,從表中對應記錄也被刪除。
alter table php_student add foreign key(class_id) references php_class (class_id) on update restrict;
- - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - -- - - - - -
- - - - - - - - - - - - -- restrict- - - - -- - - - - - - - - - - - - -- - - - - - -- -
on update
指的是隻有主表的主鍵發生變化,才會對從表發生影響。
alter table php_student add foreign key(class_id) references php_class (class_id) on update restrict;
這條語句,不允許主表中的相關操作。主表一更新就報錯。
- - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - -- - - - - -
php程式設計師一般不使用外來鍵關聯。
儲存引擎
修改表的儲存引擎:
alter table 表名 engine 儲存引擎名;
alter table table1 engine myisam;
或者在建立表的時候寫上
create table table1(
……
) engine myisam或innodb;
count()
select count(*) from memberlist;
select count(id) from memberlist; //count(表示式)