當前位置:首頁 » 編程語言 » sql中定點數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql中定點數

發布時間: 2023-01-01 14:28:50

『壹』 sql基本命令都是什麼含義,求列表解釋

--SQL基本命令

--數據定義語言
Create(創建)
Alter(更改)
Drop(刪除)

--數據操縱語言
Insert(插入)
select(選擇)
delete(刪除)
update(更新)

--事務控制語言
commit(提交)
savepoint(保存點)
rollback(回滾)

--數據控制語言
Grant(授權)
Revoke(回收)

--Orcale數據類型

--字元數據類型
char這種數據類型的列長度可以是1到2000個位元組。
varchar2該數據類型的大小在1-4000個位元組范圍內
long這種數據類型可存儲最大2GB。

--數值數據類型
number數據類型可以存儲正數、負數、零、定點數和精度為38位的浮點數。

--日期時間數據類型
date數據類型使用七個位元組固定長度,每個位元組分別存儲世紀、年、月、日、小時、分和秒。從4712年1月1日到公元9999年12月13日。
Timestamp數據類型用於存儲日期的年、月、日以及時間的小時、分和秒值。秒值是精確到小數點後6位。該數據類型還包括了時區信息。

--Raw和LongRaw數據類型
Raw數據類型
Raw數據類型用於存儲基於位元組的數據。如二進制數據或位元組串,該數據類型最多能存儲2000個位元組。
LongRaw數據類型用於存儲可變長度的二進制數據,最多能存儲2GB。(該數據不能使用索引,long受到的所有限制對longraw數據類型同樣有效)

--LOB數據類型
Clob數據類型能夠存儲大量字元數據。該數據類型可以存儲單位元組數據和多位元組字元數據。clob可用於存儲非結構化的XML文檔。
Blob數據類型可以存儲較大的二進制對象,如圖形、視頻剪輯和聲音剪輯等。
Bfile數據類型能夠將二進制文件存儲二進制文件存儲在資料庫外部的操作系統文件中。Bfile列存存儲一個Bfile定位器。它指向位於伺服器文件系統上的二進制文件。支持的文件最大為4GB。

--查看指定偽列用戶(scott)
select rowid,ename,comm from emp where sal=1500

--查看偽列數
select * from emp where rownum<2

--數據定義語言
create table (需要創建的表)
alter table (需要更改的表)
truncate table (需要截斷的表)
drop table (需要刪除的表)

--create table保命令
create table [所有者即模式的名稱,如果用戶在自己的模式中創建表,則可以不指定所有者名稱。][需要創建的表名]
([列的名稱] [數據類型及長度]);
--例子(在當前用戶下創建了一張名為(Cool)的表,里有有三個列分別是:Cool_ID、Cool_Name、Cool_like):
create table Cool(
Cool_ID number,
Cool_Name varchar(20),
Cool_like varchar(30));
--在表中插入數據
insert into Cool values(8850,'酷兒','編寫Java應用程序');
insert into Cool values(8851,'酷兒','編寫Java應用程序1');
insert into Cool values(8852,'酷兒','編寫Java應用程序2');
insert into Cool values(8853,'酷兒','編寫Java應用程序3');
insert into Cool values(8854,'酷兒','編寫Java應用程序4');
insert into Cool values(8856,'酷兒','編寫Java應用程序5');
insert into Cool values(8855,'酷兒','編寫Java應用程序6');

--alter table命令
alter table [需要更改的表命稱] [模式(modify=更改,add=添加,drop=刪除)] (表中的列名)
--例子
--更改表中Cool_like列數據長度更改為15
alter table cool modify (cool_name varchar(15));
--插入數據進行測試第一條數據可以順利插入到列中,而第二條數據則不能插入列數,應為它的長度己超過了15個字元。(執行結果為:Error位於第一行:ora-01401:插入數據值對於列過大);

insert into Cool values(8855,'酷兒Test','編寫Java應用程序、游戲等等。');
insert into Cool values(8855,'測試用戶名,此列長度將超過15個字元。','編寫Java應用程序、游戲等等。');

--在表中添加一個列,在表中添加一個Cool_Tel來存儲電話號碼。
alter table Cool add (Cool_Tel varchar(12));

insert into Cool values(8856,'酷兒8856','編寫Java應用程序','13529424360');

--在表中刪除Cool_Tel列;
alter table cool drop column cool_tel;

--Truncate table命令
--刪除表中的記錄而不刪除列,此方法不能回滾因為它不使用事務處理。(優點:刪除速度快)
truncate table cool;(執行結果:表己截斷)

--desc查看cool表的結構
desc cool;

--drop table命令
--刪除Cool表。此方法可以使用事務回滾。
drop table cool;

--數據操縱語言
--選擇命令(Select)
select * from emp;(查詢表中所有數據)
select * from emp where ename='adams';(按條件查詢表中數據)
select distinct * from emp;(不選擇表中的重復行,使用distinct關鍵字);
select * from cool where cool_name='酷兒' order by cool_id asc;(按Coo_ID進行升序排序)
select * from cool where cool_name='酷兒' order by cool_id desc;(按Coo_ID進行降序排序)
create table CoolDemo as select * from cool;(用現有表Cool創建一個新表,數據包括在select語包里,可以是所有,也可以是指定的列)
create table CoolDemo2 as select * from cool where 1 = 2;(此條件不成立,所有隻創建了表結構,沒有數據)
select cool_id+10 sum ,cool_name from cool;(此條語句使用了別名sum並且是cool_id+10語後的值,但原始值不會改變。)

--插入命令(Insert)
insert into cool values(8857,'酷兒','編寫Java應用程序');(在Cool表中插入數據)
insert into cool(cool_name,cool_like) values('酷兒','編寫Java應用程序null');(只插入姓名列(cool_name)和愛好列(cool_like)的值)
insert into cool values(8858,'酷兒',null);(在cool表中跳過了cool_like列,使用空值來填充)
alter table cool add(cool_date date);(在表中添加一個日期列,以便下面插入日期值)
insert into cool values(8859,'酷兒','編寫Java應用程序8859','22-11月-06');(此條語句在Cool表中cool_date列插入了2006年11月12日的日期)
insert into cool select * from cooldemo;(此條語句插入了來自期它表的數據)

--更新命令(Update)
update cool set cool_name='酷兒至酷' where cool_name='酷兒';(如果cool_name列的值等於(酷兒)那麼就將它更改為(酷兒至酷),這是有條件的查詢)
update cool set cool_name='酷兒';(此條語句將cool_name列的所有值更改為(酷兒))

--刪除命令(delete)
delete cool where cool_like='編寫Java應用程序null';(如果cool表中cool_like列值等於(編寫Java應用程序null)就刪除它)

--提交命令(Commit)
commit;(提交事務)
commit work;(功能同上)

--標記命令(SavePoint)
savepoint savepoint_id;(它用來標記事務中可以應用回滾的點。)

--回滾事務(RollBack)
rollback;
rollback work;
rollback to savepoint [自己標記的記錄點];

--數據控制語言

--授權命令(Grant)
Grant [操作許可權如:select,update,delete等] on [表名稱] to [用戶名]
grant select,update,delete on cool to hedong911;(此條語句授權給用戶hedong911查詢、更新、刪除cool表的權力)
grant update(cool_id,cool_name) on cool to hedong911;(此條語句授權給用戶hedong911更新cool表(cool_id,cool_name)列權力)
grant select on cool to hedong911 with grant option;(此語句授權的用戶hedong911可以給其它用戶授權)

--回收授權命令(revoke)
revoke select,update,delete on cool to hedong911;(此條語句回收了hedong911的查詢、更新、刪除權力)

--算術操作符
(跳過)

--比較操作符
--比較操作符包括(=、!=、<、>、<=、>=、between……and(檢查是否在兩個值之間)、in(與列表中的值相匹配)、like(匹配字元模式)和is null(檢查是否為空),最後四個操作符還可以和not(非)一起使用如:not between……and等
select * from cool where cool_name!='1';
select * from cool where cool_name like '酷兒';
select * from cool where cool_id < 8853;
select * from cool where cool_id > 8853;
select * from cool where cool_id <= 8853;
select * from cool where cool_id >= 8853;
select * from cool where cool_like in ('編寫Java應用程序');

--邏輯操作符
--邏輯操作符包括and(與)、or(或)和now(非);
select * from cool where cool_id <=8856 and cool_id >= 8853;
select * from cool where cool_id =9999 or cool_like in ('編寫Java應用程序');

--集合操作符
--聯合查詢(union)
select * from cool union select * from cooldemo;(此條語句將Cool和CoolDemo兩張表的查詢結果合拼,並刪除重復行)

--聯合所有查詢(union all)
select * from cool union all select * from cooldemo;(此條語句將Cool和CoolDemo兩張表的查詢結果合拼,不刪除重復行)

--交集查詢(intersect)
select * from cool intersect select * from cooldemo;(此條語句查詢兩張表都有的行)

--減集查詢(minus)
select * from cool minus select * from cooldemo;(此條語句返回第二張表沒有的數據)

--連接(||)操作符
select ('用戶編號:'||cool_id||'姓名是:'||cool_name||'愛好是:'||cool_like||'日期是:'||cool_date) from cool where cool_id=8859;(運行結果:用戶編號:8859姓名是:酷兒愛好是:編寫Java應用程序8859日期是:22-11月-06)

『貳』 MySql數據類型有哪些

1. MySQL數據類型
在MySQL中有如下幾種數據類型:
(1)數值型
數值是諸如32 或153.4 這樣的值。MySQL 支持科學表示法,科學表示法由整數或浮點數後跟「e」或「E」、一個符號(「+」或「-」)和一個整數指數來表示。1.24E+12 和23.47e-1 都是合法的科學表示法表示的數。而1.24E12 不是合法的,因為指數前的符號未給出。
浮點數由整數部分、一個小數點和小數部分組成。整數部分和小數部分可以分別為空,但不能同時為空。
數值前可放一個負號「-」以表示負值。
(2)字元(串)型
字元型(也叫字元串型,簡稱串)是諸如「Hello, world!」或「一個饅頭引起的血案」這樣的值,或者是電話號碼87398413這樣的值。既可用單引號也可用雙引號將串值括起來。
初學者往往分不清數值87398143和字元串87398143的區別。都是數字啊,怎麼一 個要用數值型,一個要用字元型呢?關鍵就在於:數值型的87398143是要參與計算的,比如它是金融中的一個貨款總額;而字元型的87398143是不 參與計算的,只是表示電話號碼,這樣的還有街道號碼、門牌號碼等等,它們都不參與計算。
(3)日期和時間型
日期和時間是一些諸如「2006-07-12」或「12:30:43」這樣的值。MySQL還支持日期/時間的組合,如「2006-07-12 12:30:43」。
(4)NULL值
NULL表示未知值。比如填寫表格中通訊地址不清楚留空不填寫,這就是NULL值。
我們用Create Table語句創建一個表(參看前面的章節),這個表中包含列的定義。例如我們在前面創建了一個joke表,這個表中有content和writer兩個列:
定義一個列的語法如下:
其中列名由col_name 給出。列名可最多包含64個字元,字元包括字母、數字、下劃線及美元符號。列名可以名字中合法的任何符號(包括數字)開頭。但列名不能完全由數字組成,因 為那樣可能使其與MySQL數據類型分不開。MySQL保留諸如SELECT、DELETE和CREATE這樣的詞,這些詞不能用做列名,但是函數名(如POS 和MIN)是可以使用的。
列類型col_type表示列可存儲的特定值。列類型說明符還能表示存放在列中的值的最大長 度。對於某些類型,可用一個數值明確地說明其長度。而另外一些值,其長度由類型名蘊含。例如,CHAR(10) 明確指定了10個字元的長度,而TINYBLOB值隱含最大長度為255個字元。
有的類型說明符允許指定最大的顯示寬度(即顯示值時使用多少個字元)。浮 點類型允許指定小數位數,所以能控制浮點數的精度值為多少。
可以在列類型之後指定可選的類型說明屬性,以及指定更多的常見屬性。屬性起修飾類型的作用,並更改其處理列值的方式,屬性有以下類型:
(1)專用屬性用於指定列。例如,UNSIGNED 屬性只針對整型,而BINARY屬性只用於CHAR 和VARCHAR。
(2)通用屬性除少數列之外可用於任意列。可以指定NULL 或NOT NULL 以表示某個列是否能夠存放NULL。還可以用DEFAULT,def_value 來表示在創建一個新行但未明確給出該列的值時,該列可賦予值def_value。def_value 必須為一個常量;它不能是表達式,也不能引用其他列。不能對BLOB 或TEXT 列指定預設值。
如果想給出多個列的專用屬性,可按任意順序指定它們,只要它們跟在列類型之後、通用屬性之前即可。類似地,如果需要給出多個通用屬性,也可按任意順序給出它們,只要將它們放在列類型和可能給出的列專用屬性之後即可。
2. MySQL的列(欄位)類型
資料庫中的每個表都是由一個或多個列(欄位)構成的。在用CREATE TABLE語句創建一個表時,要為每列(欄位)指定一個類型。列(欄位)的類型比MySQL數據類型更為細化,它精確地描述了給定表列(欄位)可能包含的值的種類,如是否帶小數、是否文字很多。

『叄』 mysql有幾種數據類型呢分別是哪幾種呢

MySQL 數據類型細分下來,大概有以下幾類:

  • 數值,典型代表為 tinyint,int,bigint

  • 浮點/定點,典型代表為 float,double,decimal 以及相關的同義詞

  • 字元串,典型代表為 char,varchar

  • 時間日期,典型代表為 date,datetime,time,timestamp

  • 二進制,典型代表為 binary,varbinary

  • 位類型

  • 枚舉類型

  • 集合類型

  • 大對象,比如 text,blob

  • json 文檔類型

  • 一、數值類型(不是數據類型,別看錯了)如果用來存放整數,根據范圍的不同,選擇不同的類型。


  • 注意:timestamp 代表的時間戳是一個 int32 存儲的整數,取值范圍為 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999';datetime 取值范圍為 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。

  • 綜上所述,日期這塊類型的選擇遵循以下原則:

  • 1. 如果時間有可能超過時間戳范圍,優先選擇 datetime。2. 如果需要單獨獲取年份值,比如按照年來分區,按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨獲取日期或者時間,最好是單獨存放,而不是簡單的用 datetime 或者 timestamp。後面檢索時,再加函數過濾,以免後期增加 SQL 編寫帶來額外消耗。

  • 4. 如果有保存毫秒類似的需求,最好是用時間類型自己的特性,不要直接用字元類型來代替。MySQL 內部的類型轉換對資源額外的消耗也是需要考慮的。

    示例 5

  • 建立表 t5,對這些可能需要的欄位全部分離開,這樣以後寫 SQL 語句的時候就很容易了。

  • 當然了,這種情形佔用額外的磁碟空間。如果想在易用性與空間佔用量大這兩點來折中,可以用 MySQL 的虛擬列來實時計算。比如假設 c5 欄位不存在,想要得到 c5 的結果。mysql-(ytt/3305)->alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1 Duplicates: 0 Warnings: 0



  • 五、二進制類型

  • binary 和 varbinary 對應了 char 和 varchar 的二進制存儲,相關的特性都一樣。不同的有以下幾點:

  • binary(10)/varbinary(10) 代表的不是字元個數,而是位元組數。

  • 行結束符不一樣。char 的行結束符是 ,binary 的行結束符是 0x00。

  • 由於是二進制存儲,所以字元編碼以及排序規則這類就直接無效了。

  • 示例 6

    來看這個 binary 存取的簡單示例,還是之前的變數 @a。

    切記!這里要提前計算好 @a 佔用的位元組數,以防存儲溢出。


  • 六、位類型

  • bit 為 MySQL 里存儲比特位的類型,最大支持 64 比特位, 直接以二進制方式存儲,一般用來存儲狀態類的信息。比如,性別,真假等。具有以下特性:

  • 1. 對於 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時可以直接十進制來過濾數據。3. 如果此欄位加上索引,MySQL 不會自己做類型轉換,只能用二進制來過濾。

  • 示例 7

  • 創建表 c1, 欄位性別定義一個比特位。mysql-(ytt/3305)->create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)



  • mysql-(ytt/3305)->select cast(gender as unsigned) 'f1' from c1;+------+| f1 |+------+| 0 || 1 |+------+2 rows in set (0.00 sec)


  • 過濾數據也一樣,二進制或者直接十進制都行。mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = b'1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = '1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)


  • 其實這樣的場景,也可以定義為 char(0),這也是類似於 bit 非常優化的一種用法。

  • mysql-(ytt/3305)->create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)


  • 那現在我給表 c1 簡單的造點測試數據。

  • mysql-(ytt/3305)->select count(*) from c1;+----------+| count(*) |+----------+| 33554432 |+----------+1 row in set (1.37 sec)


  • 把 c1 的數據全部插入 c2。

  • mysql-(ytt/3305)->insert into c2 select if(gender = 0,'',null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432 Duplicates: 0 Warnings: 0


  • 兩張表的磁碟佔用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2.ibd


  • 檢索方式稍微有些不同,不過效率也差不多。所以說,字元類型不愧為萬能類型。


  • 七、枚舉類型

  • 枚舉類型,也即 enum。適合提前規劃好了所有已經知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:

  • 1. 最大佔用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 後台存儲以下標的方式,也就是 tinyint 或者 smallint 的方式,下標從 1 開始。4. 排序時按照下標排序,而不是按照裡面元素的數據類型。所以這點要格外注意。

  • 示例 8

  • 創建表 t7。mysql-(ytt/3305)->create table t7(c1 enum('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.03 sec)



  • 八、集合類型

    集合類型 SET 和枚舉類似,也是得提前知道有多少個元素。SET 有以下特點:

  • 1. 最大佔用 8 Byte,int64。2. 內部以二進制位的方式存儲,對應的下標如果以十進制來看,就分別為 1,2,4,8,...,pow(2,63)。3. 最大支持 64 個不同的元素,重復元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標為 1 和 2 的可以一起插入,直接插入 3 即可。

  • 示例 9

    定義表 c7 欄位 c1 為 set 類型,包含了 8 個值,也就是下表最大為 pow(2,7)。

  • mysql-(ytt/3305)->create table c7(c1 set('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.02 sec)


  • 插入 1 到 128 的所有組合。

  • mysql-(ytt/3305)->INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS ( SELECT 1 AS cnt UNION ALL SELECT cnt + 1 FROM ytt_number WHERE cnt < pow(2, 7) )SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128 Duplicates: 0 Warnings: 0

  • 九、數據類型在存儲函數中的用法

    函數里除了顯式聲明的變數外,默認 session 變數的數據類型很弱,隨著給定值的不同隨意轉換。

  • 示例 10

  • 定義一個函數,返回兩個給定參數的乘積。定義里有兩個變數,一個是 v_tmp 顯式定義為 int64,另外一個 @vresult 隨著給定值的類型隨意變換類型。


    簡單調用下。

  • mysql-(ytt/3305)->select ytt_sample_data_type(1111,222) 'result';+--------------------------+| result |+--------------------------+| The result is: '246642'. |+--------------------------+1 row in set (0.00 sec)


  • 總結

    本篇把 MySQL 基本的數據類型做了簡單的介紹,並且用了一些容易理解的示例來梳理這些類型。我們在實際場景中,建議選擇適合最合適的類型,不建議所有數據類型簡單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。

『肆』 SQL Server 2005中,怎麼設置money數據類型的精度

money的精度應該是固定的,如果需要設置精度,可以使用decimal類型

『伍』 SQL語句如何截取欄位中固定位置的值

SQL語句如何截取欄位中固定位置的值有兩種方法:

第一種:用到的函數:substring(' ', , )、charindex(' ',' ')

從字元串『abc123』的第一個字元開始截取,共截取兩個字元,最後得到『ab』。

select SUBSTRING('[email protected]',1,charindex('@','[email protected]')-1)

第二種:electid,substring(str,charindex(',',str)+1,len(str)-charindex(',',str))fromtest;

如果中間間隔為-,則sql語句為selectid,substring(str,charindex('-',str)+1,len(str)-charindex('-',str))fromtest。

『陸』 關於mysql資料庫裡面數據類型number的問題

MySQL 數據類型細分下來,大概有以下幾類:

  • 數值,典型代表為 tinyint,int,bigint

  • 浮點/定點,典型代表為 float,double,decimal 以及相關的同義詞

  • 字元串,典型代表為 char,varchar

  • 時間日期,典型代表為 date,datetime,time,timestamp

  • 二進制,典型代表為 binary,varbinary

  • 位類型

  • 枚舉類型

  • 集合類型

  • 大對象,比如 text,blob

  • json 文檔類型

  • 一、數值類型(不是數據類型,別看錯了)如果用來存放整數,根據范圍的不同,選擇不同的類型。


  • 注意:timestamp 代表的時間戳是一個 int32 存儲的整數,取值范圍為 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999';datetime 取值范圍為 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。

  • 綜上所述,日期這塊類型的選擇遵循以下原則:

  • 1. 如果時間有可能超過時間戳范圍,優先選擇 datetime。2. 如果需要單獨獲取年份值,比如按照年來分區,按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨獲取日期或者時間,最好是單獨存放,而不是簡單的用 datetime 或者 timestamp。後面檢索時,再加函數過濾,以免後期增加 SQL 編寫帶來額外消耗。

  • 4. 如果有保存毫秒類似的需求,最好是用時間類型自己的特性,不要直接用字元類型來代替。MySQL 內部的類型轉換對資源額外的消耗也是需要考慮的。

    示例 5

  • 建立表 t5,對這些可能需要的欄位全部分離開,這樣以後寫 SQL 語句的時候就很容易了。

  • 當然了,這種情形佔用額外的磁碟空間。如果想在易用性與空間佔用量大這兩點來折中,可以用 MySQL 的虛擬列來實時計算。比如假設 c5 欄位不存在,想要得到 c5 的結果。mysql-(ytt/3305)->alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1 Duplicates: 0 Warnings: 0



  • 五、二進制類型

  • binary 和 varbinary 對應了 char 和 varchar 的二進制存儲,相關的特性都一樣。不同的有以下幾點:

  • binary(10)/varbinary(10) 代表的不是字元個數,而是位元組數。

  • 行結束符不一樣。char 的行結束符是 ,binary 的行結束符是 0x00。

  • 由於是二進制存儲,所以字元編碼以及排序規則這類就直接無效了。

  • 示例 6

    來看這個 binary 存取的簡單示例,還是之前的變數 @a。

    切記!這里要提前計算好 @a 佔用的位元組數,以防存儲溢出。


  • 六、位類型

  • bit 為 MySQL 里存儲比特位的類型,最大支持 64 比特位, 直接以二進制方式存儲,一般用來存儲狀態類的信息。比如,性別,真假等。具有以下特性:

  • 1. 對於 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時可以直接十進制來過濾數據。3. 如果此欄位加上索引,MySQL 不會自己做類型轉換,只能用二進制來過濾。

  • 示例 7

  • 創建表 c1, 欄位性別定義一個比特位。mysql-(ytt/3305)->create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)



  • mysql-(ytt/3305)->select cast(gender as unsigned) 'f1' from c1;+------+| f1 |+------+| 0 || 1 |+------+2 rows in set (0.00 sec)


  • 過濾數據也一樣,二進制或者直接十進制都行。mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = b'1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = '1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)


  • 其實這樣的場景,也可以定義為 char(0),這也是類似於 bit 非常優化的一種用法。

  • mysql-(ytt/3305)->create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)


  • 那現在我給表 c1 簡單的造點測試數據。

  • mysql-(ytt/3305)->select count(*) from c1;+----------+| count(*) |+----------+| 33554432 |+----------+1 row in set (1.37 sec)


  • 把 c1 的數據全部插入 c2。

  • mysql-(ytt/3305)->insert into c2 select if(gender = 0,'',null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432 Duplicates: 0 Warnings: 0


  • 兩張表的磁碟佔用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2.ibd


  • 檢索方式稍微有些不同,不過效率也差不多。所以說,字元類型不愧為萬能類型。


  • 七、枚舉類型

  • 枚舉類型,也即 enum。適合提前規劃好了所有已經知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:

  • 1. 最大佔用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 後台存儲以下標的方式,也就是 tinyint 或者 smallint 的方式,下標從 1 開始。4. 排序時按照下標排序,而不是按照裡面元素的數據類型。所以這點要格外注意。

  • 示例 8

  • 創建表 t7。mysql-(ytt/3305)->create table t7(c1 enum('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.03 sec)



  • 八、集合類型

    集合類型 SET 和枚舉類似,也是得提前知道有多少個元素。SET 有以下特點:

  • 1. 最大佔用 8 Byte,int64。2. 內部以二進制位的方式存儲,對應的下標如果以十進制來看,就分別為 1,2,4,8,...,pow(2,63)。3. 最大支持 64 個不同的元素,重復元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標為 1 和 2 的可以一起插入,直接插入 3 即可。

  • 示例 9

    定義表 c7 欄位 c1 為 set 類型,包含了 8 個值,也就是下表最大為 pow(2,7)。

  • mysql-(ytt/3305)->create table c7(c1 set('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.02 sec)


  • 插入 1 到 128 的所有組合。

  • mysql-(ytt/3305)->INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS ( SELECT 1 AS cnt UNION ALL SELECT cnt + 1 FROM ytt_number WHERE cnt < pow(2, 7) )SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128 Duplicates: 0 Warnings: 0

  • 九、數據類型在存儲函數中的用法

    函數里除了顯式聲明的變數外,默認 session 變數的數據類型很弱,隨著給定值的不同隨意轉換。

  • 示例 10

  • 定義一個函數,返回兩個給定參數的乘積。定義里有兩個變數,一個是 v_tmp 顯式定義為 int64,另外一個 @vresult 隨著給定值的類型隨意變換類型。


    簡單調用下。

  • mysql-(ytt/3305)->select ytt_sample_data_type(1111,222) 'result';+--------------------------+| result |+--------------------------+| The result is: '246642'. |+--------------------------+1 row in set (0.00 sec)


  • 總結

    本篇把 MySQL 基本的數據類型做了簡單的介紹,並且用了一些容易理解的示例來梳理這些類型。我們在實際場景中,建議選擇適合最合適的類型,不建議所有數據類型簡單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。

『柒』 sql 中限定為某個數值怎麼寫

限定為某個數值? 不是很理解啥意思呵呵。
有很多方法能確定查詢條件,或者輸出類別。

什麼都不寫,但是有默認值的 default

= 號 也能確定某個特定值。。。
isnull(欄位,'輸出') as 名 也能保證欄位為DBNULL時輸出設定的值。

還有很多函數能實現輸出的變化,Convert()[case()]。

分支語句也能哦,SQL你面的switch(貌似SQL查詢與距離不能寫if..else)

case 欄位 when 欄位值 then '輸出'...else '最後輸出' end
多用在存儲過程。比如:有個欄位status狀態 0,1 你可以用分支語句來設定輸出內容 0就輸出 關閉 1就輸出打開 嘿嘿!

is 關鍵字 在查詢的時候也能指定 某些類別 如 is not null 等。

還有你是不是想問 SQL欄位和.NET裡面的變數映射表啊?MSDN里有哇~
如 short(sql) >> Int16(c#)

『捌』 mysql中常見的數據類型

一:MySQL數據類型

MySQL中定義數據欄位的類型對你資料庫的優化是非常重要的

MySQL支持多種數據類型,大致可以分為三類:數值 日期/時間和字元串

二、數值類型

1.整數類型

『玖』 SQL語言的數據類型中,整數部分3位,小數部分2位的定點小數的定義是什麼

因為要保留3位整數,所以最少是number(5,2)。

舉例演示步驟如下:

1、創建測試表,

create table test_num2(id int , value number(5,2));