MySQL从入门到精通之sql语言---(9月2日更新)
SQL語言
- 數據庫基本操作
- 對數據庫操作----
- 數據表的操作
- 創建表
- 創建表的其他方式-----
- 為表增加計算列---9.2更新ing
- 對數據表做一些約束
- 主鍵約束------
- 外鍵約束------
- 外鍵策略
- 外鍵策略1
- 外鍵策略2
- 非空約束與唯一約束------
- 唯一約束和主鍵約束的區別-----
- 設置字段自動增長
- 檢查約束---
- 查看表的結構
- 修改表名
- 修改表中字段的數據類型
- 修改表中字段的字段名
- 為表和字段取別名
- 添加字段
- 刪除字段
- 修改字段位置
- 修改表的存儲引擎
- 刪除表
- 刪除表操作中有 無if exists 的區別
- MySQL的binlog有有幾種錄入格式?分別有什么區別?
數據庫基本操作
針對數據庫操作的知識主要有----
通用格式----輸入完sql語言之后 要用 ;(分號 ) 結尾;
對數據庫操作----
登錄數據庫—
格式----mysql -h 數據庫地址 -u 用戶名 -p 密碼
(密碼一般不顯式的輸入,而是回車隱式的輸入)
查看數據庫----
show databases;
格式-----show databases;
使用數據庫------
use gavin;
格式----- use 數據庫名 ;
出現 Database changed 說明操作成功;
查看數據庫中包含多少張表-------
show tables;
格式----show tables;
創建數據庫
create database gavin;
格式----create database 數據庫名;
創建數據庫是在系統磁盤上劃分一塊區域用于數據的存儲和管理;
數據庫名不能重復
刪除數據庫
drop database gavin;
格式—drop database 數據庫名
出現Query OK表示操作成功
用DROP DATABASE聲明刪除數據庫后,數據庫中存儲的所有數據表和數據也將一同被刪除,而且不能恢復。
查看創建的數據庫的詳細信息–
show create database gavin;
格式—show create database 數據庫名;
查看數據庫的表結構信息
select distinct(engine) from information_schema.tables;
格式----select distinct(engine) from information_schema.tables;
這里要知道初始化的時候每個表的是用來干嘛的-------
除了自己建立的數據庫之外還會有三個主要的自帶數據庫
名字分別為information_schema、mysql、performance_schema、
information_schema數據庫
提供訪問數據庫元數據的方式-------如數據庫名或表名,列的數據類型,或訪問權限等
確切說information_schema是信息數據庫。保存著關于MySQL服務器所維護的所有其他數據庫的信息。在INFORMATION_SCHEMA中,有數個只讀表。它們實際上是視圖,而不是基本表;
這也驗證了該數據庫是屬于試圖性質的-----多張表的融合體
里面包含多張表-----
SCHEMATA表:提供了當前mysql實例中所有數據庫的信息。
TABLES表:提供了關于數據庫中的表的信息(包括視圖)。
等等
mysql數據庫
這個是mysql的核心數據庫,負責存儲數據庫的用戶、權限設置、關鍵字等mysql自己需要使用的控制和管理信息。不可以刪除,
常用的為user表,用于管理用戶權限等相關操作;
如果對mysql不是很了解,也不要輕易修改這個數據庫里面的表信息。
performance_schema數據庫
一個性能優化的引擎:功能默認為關閉狀態:
數據表的操作
在創建表的時候要考慮字段用什么數據類型以盡可能優化表的存儲性能;
創建表
在創建表之前要選擇數據庫,不然不知道在那個庫里創建,
案例----
創建一個員工信息表-----
基本語法格式-----
create table 表名 (
字段名1 數據類型(長度限制),
字段名2 數據類型(長度限制)
);
當然還可以對表中數據做一些其他限制;
查看剛剛創建的表的信息
創建表的其他方式-----
源表—
mysql> select * from userinfo where fruitname regexp 'an{1}'; +------+----------+--------+-------+--------+-----------+ | id | name | gender | score | height | fruitname | +------+----------+--------+-------+--------+-----------+ | 1005 | 古力娜華 | 女 | 145.6 | 166.7 | orange | | 1007 | Jack | 女 | 100.4 | 198.7 | banana | | 1009 | 李二狗 | 男 | 123.4 | 178.9 | orange | | 1010 | 王建國 | 男 | 120.9 | 166.4 | banana | +------+----------+--------+-------+--------+-----------+ 4 rows in set (0.00 sec)比如要想將查詢后的數據以一張表的形式保存下來-----
> create table userinfo3 as select * from userinfo where fruitname
regexp ‘an{1}’;
如果只想要字段信息,不想要數據,則可以如下操作—
> create table userinfo4 as select id ,name ,gender, height,score from
userinfo where 1=4 ; *where 條件處為false即可 *
為表增加計算列—9.2更新ing
即表中的某一列的值是通過別的列計算得來的;
格式----字段名 數據類型 generated always ( 計算列表達式 ) as virtual
virtual 可以省略
mysql> create table testnum (-> a int ,-> b int ,-> c int generated always as (a*b) virtual-> ); Query OK, 0 rows affected (0.08 sec)mysql>mysql> insert into testnum (a,b) values(12,16); Query OK, 1 row affected (0.02 sec)mysql> select * from testnum; +------+------+------+ | a | b | c | +------+------+------+ | 12 | 16 | 192 | +------+------+------+ 1 row in set (0.00 sec)mysql> create table testnum1 (-> a int ,-> b int ,-> c int generated always as (a*b)-> ); Query OK, 0 rows affected (0.05 sec)mysql> insert into testnum1 (a,b) values(12,16); Query OK, 1 row affected (0.04 sec)mysql> select * from testnum1; +------+------+------+ | a | b | c | +------+------+------+ | 12 | 16 | 192 | +------+------+------+ 1 row in set (0.00 sec)基本語法格式:
show create table 表名 ;
輸出的內容包含創建的表的結構(字段名和數據類型,數據限制以及表的其他信息------存儲引擎,數據編碼格式等)
向表中錄入信息----
格式一------
insert into 表名 values(各字段對應的數據類型);
格式二------
insert into 表名 (字段名,字段名,…)values(各字段對應的數據類型);
注意:插入的數據類型要和字段數據類型相匹配;
有時為了提高效率會選擇一次錄入多條記錄;
細節----文本類型的數據要用單引號引用;
查看數據表中的信息----
格式-----select * from 表名
以上是查看數據表中的全部信息,可以根據自己需要查看部分數據;
格式------select 字段名1,字段名2… from 表名
對數據表做一些約束
先來看創建表的時候----
主鍵約束------
主鍵約束(Primary Key Constraint)要求主鍵列的數據唯一,并且不允許為空。主鍵能夠唯一地標識表中的一條記錄,可以結合外鍵來定義不同數據表之間的關系,并且可以加快數據庫查詢的速度。主鍵和記錄之間的關系如同人和身份證之間的關系,它們之間是一一對應的。
單字段主鍵----
添加主鍵的方式----
格式一------- 在指定字段信息的時候添加主鍵約束----
字段名1 數據類型 primary key
格式二------
在所有字段信息指定完畢后在添加主鍵約束-----
字段名1 數據類型 ,primary key(字段名1)
除了上述是定一個字段為主鍵外還可以指定多個字段為主鍵
多字段聯合主鍵
方式跟指定一個字段為主鍵的方式二一樣,指定了多個主鍵;
而方式一只適用于指定一個主鍵的情況----不然指定多主鍵報錯;
注意--------
并不是每一個表中都需要主鍵,一般多個表之間進行連接操作時需要用到主鍵。因此并不需要為每個表建立主鍵,而且有些情況最好不使用主鍵。
外鍵約束------
外鍵用來在兩個表的數據之間建立連接,可以是一列或者多列。一個表可以有一個或多個外鍵。
外鍵對應的是參照完整性,一個表的外鍵****可以為空值,若不為空值,則每一個外鍵值必須等于另一個表中主鍵的某個值。
外鍵:首先它是表中的一個字段,雖可以不是本表的主鍵,但要對應另外一個表的主鍵。外鍵的主要作用是保證數據引用的完整性,定義外鍵后,不允許刪除在另一個表中具有關聯關系的行。外鍵的作用是保持數據的一致性、完整性
定義外鍵的格式----
在所有字段定義完畢之后-----
constraint 外鍵名 foreign key(子表字段名) references 主表名(主表主鍵字段名)
所以外鍵其實至少對應兩張表-----
父表----含有相關字段中主鍵所在的那張表
子表-----含有相關字段中外鍵所在的那張表
創建主表---- 創建子表-----
當然一個表中的主鍵也可以是另一個表中的外鍵,主鍵和外鍵可以指定多個
,但都是一一對應的關系;
設置完畢主鍵和外鍵之后,就相當于將兩張表聯系起來了,子表的外鍵必須關聯父表的主鍵,且關聯字段的數據類型必須匹配(即int 對int,而不能int 對char )
外鍵約束的兩個表之間存儲引擎必須一樣;
外鍵策略
建主表----
id ------學號 主鍵約束
name------ 學生姓名 非空
gender--------學生性別 只有男,女
cid------學生班級 檢查約束[1,8]
插入數據-----
INSERT INTO `s_class`(`id`, `NAME`, `gender`, `cid`) VALUES (1001, '張三', '男', 1); INSERT INTO `s_class`(`id`, `NAME`, `gender`, `cid`) VALUES (1002, '李四', '男', 2); INSERT INTO `s_class`(`id`, `NAME`, `gender`, `cid`) VALUES (1003, '李二狗', '女', 2); INSERT INTO `s_class`(`id`, `NAME`, `gender`, `cid`) VALUES (1004, '王大川', '男', 3); INSERT INTO `s_class`(`id`, `NAME`, `gender`, `cid`) VALUES (1006, '王中仁', '男', 5);建從表----
id ------學生學號-------主鍵約束,自增
name---- 學生姓名 -----非空
cid2----學生班級 -------外鍵約束,默認3班
插入數據-----
-----正常插入數據 INSERT INTO `s_student`(`id`, `name`, `cid`) VALUES (1001, '張三', 1); INSERT INTO `s_student`(`id`, `name`, `cid`) VALUES (1003, '李二狗', 2); INSERT INTO `s_student`(`id`, `name`, `cid`) VALUES (1006, '王中仁', 5);----當插入的數據---id 在s_class 中不存在時就會報錯mysql> insert into s_student values(1010,'王二麻子',2); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`gavin`.`s_student`, CONSTRAINT `fk_sc_ss` FOREIGN KEY (`id`) REFERENCES `s_class` (`id`))/*所以要先先在主表中添加數據然后從表才能添加*/ mysql> insert into s_class values(1010,'王二麻子',null,2); Query OK, 1 row affected (0.01 sec)mysql> insert into s_student values(1010,'王二麻子',2); Query OK, 1 row affected (0.01 sec)mysql>如果要想在子表中刪除數據
當條件為非外鍵刪除數據時---------
會報錯------不能夠刪除或者更新父表的記錄
嘗試條件為外鍵字段刪除數據-----
mysql> delete from s_student where id=1010; Query OK, 1 row affected (0.01 sec)mysql>并沒有報錯;
在父表中進行上述操作--------
mysql> delete from s_class where cid=5; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`gavin`.`s_student`, CONSTRAINT `fk_sc_ss` FOREIGN KEY (`id`) REFERENCES `s_class` (`id`)) mysql> delete from s_class where id=1006; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`gavin`.`s_student`, CONSTRAINT `fk_sc_ss` FOREIGN KEY (`id`) REFERENCES `s_class` (`id`))發現都報錯了,說明 如果要想刪除父表中的數據(在父,子表中都存在的關聯數據),必須先在子表中刪除而且條件是根據子表中的外鍵條件進行刪除;
總結----
外鍵策略1
當定義外鍵約束時 默認是 no action—不允許操作(這里是指用戶客戶端那里), 如果要修改只能通過sql語句來操作;
**如果非要刪除子表中的數據,操作思路有兩種, **
1,通過子表的外鍵字段作為條件進行刪除 .
2,修改主表中的相關值(除主鍵/唯一約束)為其他值,刪除之后在修改回原來的值;
**假設現在就要在子表中刪除 王二麻子這條記錄 **
方式一----
方式二-----
mysql> update s_class set name='王er麻子' where id=1010 ; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> delete from s_student where id=1010; Query OK, 1 row affected (0.01 sec)mysql> insert into s_student values(1010,'王二麻子',2); Query OK, 1 row affected (0.01 sec)mysql> delete from s_student where name='王二麻子'; Query OK, 1 row affected (0.01 sec)mysql> update s_class set name='王二麻子' where id=1010 ; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0外鍵策略2
級聯操作—cacade操作,
即先刪除外鍵約束,然后刪除數據,在添加回外鍵約束;
mysql> alter table s_student drop foreign key fk_sc_ss; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> delete from s_student where name='王二麻子'; Query OK, 1 row affected (0.01 sec)mysql> alter table s_student add constraint fk_sc_st foreign key(id) references s_class(id); Query OK, 3 rows affected (0.10 sec) Records: 3 Duplicates: 0 Warnings: 0mysql>非空約束與唯一約束------
創建一個表----
非空約束-----
格式-----
字段名 數據類型 not null;
唯一約束----
格式-------
字段名 數據類型 unique;
約束之間的順序沒什么特別要求,按照習慣來就好;
非空約束和唯一約束根據字面意思就還可以理解,該字段錄入數據的時候不允許為空—即不允許為null,可以是空字符串,不允許重復;
驗證代碼-----
但是有一種情況是----如果不錄入數據,可以指定默認值;
默認約束----
創建表—
插入數據----
查看數據---- 由于沒有錄入性別,則默認按照指定的 男
處理
插入數據的兩種方式-----
第一種是不能使用默認值的;
第二種指定字段插入可以使用默認值
唯一約束和主鍵約束的區別-----
1,對于單主鍵方式創建的表時-------只能由一個主鍵,但是可以有多個字段聲明為unique;
2,主鍵不允許為null,但是唯一約束可以出現null值的存在
3,刪除主鍵是不被允許的,除非取消該字段主鍵資格;
設置字段自動增長
聽名字就知道此種方式是針對整形數據的且是主鍵------
開始建表
一個表只能有一個字段使用auto_increment約束,且該字段必須是主鍵,字段數據類型要求為整型(tinyint,smallint,int,bigint)
格式 -----
字段名 數據類型 primary key auto_increment
插入數據看一下-----
注意-----標準的插入數據的方式為上面插入數據的方式一,mysql中支持方式二,但對于一些數據庫而言可能不支持;
檢查約束—
檢查約束一般用在錄入數據時檢查錄入數據是否是建表人想讓你輸入的-----
比如新建一張表,
name-----姓名,
gender----性別(要求只能為’男’,‘女’)
age--------年齡(在18到30之間)
也可以將gender 的數據類型設置為enum (‘男’,‘女’)
當數據中檢查約束有多個時,可以根據檢查約束錯誤的名稱以更好地找到插入數據哪里出錯了----
ERROR 3819 (HY000): Check constraint ‘usertest001_chk_1’ is violated.
表示第一個檢查約束那里出現了錯誤,檢查約束在系統內是以編號的方式進行排序的;
但是這樣還是不太明顯,又不能一個一個去數,
所以我們可以為表做一個約束----
mysql> create table usertest006 (-> name varchar(6) ,-> gender char(1) default '男',-> age tinyint(2) ,-> user_id int(11) auto_increment,-> constraint pk_id primary key (user_id) ,-> constraint chk_gender check(gender='男' or gender ='女'),-> constraint chk_age check(age>=18 and age<=30)-> ); Query OK, 0 rows affected, 2 warnings (0.04 sec)mysql> show warnings; +---------+------+------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------------------------------------------+ | Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |--integer類型數據在最新版本8.0中不建議加顯示位寬 | Warning | 1681 | Integer display width is deprecated and will be removed in a future release. | +---------+------+------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)mysql> insert into usertest006 values-> ('張而三','你',48,1001); ERROR 3819 (HY000): Check constraint 'chk_age' is violated. mysql>可以發現mysql只能一項一項檢查錯誤,從最開始的到最后的錯誤,先對語句開頭的錯誤做出提示;
可以在創建表的時候對數據表做一些約束,當然也可以以后再添加,但是會比較麻煩,因為可能對已經添加的數據不友好;
約束除了可以在創建表的時候添加,還可以在設置好字段后添加約束-----在設置完所有字段之后添加的約束也叫表約束----
可以是主鍵約束,唯一約束,檢查約束,外鍵約束等
還可以建完表之后修改數據來添加約束
alter table 表名 modyfy 字段 數據類型 約束 ;
或者
alter table 表名 舊字段名 新字段名 數據類型 約束
查看表的結構
查看表的結構—
語法格式–
desc 表名 ; 包含字段名,字段類型,是否非空,主鍵,默認以及額外的信息
格式----
describe 表名;
也可以簡寫為desc 表名;
表中各個字段的含義:
Field 字段名
Type 數據類型
Null 是否非空 即是否可以存儲null值
Key 是否已編制索引,
Key的值可以為
PRI—主鍵
UNI----唯一
MUL----非唯一,可以重復
Default----是否由默認值
Extra-----附加信息
查看表的詳細信息
格式----show create table 表名
查看表的創建語句,存儲引擎,默認編碼格式等信息;
如果看起來有些亂,不如加點料-----
格式----show create table 表名\G
看起來是不是比上面的好一些;
注意---- G后沒有;(分號)
修改表名
格式—
alter table 舊表名 rename to 新表名;
to可以省略;
修改表名并不能修改表的結構;-----只是改個名而已;
這種方式并不能用來修改數據庫名----修改數據庫名只能通過將源庫的內容導入到新庫中;
修改表中字段的數據類型
格式–
alter table 表名 modify 字段名 數據類型 ;
修改之前----
修改-----修改后----
修改注意事項—
修改前后的表的字段如果表中由數據,則最好使得數據類型要匹配,不然會出現異常情況----后果自負哦!!!(比如有些涉及數學運算的數據改編為字符串格式…)
如果還沒有數據,可以修改;
修改表中字段的字段名
格式–
alter table 表名 change 舊字段名 新字段名 新數據類型 ;
通過這種方式可以起到給表中字段改名和修改數據類型的作用;
CHANGE也可以只修改數據類型,實現和MODIFY同樣的效果,方法是將SQL語句中的“新字段名”和“舊字段名”設置為相同的名稱,只改變“數據類型”。由于不同類型的數據在機器中存儲的方式及長度并不相同,修改數據類型可能會影響到數據表中已有的數據記錄,因此當數據庫表中已經有數據時,不要輕易修改數據類型。
為表和字段取別名
基本格式是 -----
1,字段名 as 別名
2,表名 as 別名
mysql> select u1.name ,u1.fruitname from userinfo as u1 inner join usertest as u2 on u1.fruitname =u2.fruitname group by u1.name; +----------+-----------+ | name | fruitname | +----------+-----------+ | 王五 | pear | | 張三 | pear | | 李二狗 | orange | | 古力娜華 | orange | | 王建國 | banana | | Jack | banana | | 穿耳戈 | peak | | 瑪麗亞 | peak | | Gavin | mongo | | 阿依古麗 | mongo | | 李六 | apple | | 李四 | apple | +----------+-----------+ 12 rows in set (0.00 sec)表別名只在執行查詢的時候使用,并不在返回結果中顯示,而列別名定義之后,將返回給客戶端顯示,顯示的結果字段為字段列的別名。
注意-----別名不能與數據庫名,數據表名重復
添加字段
格式—
alter table 表名 add 新字段名 數據類型 約束條件 first (after 已存在的字段名);
after----表示添加到某字段之后
first----表示添加到表頭
如果沒有first或者after 已存在的字段名,則默認是添加早表的字段末尾列;
刪除字段
格式—
alter table 表名 drop 字段名 ;
嘗試刪除一下主鍵字段------
在沒有外鍵約束的情亂下可以刪除,但是如果有外鍵約束則不能刪,
除非將外約束給刪除;
修改字段位置
格式----
alter table 表名 modify 字段名1 數據類型 first|(after 字段名);
修改之前查看一下數據類型—
修改之后的----
after-----
first----
修改表的存儲引擎
MySQL中主要的存儲引擎有MyISAM、InnoDB、MEMORY(HEAP)、BDB、FEDERATED等。
查看系統支持的存儲引擎— 格式-------
show engines; 還記得查看所有表已經使用的存儲引擎嗎?
查看某張表的存儲引擎;
修改-----
發現錯誤----說明MyISAM存儲引擎不支持外鍵
刪除外鍵----
有一個暴力的方式是直接將該表刪除…不建議除非真有必要這么操作
drop table testinfo2;
接下來再操作----
刪除表
刪除數據表就是將數據庫中已經存在的表從數據庫中刪除
注意,在刪除表的同時,表的定義和表中所有的數據均會被刪除。因此,在進行刪除操作前,最好對表中的數據做一個備份,以免造成無法挽回的后果.
可以同時刪除沒有被關聯的表
刪除表的格式—
drop table (if exists) 表1,表2,…表n;
刪除之前-------
其中testinfo 和testinfo3有主鍵外鍵約束關系—
刪除 表testthree
刪除有主鍵外鍵約束關聯的表中的一個----
會提示----
ERROR 3730 (HY000): Cannot drop table ‘testinfo’ referenced by a foreign key constraint ‘test_id2’ on table ‘testinfo3’.
如果想要刪除關聯關系中的某一張只能刪除外鍵約束后再刪除;
刪除外鍵再刪除------
alter table testinfo3 drop foreign key test_id2 ; drop
table testinfo3;
要么將所有有關聯的表都刪除,
注意刪除后所有數據都丟失了,建議要做好備份;
刪除表操作中有 無if exists 的區別
當刪除的表不存在時----
1有if exists 時不好出現錯誤提示只有一個警告信息 1 warning,而沒有的話會出現錯誤提示1051
隨著版本的更迭,現在mysql都到了mysql8了其實內行人把它叫做5.8版本,
來看一下;
mysql8都有有哪些新變化???
MySQL的binlog有有幾種錄入格式?分別有什么區別?
有三種格式,
- statement
- - statement模式下,每一條會修改數據的sql都會記錄在binlog中。不需要記錄每一行的變化,減少了binlog日志量,節約了IO,提高性能。由于sql的執行是有上下文的,因此在保存的時候需要保存相關的信息,同時還有一些使用了函數之類的語句無法被記錄復制。 - row
-
- row級別下,不記錄sql語句上下文相關信息,僅保存哪條記錄被修改。記錄單元為每一行的改動,基本是可以全部記下來但是由于很多操作,會導致大量行的改動(比如altertable),因此這種模式的文件保存的信息太多,日志量太大。
- mixed
-
- mixed,一種折中的方案,普通操作使用statement記錄,當無法使用statement的時候使用row。
此外,新版的MySQL中對row級別也做了一些優化,當表結構發生變化的時候,會記錄語句而不是逐行記錄。
總結
以上是生活随笔為你收集整理的MySQL从入门到精通之sql语言---(9月2日更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2013+OpenCV2.4.10配
- 下一篇: 三原色亮度最高_行业最亮88000流明三