SQL语法详解
文章目錄
- 聲明
- DB:
- DBMS:
- SQL:
- 認識數(shù)據(jù)庫表
- 創(chuàng)建第一個表
- 顯示當前數(shù)據(jù)庫下有哪些表
- 查看students2表的結(jié)構(gòu)
- 查看建表語句
- 數(shù)據(jù)庫表列類型
- 整數(shù)類型
- 浮點數(shù)類型
- 字符串類型
- 日期和時間類型
- 注意:查看MYSQL支持的列類型
- DML語句
- 查詢表的數(shù)據(jù)
- 添加數(shù)據(jù)insert
- 修改數(shù)據(jù)update
- 刪除數(shù)據(jù)delete
- 總結(jié):
- 過程代碼
- DDL語句
- 修改一個表
- 增加一列
- 修改一列
- `change`
- 執(zhí)行前
- 執(zhí)行后
- `modify`
- 執(zhí)行前:
- 執(zhí)行后:
- 刪除一列
- `drop`
- 執(zhí)行前
- 執(zhí)行后
- 刪除表
- 刪除成功
- 過程代碼
- 表的完整性約束
- 簡介
- 注意:
- check替換 小范圍(1)
聲明
這里只是舉例說明常見用法,如果進階的話,還得需要自己去看MySQL手冊,進行自我提升,加油
sql,DB,DBMS分別是什么,他們之間的關(guān)系?
DB:
DataBase(數(shù)據(jù)庫,數(shù)據(jù)庫實際上在硬盤上以文件的形式存在)
DBMS:
DataBase Management System(數(shù)據(jù)庫管理系統(tǒng),常見的Oracle,Mysql,SQL Server,DB2,Sybase,informix,interbase,PostgreSql……)
SQL:
結(jié)構(gòu)化查詢語言,是一門標準通用語言。標準的sql適合所有的數(shù)據(jù)庫產(chǎn)品
SQL屬于高級語言,SQL語句在執(zhí)行的時候,實際上內(nèi)部也會先進行編譯,然后再執(zhí)行sql(sql的語句由DBMS完成)
DBMS負責執(zhí)行sql語句,通過執(zhí)行sql語句來操作DB當中的數(shù)據(jù)
DBMS–>(執(zhí)行)---->SQL—(操作)—>DB
認識數(shù)據(jù)庫表
表 是一種結(jié)構(gòu)化的文件,可以用來存儲特定類型的數(shù)據(jù),如:學生信息,課程信息,都可以放到表中,另外表部有特定的名稱,而且不能重復。表中有幾個概念:列,行,主鍵。
列叫做字段,行叫做表中的記錄,每一個字段都有:字段名稱/字段數(shù)據(jù)類型/字段約束/字段長度
| 17071401 | 張三 | 男 | 20 |
| 17071402 | 李四 | 女 | 18 |
| 17071403 | 王五 | 男 | 21 |
| 17071404 | 趙六 | 女 | 19 |
每個表都是由若干行和列組成的,在數(shù)據(jù)庫中表中的行被稱為記錄,表中的列被稱為這些記錄的字段
記錄也被稱為一行數(shù)據(jù),是表里的一行。在關(guān)系型數(shù)據(jù)庫里,一行數(shù)據(jù)是指一條完整的記錄。
字段是表里的一列,用于保存每條記錄的特定信息
創(chuàng)建第一個表
CREATE TABLE students2(sno INT(6),NAME VARCHAR(6),sex CHAR(1),enterdate DATE,classname VARCHAR(8),email VARCHAR(20) )創(chuàng)建一個表名為students2的表,
注意點:
顯示當前數(shù)據(jù)庫下有哪些表
SHOW TABLES;查看students2表的結(jié)構(gòu)
DESC students2;查看建表語句
show create table students2
賦值粘貼出來后代碼為:
數(shù)據(jù)庫表列類型
整數(shù)類型
MYSQL支持在選擇在該類型關(guān)鍵字后面的括號內(nèi)指定整數(shù)值的顯示寬度(例如,INT(4))。顯示寬度并不限制可以在列內(nèi)保存的值的范圍,也不限制超過列的指定寬度的值的顯示(可以自身突破括號內(nèi)所指定整數(shù)值的顯式寬度)
主鍵自增:不使用序列,通過auto_increment,要求是整數(shù)類型,
浮點數(shù)類型
| FLOAT | 4字節(jié) | 單精度浮點數(shù)值 |
| DOUBLE | 8字節(jié) | 雙精度浮點數(shù)值 |
需要注意的是與整數(shù)類型不一樣的是,浮點數(shù)類型的寬度不會自動擴充,
double(4,1)
指的是 總的(小數(shù)+整數(shù))寬度為4,小數(shù)寬度為1
字符串類型
VARCHAR括號內(nèi)只需要指明最大長度即可,它是變長字符串,如果大小超過了65535的話:兩個選擇,如果是字符的話,使用TEXT,如果是照片或者視頻這些的話,那么選擇BLOB。
如果需要使用以字節(jié)為單位的話,那么直接使用BINARY(M),VARBINARY(M)即可
CHAR和VARCHAR類型相似,均用于存于較短的字符串,主要的不同之處在于存儲方式,CHAR類型長度固定,VARCHAR類型的長度可變。
因為VARCHAR類型能夠根據(jù)字符串的實際長度來動態(tài)改變所占字節(jié)的大小,所以在不能明確該字段具體需要多少字符時推薦使用VARCHAR類型,這樣可以大大地節(jié)約磁盤空間,提高存儲效率
CHAR和VARCHAR表示的是字符的個數(shù),而不是字節(jié)的個數(shù)
日期和時間類型
TIMESTEMP類型的數(shù)據(jù)指定方式與DATETIME基本相同,兩者不同之處在于以下幾點:
注意:查看MYSQL支持的列類型
mysql > help data typesDML語句
查詢表的數(shù)據(jù)
SELECT * FROM students2;添加數(shù)據(jù)insert
INSERT INTO students2 VALUES(1,"張三豐","男","1200-12-12","武當一班","zhangsanfeng@wudang.com");報錯了,因為email太長了,超過了20個字符,減少一下。
INSERT INTO students2 VALUES(1,"張三豐","男","1200-12-12","武當一班","zhangsf@wd.com");
成功了
我們再把上述語句再次執(zhí)行一遍,那么觀察一下是否能再次加入?
現(xiàn)實情況中不被允許的,因為主鍵不能一樣(這里之所以能加入進去,是因為缺少約束)
而且這里性別也是可以任意的。。
如果我們少賦值一個變量,讓它空著,它是否能通過呢?
INSERT INTO students2 VALUES(2,"張翠山","男","1256/05/12","武當二班");
報錯了,列的數(shù)量不匹配值的數(shù)量。那么我們把列規(guī)定一下,別用上全部的列再次嘗試:
如果enterdate(時間)需要時剛剛加入,那么我們應該怎么表示呢?
加入時間為:2021-3-16
另外一種insert方式:
INSERT INTO students2 SET sno=5,NAME="宋青書",classname="已退學";修改數(shù)據(jù)update
update students2 set enterdate="1300-12-12",classname="武當實驗班",email="zhangwu@wd.com" where sno=3:
那能不能修改為null呢?我們來試試
刪除數(shù)據(jù)delete
delete students2 where sno>=4;
嗯哼?報錯了?出現(xiàn)了SQL語法錯誤,這里切記,MySQL的delete后面跟from
總結(jié):
過程代碼
CREATE TABLE students2(sno INT(6),NAME VARCHAR(6),sex CHAR(1),enterdate DATE,classname VARCHAR(8),email VARCHAR(20) ) SELECT * FROM students2; INSERT INTO students2 VALUES(1,"張三豐","男","1200-12-12","武當一班","zhangsf@wd.com");INSERT INTO students2 VALUES(2,"張翠山","男","1256/05/12","武當二班","zhangcsh@wd.com"); INSERT INTO students2 VALUES(2,"張翠山","男","1256/05/12","武當二班","zhangcsh@wd.com"); INSERT INTO students2(sno,NAME,sex,enterdate,classname) VALUES(4,"張小忌","男",SYSDATE(),"武當三班");INSERT INTO students2 SET sno=5,NAME="宋青書",classname="已退學"; UPDATE students2 SET enterdate="1300-12-12",classname="武當實驗班",email="zhangwu@wd.com" WHERE sno=3;UPDATE students2 SET enterdate=NULL,classname=NULL WHERE sno=4; DELETE FROM students2 WHERE sno>=4;DDL語句
create alter drop
修改一個表
增加一列
alter table students2 add增加一列實現(xiàn)代碼(不寫位置時默認加在最后一列):
ALTER TABLE students2 ADD score DOUBLE(4,1);
然后再次執(zhí)行如下代碼時:
表示越界了,當改成如下時,
UPDATE students2 SET score=234.1 WHERE sno=1;
成功了,這也就是體現(xiàn)了DOUBLE(4,1)的
增加一列實現(xiàn)代碼(加在第一列):
ALTER TABLE students2 ADD score DOUBLE(4,1) first;
加在某一列的前列(某一列的前列可以轉(zhuǎn)化為某一列的后面)
它直接用了一個after,那可不可以用before呢?這得看文檔
觀察后,找到了first,找到了after,但是沒有before,那么就不能用嘍
修改一列
修改的話,有change和modify,區(qū)別的是:
change
alter table students2 change score credit double(4,1)執(zhí)行前
執(zhí)行后
score是原來的列名,credit是新的列名,double(4,1)是列的新類型
modify
alter table students2 modify credit int(4)執(zhí)行前:
執(zhí)行后:
刪除一列
alter table students2 dropdrop
alter table students2 drop column credit;column是可選項,可填可不填。
執(zhí)行前
執(zhí)行后
刪除表
drop table students2;刪除成功
過程代碼
ALTER TABLE students2 ADD score DOUBLE(4,1); SELECT * FROM students2; UPDATE students2 SET score=234.1 WHERE sno=1;ALTER TABLE students2 DROP credit;ALTER TABLE students2 ADD score DOUBLE(4,1) AFTER classname; ALTER TABLE students2 ADD score DOUBLE(4,1) FIRST; ALTER TABLE students2 CHANGE score credit DOUBLE(4,1); DESC students2; ALTER TABLE students2 MODIFY credit INT(4);ALTER TABLE students2 DROP COLUMN credit;DROP TABLE students2;表的完整性約束
簡介
為防止不符合規(guī)范的數(shù)據(jù)存入數(shù)據(jù)庫,在用戶對數(shù)據(jù)進行插入,修改,刪除等操作時,MySQL提供了一種進制來檢查數(shù)據(jù)庫中的數(shù)據(jù)是否滿足規(guī)定的條件,以保證數(shù)據(jù)庫中的數(shù)據(jù)的準確性和一致性,這種機制就是完整性約束
MySQL中主要支持六種完整性約束,如下表所示,其中check約束是MySQL8中提供的支持
| PRIMARY | 主鍵約束,約束字段的值可唯一地標識對應的記錄 |
| NOT NULL | 非空約束,約束的字段的值不能為空 |
| UNIQUE | 唯一約束,約束的字段是唯一的 |
| CHECK | 檢查約束,限制某個字段的取值范圍 |
| DEFAULT | 默認值約束,約束字段的默認值 |
| AUTO_INCREMENT | 自動增加約束,約束字段的值自動增加 |
| FOREIGN KEY | 外外鍵約束,約束表與表之間的關(guān)系 |
一般我們不會把DEFAULT和AUTO_INCREMENT視為約束,而是看做一種自身特征
帶有約束的建表語句:
CREATE TABLE students2(sno INT(6) PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(6) NOT NULL,sex CHAR(1) CHECK(sex='男' || sex='女'),age INT(3) CHECK(age<=80 AND age>=6),enterdate DATE,classname VARCHAR(10),email VARCHAR(20) UNIQUE )
本來想在 sex CHAR(1) CHECK(sex='男' || sex='女')后加一個default ‘男’ ,卻報錯了。沒法改,我只能去掉。
語法報錯,版本不合??
執(zhí)行下方語句代碼時:
報錯,Column 'NAME' cannot be null,約束起了作用
emmmm......不好意思,我的MYSQL版本有點低,不支持check。。所以示范不出來。。等我換個MySQL。。
換成MYSQL8.0以上試驗后:
執(zhí)行上方語句居然成功了很明顯,因為,不同于SQL,在MYSQL中,CHECK只是一段可調(diào)用但無意義的子句。MySQL會直接忽略。CHECK語句在聲明中并未起到作用。跟MySQL版本無關(guān)。
注意:
CHECK子句會被分析,但是會被忽略。
請參見“CREATE TABLE語法”:接受這些子句但又忽略子句的原因是為了提高兼容性,以便更容易地從其它SQL服務器中導入代碼,并運行應用程序,創(chuàng)建帶參考數(shù)據(jù)的表。(那么check約束就直接放棄了),那么我們可以采用其它功能語句來嘗試替換check。
check替換 小范圍(1)
sex CHAR(1) CHECK(sex='男' || sex='女'),替換語句如下:
sex ENUM('男','女'),即創(chuàng)建表格代碼如下:
CREATE TABLE students2(sno INT(6) PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(6) NOT NULL,sex ENUM('男','女'),age INT(3) CHECK (age<80 AND age>6),enterdate DATE,classname VARCHAR(10),email VARCHAR(20) UNIQUE )然后執(zhí)行下方語句后:
INSERT INTO students2 VALUES(NULL,'小','小',100,'1999-12-23','Java001','zhangsan@sxt');報錯了,哈哈,成功替換
總結(jié)
- 上一篇: 数据库开篇简介整体常识
- 下一篇: Python正则表达式之额外补充(7)