一、SQL語句的基本操作
廢話不多說上干貨,請收下!
文件夾:庫 增 create database db1 charset utf8; #會在我們的data文件夾下,創建出一個db1文件夾,編碼方式如果不指定會以默認的為准 刪 drop database db1; #指定要刪除的數據庫就可以直接將其刪除 改 alter database db1 charset gbk; #改數據庫一般也就是改其編碼方式,指定要改的數據庫和編碼方式即可修改編碼方式 查 show databases; #查看data文件夾下的所有的文件夾 show create database db1; #查看創建的數據庫db1的數據結構,可以看到其指定的編碼, 文件:表 切換文件夾 use db1; #創建表之前我們需要先切到具體的文件夾下進行創建表,否則創建的時候mysql不知道你要在哪個文件夾下創建文件就會報錯,當然你也可以在創建的表前指定數據庫名 select database(); 查看當前所在的庫 #可以當前創建的表是在哪個表下進行創建的 增 create table t1(id int,name char); #創建表一定要指定字段的類型,而且字段不能為空,所有字段放在括號內,並用逗號隔開 create table db1.t1(id int,name char); #如果創建表時沒有切換到指定的文件夾下,可以在表名前添加上庫名即可 刪 drop table t1; #刪除表時直接指定刪除的表名即可 改 alter table t1 add age int; #改是改變表的表結構,add是向表中添加新的字段,並指定字段的類型,不需要用括號 alter table t1 modify name char(15); #modify是修改表中字段的類型,但是不可以修改字段名 alter table t1 change name NAME char(15); #change和modify的區別是可以修改字段的名字,當然也可以修改字段的類型 alter table t1 drop age; #刪除表中的某一個字段,一般沒有刪除字段的需求,因為這樣會連同字段下的記錄也會一同被刪除
alter table department rename to dep; #對表名進行重新命名
查 show tables; #查看當前庫下創建的所有表,查看出的表會顯示在哪個庫下的 show create table t1; #查看具體的某一個表的表機構但是該表結構看上去有點亂 desc t1; #也是查看表的表結構,但是比上面的方法查看的規整,當然我們也可以用describe t1;來進行查詢表的表結構 文件內的一行行內容:記錄 增 insert into t1(id,name) values #向表中插入記錄,此時要指定要插入的表名,以及表的字段名,和要插入的字段對應的值,值用括號進行插入,每插入一組值用逗號隔開,最后一組用分號,表示此條語句的結束 (1,'egon'), (2,'lxx'), (3,'alex'); 刪 delete from db1.t1 where id >= 2; #delete刪除記錄,要指定要刪除哪個表下的記錄,並指定條件,進行篩選出自己想要刪除的記錄,強調這種刪除並不會變id值得結構,id並不會重新進行排序,因為如果表中的數據量很大,重新排序顯然是不合理的 create table t2(id int primary key auto_incremnt,name char(15)); #創建表的時候一般我們將標的字段id設定成主鍵,主鍵的意思就是id不能為空且唯一,並將id設置成自增長,這樣進行插入記錄的時候就不需要在傳入id的值了 insert into t2(name) values ('egon'), ('lxx'), ('wxx'), ('axx'); #向表中插入多條記錄,要指定要插入記錄的表,插入的多條記錄要放在括號內,並且多條記錄之間用逗號進行分隔開,最后一條記錄以分號進行結束 清空表應該使用: truncate t2; #清空表不僅清空表中的內容,字段id下次再插入值是也是從1開始增長的,而不會像delete一樣,下次插入會接着上次的id的值繼續增長,當然字段名不會被刪除的 改 update db1.t1 set name='lxx_dsb' where id=2; #update修改記錄的值,set指定要修改字段名直接進行修改,后面可以跟要修改的約束條件,來修改我們想要修改具體的那條記錄 查 select id from db1.t1; #指定要查看表中哪個字段下的記錄 select id,name from t1; #我們也可以指定查看多個字段,查看多個字段下的內容 select name,id from t1; #查看多個字段我們可以調換字段的順序,那么查看的結果也是按照我們查看字段的順序進行排列,當然這種查看並不會改變我們原有存儲時的順序 select * from t1; #*代表的是查看所有的字段下的記錄,會將指定的表下多有字段下的記錄查詢出來 select * from t1 where id >= 2; #當然我們還可以查詢所有字段是加上約束條件,更精准的查詢我們想要的記錄
一、關於表的詳細操作
一、創建表的完整語法
語法:
create table 庫名.表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
); #當然如果我們切換到具體的庫下,那么表名前面的庫名就可以不用寫了,但是創建表一定要指定表的字段名和字段的類型只是不可以省略的!
約束條件:是在數據類型之外對字段附加的額外的限制,當然這種約束條件就是可有可無的了,根據我們的需求而定
注意:
1、最后一個字段之后不能加逗號
2. 在同一張表中,字段名是不能相同
3. 寬度和約束條件可選,字段名和類型是必須的
二、MYSQL中的一些常用數據類型
1、整型:默認是有符號的(即插入的值可以是整數也可以是負數)
create table t3(x tinyint); #字段x的類型是tinyint,tinyint的存儲寬的是1個字節,即8bit位,有符號存儲范圍是(-128,127),無符號存儲范圍是(0,256)
ps:修改sql_mode為嚴格模式,必須重啟客戶端才能生效
set global sql_mode="strict_trans_tables"; #將對表的操作修改成嚴格模式,這意味着之前有些操作之前不會報錯,在嚴格模式下則會報錯
select @@sql_mode; #將嚴格模式設置為全局模式
create table t4(x tinyint unsigned); #默認的是有符號的,我們加上unsigned,那么就是無符號的,即只能插入整數,如果我們插入的字段值為負數在嚴格模式下就會報錯
強調:創建表時整型類型后面的寬度限制的根本不是存儲寬度,限制的是顯示寬度,如果我們存儲的數字的寬度超過字段類型默認的寬度,不會報錯,會以字典類型默認的最大值或最小值幫我們進行存儲
create table t5(id int(1));
create table t6(id int(5));
驗證:默認整型都是有符號的 create table t1(x tinyint); #默認是有符號的,不符合標准也能插進去,但是插入的是最大127,嚴格模式則會報錯 insert into t1 values(128),(-129); create table t2(x tinyint unsigned); #改成無符號的即0---256 insert into t2 values(-1),(256); create table t3(x int unsigned); #4294967295 insert into t3 values(4294967296); #如果你存了一個超出字段類型允許的最大值,那么對不起我們可以接納你,但是你只能按照我能允許的最大值進行存 create table t4(x int(12) unsigned); #整型類型限制的不是存儲寬度,限制的是顯示寬度,其他的數據類型限制的存儲寬度 insert into t4 values(4294967296123); #對不起數大有什么用?不還得以我能存取的最大值為標准進行存
int的存儲寬度是4個Bytes,即32個bit,即2**32
無符號最大值為:4294967296-1
有符號最大值:2147483648-1
有符號和無符號的最大數字需要的顯示寬度均為10,而針對有符號的最小值則需要11位才能顯示完全,所以int類型默認的顯示寬度為11是非常合理的
最后:整形類型,其實沒有必要指定顯示寬度,使用默認的就ok
2、浮點型:
float(255,30) #最多存255位整數,最多30位小數
double(255,30)
decimal(65,30) #最多65位整數,最多30位小數
那么他們三者的區別到底在哪呢?讓我們一探究竟,其實他們的小數精度不一樣,float----》double-----》decimal,存儲時小數的精度是越來越高的,並不是像你想象的那樣存的是什么樣,查看的記過就是什么樣子
create table t8(x float(255,30));
create table t9(x double(255,30));
create table t10(x decimal(65,30));
insert into t8 values(1.111111111111111111111111111111); #存儲時小數進度最低
insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111); #存儲時小數精度最高
當然在這筆者還要說一句,我們以后到底用哪一個呢?其實float已經夠我們用了,畢竟我們不需去造核武器一類高精度的一些需求,老板發你工資你不會跟老板較勁說不行,發我的工資必須精確到小數點后30位,不是嗎?
所以float已經夠我們用的啦!
3、日期類型
在創建表時我們可以指定日期類型,一般有以下五種類型,我們可以根據需求選擇用哪一種
year 1999
date 1999-11-11
time 08:30:00
datetime/timestamp 1999-11-11 08:30:00
用法其實也很簡單,畢竟數據庫的東西的都是死的,讓我們一起來看看以下的演示實例吧
create table student( id int primary key auto_increment, name char(16), born_year year, birth date, class_time time, reg_time datetime ); #我創建了一個表把上面四種日期類型都用上了,讓我們來看看插入記錄后查看會是什么樣的效果,當然效果就是我上面的格式了呀,哈哈哈 insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing1',now(),now(),now(),now()); #看到沒有我插入日期字段的值時,用的都是now(),那么我們查看就會按照我們創建表時指定的類型給我們顯示出,當前的日期時間,這個很實用的,我想應用場景應該就不用我說了吧 insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing1',2000,20001111,now(),now()); #當然我們還可以自己指定對應日期字段類型下的日期和時間,還可以和now()混用,是不是覺得用法很靈活,然而並沒有什么亂用,難道就不能一心一意嗎?嘿嘿不能 insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing',2000,'2000-11-11',083000,now()); #我們還可以以加引號的形式按照我們之地當的形式進行存儲,就是這么隨意。下面兩種類似我就不廢話了 insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing',2000,'2000-11-11',"08:30:00",20171111111111); insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing',2000,'2000-11-11',"08:30:00","2017-11-11 11:11:11"); create table t11(x timestamp); create table t12(x datetime not null default now());
4、字符類型
注意:寬度指限制的是字符個數,對是字符的個數,千萬不要與整形混淆
char:定長
char(5)
varchar:變長
varchar(5)
相同點:寬度指的都是最大存儲的字符個數,超過了都無法正常存儲
不同點:
char(5):
'm'--->'m '5個字符 #看到沒有存儲的時候是以定長5個字符進行存儲的,不夠那不好意思,我用空格給你補齊5個,我還是要用5個字符進行存儲
varchar(5)
'm'--->'m'1個字符 #對不起我不喜歡您,你來幾個我就給你存幾個,不夠5個也休想讓我幫你補全,誰讓你可變的,對不起再見!
在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們打開pad_char_to_full_length SQL模式即:
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
注意:mysql在查詢時針對where 字段="值 "會忽略掉右面的空格,即where 字段="值"
如果時like模糊匹配就不會忽略右面的空格了
char(5)
egon |axx |lxx |fm |
varchar(5)
1bytes+egon|1bytes+axx|1bytes+lxx|1bytes+fm|
注意:
針對char類型,mysql在存儲時會將數據用空格補全存放到硬盤中
但會在讀出結果時自動去掉末尾的空格,因為末尾的空格在以下場景中是無用
mysql> select * from t14 where name="lxx"; # name字段明確地等於一個值,該值后填充空格是沒有用
mysql> select * from t14 where name like "lxx"; # name字段模糊匹配一個值,該值后填充空格是有用的
mysql> select * from t14 where name like "lxx"; # name字段模糊匹配一個值,該值后填充空格是有用的
對比char與varchar,感興趣的可以查看官網文檔,在這我就不在贅述了
name char(5)
# 缺點:浪費空間
# 優點:存取速度都快
xing alex lxx wxx yx
name varchar(5)
# 缺點:存取速度都慢
# 優點:節省空間
(1bytes+xing)(1bytes+alex)(1bytes+lxx)
寬度相關練習
mysql> create table t13(x char(5)); Query OK, 0 rows affected (0.20 sec) mysql> create table t14(x varchar(5)); Query OK, 0 rows affected (0.27 sec) mysql> mysql> mysql> insert into t13 values('xxxxxx'); ERROR 1406 (22001): Data too long for column 'x' at row 1 mysql> insert into t14 values('xxxxxx'); ERROR 1406 (22001): Data too long for column 'x' at row 1
5、枚舉與集合類型
枚舉enum('a','b','c'):多選一
集合set('a','b','c'):多選多
create table emp( name varchar(15), sex enum('male','female','unkown'), #插入的值必須是其中的一個否則就會報錯 hobbies set('read','music','yinshi','play') #可以同時給一個字段插入多個值,但是插入的值也必須鑰匙我事先創建表時指定的,對就是這么嬌氣! ); insert into emp values ('zhangming','xxx','xxxx'); #不好意思此時的字段值不能隨便插了,我已經指定了,那就請你按照我上面的規則來吧,謝謝啦,要不我就跟你急報錯給你看,哼! mysql> insert into emp values('zhangming','female','read,play'); #看到了吧?這個人插入了我創建表時事先指定的值,哀家就允了他,哈哈! Query OK, 1 row affected (0.03 sec) mysql> select * from emp; +-----------+--------+-----------+ | name | sex | hobbies | +-----------+--------+-----------+ | zhangming | female | read,play | +-----------+--------+-----------+ 1 row in set (0.00 sec)
要完了,有點不舍,我在這還想說一句就是其實這個什么枚舉呀,集合呀其實完全是可以被char或varchar替代的,無非就是我們在存之前在我們的程序中做一個判斷而已,所以嘛想進后宮是有條件的不是每個人都可以呀,哈哈!
