当前位置:首页 » 编程语言 » 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));