SQL語句的基本操作


一、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替代的,無非就是我們在存之前在我們的程序中做一個判斷而已,所以嘛想進后宮是有條件的不是每個人都可以呀,哈哈!
















免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM