1. 程式人生 > >MySQL及SQL語句筆記

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(表示式)