面試官問“你的SQL能力怎么樣?”時應(yīng)該如何回答?
第一章 SQL的介紹
1.1、什么是sql
SQL:Structure Query Language。(結(jié)構(gòu)化查詢語言),通過sql操作數(shù)據(jù)庫(操作數(shù)據(jù)庫,操作表,操作數(shù)據(jù))
SQL被美國國家標(biāo)準(zhǔn)局(ANSI)確定為關(guān)系型數(shù)據(jù)庫語言的美國標(biāo)準(zhǔn),后來被國際化標(biāo)準(zhǔn)組織(ISO)采納為關(guān)系數(shù)據(jù)庫語言的國際標(biāo)準(zhǔn)
各數(shù)據(jù)庫廠商(MySql,oracle,sql server)都支持ISO的SQL標(biāo)準(zhǔn)。
各數(shù)據(jù)庫廠商在標(biāo)準(zhǔn)的基礎(chǔ)上做了自己的擴(kuò)展。各個數(shù)據(jù)庫自己特定的語法
1.2、sql的分類
Data Definition Language (DDL數(shù)據(jù)定義語言) 如:操作數(shù)據(jù)庫,操作表
Data Manipulation Language(DML數(shù)據(jù)操縱語言),如:對表中的記錄操作增刪改
Data Query Language(DQL 數(shù)據(jù)查詢語言),如:對表中數(shù)據(jù)的查詢操作
Data Control Language(DCL 數(shù)據(jù)控制語言),如:對用戶權(quán)限的設(shè)置
1.3、MySQL的語法規(guī)范和要求
(1)mysql的sql語法不區(qū)分大小寫
MySQL的關(guān)鍵字和函數(shù)名等不區(qū)分大小寫,但是對于數(shù)據(jù)值是否區(qū)分大小寫,和字符集與校對規(guī)則有關(guān)。
ci(大小寫不敏感),cs(大小寫敏感),_bin(二元,即比較是基于字符編碼的值而與language無關(guān),區(qū)分大小寫)
(2)命名時:盡量使用26個英文字母大小寫,數(shù)字0-9,下劃線,不要使用其他符號user_id
(3)建議不要使用mysql的關(guān)鍵字等來作為表名、字段名等,如果不小心使用,請?jiān)赟QL語句中使用`(飄號)引起來
(4)數(shù)據(jù)庫和表名、字段名等對象名中間不要包含空格
(5)同一個mysql軟件中,數(shù)據(jù)庫不能同名,同一個庫中,表不能重名,同一個表中,字段不能重名
(6)標(biāo)點(diǎn)符號:
必須成對
必須英文狀態(tài)下半角輸入方式
字符串和日期類型可以使用單引號’’
列的別名可以使用雙引號"",給表名取別名不要使用雙引號。取別名時as可以省略
如果列的別名沒有包含空格,可以省略雙引號,如果有空格雙引號不能省略。
(7)SQL腳本中如何加注釋
單行注釋:#注釋內(nèi)容
單行注釋:–空格注釋內(nèi)容 其中–后面的空格必須有
多行注釋:/* 注釋內(nèi)容 */

第二章-DDL操作數(shù)據(jù)庫
2.1、創(chuàng)建數(shù)據(jù)庫(掌握)
語法
create database 數(shù)據(jù)庫名 [character set 字符集][collate ?校對規(guī)則] ? ? 注: []意思是可選的意思
字符集(charset):是一套符號和編碼。
練習(xí)
創(chuàng)建一個day01的數(shù)據(jù)庫(默認(rèn)字符集)
create database day01;
創(chuàng)建一個day01_2的數(shù)據(jù)庫,指定字符集為gbk(了解)
create database day01_2 character set gbk;
2.2、查看所有的數(shù)據(jù)庫
查看所有的數(shù)據(jù)庫
語法
show databases;
查看數(shù)據(jù)庫的定義結(jié)構(gòu)【了解】
語法
show create database 數(shù)據(jù)庫名;
查看day01這個數(shù)據(jù)庫的定義
show create database day01;
2.3、刪除數(shù)據(jù)庫
語法
drop database 數(shù)據(jù)庫名;
刪除day01_2數(shù)據(jù)庫
drop database day01_2;
2.4、修改數(shù)據(jù)庫【了解】
語法
alter database 數(shù)據(jù)庫名 character set 字符集;
修改day01這個數(shù)據(jù)庫的字符集(gbk)
alter database day01 character set gbk;
注意:
是utf8,不是utf-8
不是修改數(shù)據(jù)庫名
2.5、其他操作
切換數(shù)據(jù)庫, 選定哪一個數(shù)據(jù)庫
use 數(shù)據(jù)庫名; ? ? //注意: 在創(chuàng)建表之前一定要指定數(shù)據(jù)庫. use 數(shù)據(jù)庫名
練習(xí): 使用day01
use day01;
查看正在使用的數(shù)據(jù)庫
select database();
第三章-DDL操作表
3.1、創(chuàng)建表
語法
create table 表名(
列名 類型 [約束],
列名 類型 [約束]
...
?
);
類型
數(shù)值類型
整型系列:xxxInt
int(M),必須和unsigned zerofill一起使用才有意義

double(M,D):表示最長為M位,其中小數(shù)點(diǎn)后D位
例如:double(5,2)表示的數(shù)據(jù)范圍[-999.99,999.99],如果超過這個范圍會報錯。
定點(diǎn)型系列:decimal(底層實(shí)際上是使用字符串進(jìn)行存儲)
decimal(M,D):表示最長為M位,其中小數(shù)點(diǎn)后D位
位類型:bit
字節(jié)范圍是:1-8,值范圍是:bit(1)~bit(64),默認(rèn)bit(1)
用來存儲二進(jìn)制數(shù)。對于位字段,直接使用select命令將不會看到結(jié)果??梢允褂胋it()或hex()函數(shù)進(jìn)行讀取。插入bit類型字段時,使用bit()函數(shù)轉(zhuǎn)為二進(jìn)制值再插入,因?yàn)槎M(jìn)制碼是“01”。常見 SQL 面試題:經(jīng)典 50 例
日期時間類型
日期時間類型:year, date, datetime, timestamp
注意一下每一種日期時間的表示范圍

timestamp和datetime的區(qū)別:
timestamp范圍比較小
timestamp和時區(qū)有關(guān)
show variables like ‘time_zone’;
set time_zone = ‘+8:00’;
timestamp受MySQL版本和服務(wù)器的SQLMode影響很大
表中的第一個非空的timestamp字段如果插入和更新為NULL則會自動設(shè)置為系統(tǒng)時間
字符串類型
MySQL中提供了多種對字符數(shù)據(jù)的存儲類型,不同的版本可能有所差異。常見的有:
char,varchar,xxtext,binary,varbinary,xxblob,enum,set等等

字符串類型char,varchar(M)
char如果沒有指定寬度,默認(rèn)為1個字符
varchar(M),必須指定寬度
binary和varbinary類似于char和varchar,不同的是它們包含二進(jìn)制字符串,不支持模糊查詢之類的。
一般在保存少量字符串的時候,我們會選擇char和varchar;而在保存較大文本時,通常會選擇使用text或blob系列。blob和text值會引起一些性能問題,特別是在執(zhí)行了大量的刪除操作時,會在數(shù)據(jù)表中留下很大的“空洞”,為了提高性能,建議定期時候用optimize table功能對這類表進(jìn)行碎片整理??梢允褂煤铣傻?Synthetic)索引來提高大文本字段的查詢性能,如果需要對大文本字段進(jìn)行模糊查詢,MySql提供了前綴索引。但是仍然要在不必要的時候避免檢索大型的blob或text值。
enum枚舉類型,它的值范圍需要在創(chuàng)建表時通過枚舉方式顯式指定,對于1~255個成員的枚舉需要1個字節(jié)存儲;對于【 255`65535】
個成員需要2個字節(jié)存儲。例如:gender enum(‘男’,‘女’)。如果插入枚舉值以外的值,會按第一個值處理。一次只能從枚舉值中選擇一個。
set集合類型,可以包含0~64個成員。一次可以從集合中選擇多個成員。如果選擇了1-8個成員的集合,占1個字節(jié),依次占2個,3個。。8個字節(jié)。例如:hoppy set(‘吃飯’,‘睡覺’,‘玩游戲’,‘旅游’),選擇時’吃飯,睡覺’或’睡覺,玩游戲,旅游’
示例

約束
即規(guī)則,規(guī)矩 限制;
作用:保證用戶插入的數(shù)據(jù)保存到數(shù)據(jù)庫中是符合規(guī)范的

約束種類:
not null: 非空 ; eg: username varchar(40) not null username這個列不能有null值
unique:唯一約束, 后面的數(shù)據(jù)不能和前面重復(fù); eg: cardNo char(18) unique; cardNo 列里面不可以有重復(fù)數(shù)據(jù)
primary key;主鍵約束(非空+唯一); 一般用在表的id列上面. 一張表基本上都有id列的, id列作為唯一標(biāo)識的
auto_increment: 自動增長,必須是設(shè)置了primary key之后,才可以使用auto_increment
id int primary key auto_increment; id不需要我們自己維護(hù)了, 插入數(shù)據(jù)的時候直接插入null, 自動的增長進(jìn)行填充進(jìn)去, 避免重復(fù)了.
注意:
先設(shè)置了primary key 再能設(shè)置auto_increment
只有當(dāng)設(shè)置了auto_increment 才可以插入null , 否則插入null會報錯
id列:
給id設(shè)置為int類型, 添加主鍵約束, 自動增長
或者給id設(shè)置為字符串類型,添加主鍵約束, 不能設(shè)置自動增長
