1. 程式人生 > 其它 >朝花夕拾 Mysql筆記1

朝花夕拾 Mysql筆記1

技術標籤:MySQL

朝花夕拾 Mysql筆記1

歡迎掃碼關注微信公眾號"野心與家"回覆"12.11MySQL1"獲取原始檔

點選此處檢視下一篇 : 朝花夕拾 Mysql筆記2

2.1資料庫基礎知識

1.Dos登入

命令:mysql -h hostname -u username -p

例如:mysql -h 123 -uroot -p

簡寫:mysql -u root -p

複合主鍵 就是指你表的主鍵含有一個以上的欄位組成

> create table test 
> ( 
>   name varchar(
19), > id number, > value varchar(10), > primary key (name,id) > )

上面的name和id欄位組合起來就是你test表的複合主鍵
它的出現是因為你的name欄位可能會出現重名,所以要加上ID欄位這樣就可以保證你記錄的唯一性
一般情況下,主鍵的欄位長度和欄位數目要越少越好


2.1.1建立和檢視資料庫
  • 建立資料庫
語法:create database 資料庫名稱;
create database itcast;/*建立資料庫itcast:*/
  • 檢視資料庫
語法:show databases
/*檢視資料庫*/
  • 檢視某個資料庫
語法:show create database 資料庫名稱;
例如:show create database itcase;/*檢視資料庫itcase資訊*/
  • 使用資料庫
語法:use 資料庫名稱;
例如:use itcast;/*使用資料庫itcast*/

2.1.2修改資料庫
  • alter 資料庫名稱;修改資料庫
語法:aliter database 資料庫名稱 default character set 編碼方式 collate 編碼方式_bin
例如:修改資料庫,將資料庫itcast的編碼修改為gbk
> alter database itcast default
character set gbk collate gbk_bin;

2.1.3刪除資料庫
語法:drop database 資料庫名稱;
例如:drop database itcast;/*刪除名稱為itcast的資料庫*/

2.2資料型別

2.2.1 整數型別

1.在MySQL資料庫中,經常需要儲存整數數值。根據數值取值範圍的不同,MySQL中的整數型別可分為5種,分別是
TINYINTtinyint、SMALLINT、 MEDIUMINT、INT和BIGINT。不同整數型別的取值範圍可以根據位元組數計算出來,例如,
TINYINT型別的整數佔用1個位元組,1個位元組是8位,那麼,TINYINT型別無符號數的最大值就是28-1,即255。 同理可以算出其它不同整數型別的取值範圍。

**注意:**在足夠使用的情況下選擇選擇儘量小的資料型別


2.2.2浮點數型別與定點數型別

2.在MySQL資料庫中,儲存的小數都是使用浮點數和定點數來表示的。浮點數的型別有兩種,分別是單精度浮點數型別(float)和雙精度浮點型別(double)。而定點數型別只有decimal,型別。

浮點型:非精準資料型別,有誤差

定點型:精準型別


2.2.3日期與時間型別

3.為了方便在資料庫中儲存日期和時間,MySQL提供了表示日期和時間的資料型別,分別是YEAR、DATE、TIME、DATETIME和timestamp

year:1位元組

例如:year 2014 =‘2014’ p35

‘00’~‘69’ 20?? 58= 2058

‘70’~‘99’ 19?? 89 =1989

1.YEAR型別:(字串型別與數字型別)‘2020’ 2020 ‘00-99’ 1-99

2.DATE型別: ‘2020-06-21’ ‘20200621’

current_data或now()/表示當前日期/

3.TIME型別:表示時間值

格式:HH:MM:SS

current_data或now()表示當前系統時間

4.DATATIME型別

now()表示當前日期和時間

5.TIMESTAMP型別

與DATATIME型別顯示形式相似,但取值範圍比DATATIME型別小


2.2.4 字串和二進位制型別

為了儲存字串、圖片和聲音等資料,MySQL提供了字串和二進位制型別。包括CHAR和VARCHAR型別、BINARY和VARBINARY型別、TEXT型別、BLOB型別ENUM型別、SET型別和BIT型別

1.CHAR和VARCHAR型別:
CHAR和VARCHAR型別都用來表示字串資料,VARCHAR可以儲存可變字串

語法:CHAR(M)或VARVCHAR(M) M指字串的最大長度;

VARCHAR(4)所對應的資料所佔用的位元組數為實際長度加1;

char:浪費時間,但查詢速度快;

varchar:節約空間,但查詢速度慢

‘’‘’4個位元組‘’1個位元組
‘ab’‘ab’4個位元組‘ab’2個位元組
‘abc’‘abc’4個位元組‘abc’3個位元組
‘abcd’‘abcd’4個位元組‘abcd’4個位元組
‘abcdef’‘abcd’4個位元組‘abcd’5個位元組

2.BINARY和VARBINARY型別:
BINARY和VARBINARY型別類似CHAR和VARCHAR型別,不同的是,它們表示二進位制資料

語法:BINARY(M)或VARBINARY(M) M指二進位制資料的最大位元組長度;

注意:BINARY型別的長度是固定的,如果資料的長度不足最大長度,將在資料的後面用"\0"補齊,最終達到指定長度.

例如,指定資料的型別是BINARY(3),當插入a時,實際儲存的資料為"a\0\0",當插入ab時,實際儲存的資料是"ab\0";


3.TEXT型別:

TEXT型別用來表示大文字資料,例如,文章內容、評論等,它的型別分為4種;

資料型別儲存範圍資料型別儲存範圍
TINYTEXT0-255位元組MEDIUMTEXT0-16777215位元組
TEXT0-65535位元組LONGTEXT0-4294967295位元組

4.BLOB型別:
BLOB型別是一種特殊的二進位制型別,它用於表示資料量大很大的二進位制資料,例如 圖片、PDF文件等
資料型別儲存範圍資料型別儲存範圍
TINYBLOB0-255位元組MEDIUMBLOB0-16777215
BIOB0-65535位元組LONGBILOB4294967295

注意:BLOB型別資料是根據二進位制編碼進行比較和排序,而TEXT型別資料是根據文字模式進行比較和排序


5.ENUM型別:

ENUM型別又稱為列舉型別

ENUM(‘值1’,‘值2’,‘值3’,…‘值n’)

注意:MYSQL中存入的是這個順序編號,而不是列表中的值


6.SET型別:

SET型別用於表示字串物件,它的值可以有零個或多個,SET型別資料的定義格式與ENUM型別相似

語法:SET(‘值1’,‘值2’,‘值3’,…‘值n’)

注意:MYSQL中存入的是這個順序編號,而不是列表中的值


7.BIT型別:
用於表示二進位制資料

語法:BIT(M) M用於表示每個值的位數,範圍是1-64;

注意:如果分配的BIT(M)型別的資料的長度小於M,將在資料的左邊用0補齊

例如,為BIT(6)分配值b’101’與分配b’000101’相同


2.3建立資料表

create database student;/*建立名為student*/
use itcase;/*使用資料庫*/
create TABLE tb_grade/*建立名為tb_gradea的資料表*/
(
	id INT(11),/*舉例*/
	name VARCHER(20),
	grade FLOAT
);
show tables;/*驗證資料庫是否建立成功*/ 
show create table tb_greade;/*檢視資料表建立時的定義語句,查看錶的字元編碼*/
describe tb_greade;/*查看錶的欄位資訊,包括欄位名、欄位型別等資訊*/

修改資料表

	1.修改表名;
alter table 表名 rename 新表名;
alter table tb_grade rename(to) grade;
	2.修改欄位名;
alter table 表名 change 舊欄位名 新欄位名 新資料型別;
alter table grade change name username verchar(20);/*name欄位改為username,資料型別保持不變*/
desc greade;/*驗證*/
	3.修改欄位的資料型別;
alter table 表名 modify 欄位名 資料型別;
alter table grade modify id int(20);/**/
	4.新增欄位;
alter table 表名 add 新欄位名 資料型別
	[約束條件][first|after 已存在的欄位名]
alter table grade add age int(10);
alter table grade add age int(10) first;/*新增到第一位*/
alter table grade add age int(10) after id/*新增到id後面*/;
alter table grade add age int(10) not null first;/*不允許為空*/
	5.刪除欄位;
alter table 表名 drop 欄位名;
alter table grade drop age;
	6.修改欄位的排列位置;
alter table 表名 modify 欄位名1 資料型別 first|after 欄位名2;
欄位名1 指要修改位置的欄位;
first是可選引數,指的是將欄位1修改為表的第一個欄位;
after 欄位名2 是將欄位1插入到欄位2後面;
alter table grade modify id int(10) after grade;/*將id欄位插入到grade欄位後面*/

刪除資料表

drop table 表名;
drop table grade;
desc table grade;/*驗證*/

2.4表的約束

  • 防止資料表中插入錯誤的數值,而定義的維護資料庫完整性的規則
約束條件說明
PRIMARY KEY主鍵約束,用於唯一標識對應的記錄(主鍵唯一表示,值不能為空null );
FOREIGN KEY外來鍵約束
NOT NULL非空約束
UNIQUE唯一性約束
DEFAULT預設值約束,用於設定欄位的預設值

2.4.1 主鍵約束;

注意:每個資料表中最多隻能有一個主鍵約束,定義為primary key的欄位不能有重複值且不能為null值

  • 1.單欄位約束
語法: 欄位名 資料型別 PRIMARY KEY
例如:建立一個數據表ex1,並設定id作為主鍵,SQL語句如下:
CREATE TABLE ex1(id INT PRIMARY KEY,
				name VARCHAR(20),
				grade FLOAT);
  • 2.多欄位主鍵
語法:PRIMARY KAY(欄位名1,欄位名2,***欄位名n)
例如:建立一個數據表ex2,在表中將stu_id和course_id兩個欄位共同作為主鍵,SQL語句如下:
CREATE TABLE ex2(stu_id INT,
				course_id FLOAT,
				PRIMARY KEY(stu_id,course_id)
				);

2.4.2非空約束

  • 非空約束指的是欄位的值不能為null,在MySQL中,非空約束是通過NOT NULL定義的;
語法: 欄位名 資料型別 NOT NULL;
例如:CREATE TABLE ex1(id INT PRIMARY KEY,
				name VARCHAR(20) NOT NULL,
				grade FLOAT not null
				);

2.4.3唯一約束

  • 保證資料表中欄位的唯一性,即表中欄位的值不能重複出現
語法: 欄位名 資料型別 UNIQUE;
CREATE TABLE ex1(id INT PRIMARY KEY,
				name VARCHAR(20) NOT NULL,
				grade FLOAT UNIQUE
				);
ID為主鍵,name的欄位不能為空值,grade欄位為唯一值,該值不能重複

2.4.4預設約束

  • 用於給資料表中的欄位新增指定預設值
語法:欄位名 資料型別 DEFAULT 預設值;
例如:CREATE TABLE ex1(id INT PRIMARY KEY,
				name VARCHAR(20) NOT NULL,
				grade FLOAT default 0/*預設值為0*/
				);

2.5設定表的欄位值自動增加

  • 在資料表中,若想為表中插入的新記錄自動生成唯一的ID,可以使用AUTO_INCREMENT約束來實現。
    AUTO_INCREMENT約束的欄位可以是任何整數型別,預設情況下,該欄位的值是從1開始自增的
語法: 欄位名 資料型別 AUTO_INTCREMENT;
例如:建立一個數據表ex5,將表中的id欄位設定為自動增加,SQL語句如下:
CREATE TABLE ex1(id INT PRIMARY KEY AUTO_INCREMENT, 
				name VARCHAR(20) NOT NULL,
				grade FLOAT UNIQUE
				);

2.6索引

2.6.1索引的概念

資料庫的索引好比新華字典的音序表,它是對資料庫表中一列或多列的值進行排序後的一種結構,其作用就是提高表中資料的查詢速度

  • 1.普通索引

    普遍索引是由KEY或INDEX定義的索引,它是MySQL中的基本索引型別,可以建立在任何資料型別中,其值是否唯一和非空 由欄位本身的約束條件所決定。

  • 2.唯一性索引

    唯一性索引是由UNIQUE定義的索引,該索引所在欄位的值必須是唯一的。

  • 3.全文索引/文字/

    全文索引是由FULLTEXT定義的索引,它只能建立在CHAR、VARCHAR或TEXT型別的欄位上,而且,現在只有MyISAM儲存引擎支援全文索引。

  • 4.單列索引

    單列索引指的是在表中單個欄位上建立索引,它可以是普通索引、唯一索引或者全文索引,只要保證該索引只對應表中一個欄位即可。

  • 5.多列索引

    多列索引指的是在表中多個欄位.上建立索引,只有在查詢條件中使用了這些欄位中的第一個欄位時,該索引才會被使用。

  • 6.空間索引

    空間索引是由SPATIAL定義的索引,它只能建立在空間資料型別的欄位上。建立時必須宣告為not null,並且只有MyISAM儲存引擎支援


2.6.2 建立索引

> 1.建立表的時候建立索引

語法:CREATE TABLE 表名(欄位名 資料型別 [完整性約束條件],
  					  欄位名 資料型別 [完整性約束條件],
  					  ...
  					  		欄位名 資料型別
  					  		[UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY
  					  			[別名] (欄位名1 [(長度)] [ASC|DESC])
  					  			);
  • UNIQUE:可選引數,表示唯一索引
  • FULLTEXT:可選引數,表示全文索引
  • SPATIAL:可選引數,表示空間索引
  • INDEX和KEY:用來表示欄位的索引,二者選一即可
  • ASC和DESC可選引數,ASC表示升序排列,DESC表示降序排列
  • 別名:可選引數,表示建立的索引的名稱
  • 欄位名1:指定索引對應欄位的名稱,
  • 長度:可選引數,用於表示索引的長度
>1.建立普通索引
mysql> create table t2(
    -> id int(11),
    -> name varchar(20),
    -> grade float,
    -> index index(id asc)/*建立名為index的索引,升序排列*/
    -> );
建立後,使用show create table查看錶的結構
	

==show create table t1\G; t1\G 使排列有序
為了檢視索引是否被使用可以使用explain語句進行檢視,SQL程式碼如下:

explain select * from t1 while id=1 \G
>2.建立唯一性索引
mysql> create table t2(
    -> id int(11),
    -> name varchar(20),
    -> grade float,
    -> unique index unique_id(id asc)/*在表中id欄位上建立索引名為unique_id的唯一性索引,並且按照升序排序*/
    -> );
>3.建立全文索引
mysql> create table t1(
    -> id int(11),
    -> name varchar(20),
    -> grade float,
    -> fulltext index fulltext_name(name)
    -> )engine=myisam;/*因為目前只有MyISAM儲存引擎支援全文索引*/
>4.建立單列索引
mysql> create table t4(
    ->name varchar(20) not null,
    -> score float,
    -> index single_name(name(20))/*在name欄位上建立一個名叫single_name的單列索引索引長度為20*/
    -> );
>5.建立多列索引
mysql> create table t5(
	->id int not null,
    ->name varchar(20) not null,
    -> score float,
    -> index multi(id,name(20))/*在id和name欄位上建立一個名叫multi的多列索引*/
    -> );

注意:在多列索引中,只有查詢條件中使用了這些欄位的第一個欄位時多列索引才會被使用

>6.建立空間索引
mysql> create table t6(
	->id int,
    ->space geometry not null,
    ->spatial index sp(space)/*在space欄位上建立一個名為sp的空間索引*/
    ->)engine=myisam;

注意:建立空間索引時,所在欄位不能為空值,並且表的儲存引擎為myisam


2.使用CREATE INDEX語句在已經存在的表上建立索引

語法CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 
	ON 表名 (欄位名 [(長度)] [ASC|DESC]);
mysql> create table book(
    -> bookid int not null,
    -> bookname varchar(255) not null,
    -> authors varchar(255) not null
    -> info varchar(255) null,
    -> comment varchar(255) null,
    -> publicyear year not null
    -> );
>1.建立普通索引
mysql> create index index_id on book(bookid);/*在book表中的bookid欄位上建立一個名為index_id的普通索引*/
mysql> show create table book\g;/*檢視資料表結構*/
>2.建立唯一性索引
create unique index uniqueidx on book(bookid);
/*在bookid欄位上建立一個名為uniqueidx的唯一性索引*/
>3.建立單列索引
create index singleidx on book(comment);
/*在comment欄位上建立一個名稱為singleidx的單列索引*/
>4.建立多列索引
create index mulitidx on book(authors(20)),info(20));
/*在authors和info欄位上建立一個名稱為mulitidx的多列索引*/
>5.建立全文索引
create fulltext index fulltextidx on book(info);
/*在info欄位上建立名為fulltextidx的全文索引*/
>6.建立空間索引
create table t7(
				g geometry not null
				)engine=myisam;
create spatail index spatidx on t7(g);/*在g欄位上建立名稱為spatidx的空間索引*/

3.使用ALTER TABLE 語句在已經存在的表上建立索引

語法:ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX  
					索引名 (欄位名[(長度)] [ASC|DESC] )
create table book(
				  bookid int not null,
				  bookname varchar(255) not null,
				  authors varchar(255) null,
				  comment varchar(255) null,
				  pubblicyear year not null
				  );
>1.建立普通索引
alter table book add index id(bookid);
>2.建立唯一性索引
alter table book add unique uniqueidx(bookid);
>3.建立單列索引
alter table book add index singleidx(comment(50));
>4.建立多列索引
alter table book add index multidx(authors(20),info(50));
>5.建立全文索引
alter table book add fulltext index fulltextidx(info);
>6.建立空間索引
create table t8(
				space geometry not null
				)engine=myisam;
alter table t8 add spatial index spatidx(space);

2.6.3刪除索引

> 1.使用alter table刪除索引

語法:alter table 表名 drop index 索引名;

例如: 刪除表book中名叫fulltextidx的全文索引
alter table book drop index fulltextidx;

> 2.使用 drop index刪除索引

語法:drop index 索引名 on 表名;

3.1新增資料

> 3.1.1為表中所有欄位新增資料;

> 1.insert語句中指定所有欄位名

向表中新增新記錄時,可以在insert語句中列出表中的所以欄位名;

注意:必須列出表中所以的欄位名稱,"值1,值2,…"的順序,型別必須與對應的欄位相匹配

語法:insert into 表名(欄位名1,欄位名2,...)
	values(1,2,...);
  • 驗證資料是否成功使用select語句檢視student表中的資料
select * from 表名;
> 2.insert語句中不指定欄位名

注意:由於insert語句中沒有指定欄位名,新增的值的順序必須和欄位在定義的順序相同

語法: insert into 表名 values(1,2,...);

>3.1.2為表中指定的欄位新增資料

語法: insert into 表名(欄位1,欄位2,...)
			values(1,2)

>3.1.3同時新增多條記錄

語法:insert into 表名 [(欄位名1,欄位名2,...)]
			values(1,2,...),
			(1,2,...),
			(1,2,...);
例如:
	向student表中新增三條新紀錄,insert語句如下:
mysql> insert into student values
	-> (6,'lilei',99),
	-> (7,'hanmeimei',100),
	-> (8,'poly',40.5);

3.2更新資料

語法:

update 表名
	set欄位名1=1[,欄位2=2,...]
	[where條件表示式]
> 1.update 更新部分資料
例如:更新student表中id欄位值為1的記錄,將記錄中的name欄位的值更改為'caocao',grade欄位的值更改為50;
mysql> update student
	> set name='caocao',grade=50
	> where id=1
> 2.update 更新全部資料
例如:將student表中全部記錄,將grade欄位值都變為100:
>update student
>set grade=100

3.3 刪除資料

delete from 表名[where 條件表示式]
>1.刪除部分資料
>delete from 表名
>where 條件表示式
例如:刪除表student上id欄位上小於4的記錄
>delete from student
>where id<4;
>2.刪除全部資料
>1.delete
delete from 表名;
>2.truncate
truncate from 表名;

區別:

  1. delete語句後跟where子句,可以刪除部分記錄,truncate只能刪除表中全部記錄
  2. delete語句刪除資料後,再次向表中增加記錄時,自動增加欄位的值為刪除時該欄位的最大值加1,truncate語句刪除資料後,自動欄位的預設初始值重新由1開始;