StayHungry 求知若渴 StayFoolish 放低姿态
目录
7.char与varchar的具体细节?比如去空格操作,还有一些理解
11.tinyint 也就是boolean类型应该定义为多少位?
15. mysql int(3) 与 int(6)的区别(别的数据库可能不不太一样)
1.having
having一般是在分组之后在进行筛选使用的
2.INNER JOIN
INNER JOIN 与 JOIN 是相同的。
inner join 通常看作是有效连接 。
INNER JOIN 关键字在表中存在至少一个匹配时返回行
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行full join 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行
3.SELECT DISTINCT
一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。
也就是选出来不重复的符合条件的所有内容
4.如何选出来一条数据呢
SELECT * FROM `xxx` LIMIT 0,1;
limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录n是指从第m+1条开始,取n条。
SELECT * FROM `xxx` LIMIT 1; 是只查出来一条
SELECT * FROM xxx where id=( SELECT MAX(id) FROM xxx where option=1) //憨憨查法
5.sql语句中“!=”与“<>”的区别
标准应该用<>来表示不等于(以后注意)
判断NULL
用is null 或者is not null
6.char与varchar的区别
数据库中设计中,如果使用char(10) 存放三个字符那么也是占用10个存储空间,包括了10个空的字符。
如果使用varchar那么也就是按照实际的长度存储。
效率上:char的效率会更高,以空间换时间
varchar虽然比char节省空间,但是一个varchar列经常被修改,而且每次修改的数据长度不同,这会引起“行迁移的现象”,
而这造成的多余的I/O,是数据库设计中尽量避免的,在这种情况下使用char代替varchar会更好些
所以比如用户名什么的经常改的用char会好点
7.char与varchar的具体细节?比如去空格操作,还有一些理解
当取数据的时候会进行trim(),去空格的操作。因为空间固定所以进行存取的速度更快,不过空间可能会浪费,相当于是用空间来换时间。char对于英文字母和数字存储是每个占一个字节。
char是几个字节呢?char是两个字节的,所有可以用来存储中文(一个中文也是两个字节)
* byte:1 short:2 int:4 long:8 boolean:1
* char:2 float:4 double:8
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
在C++里面char类型的是一个字节,在java和c#使用Unicode编码,且char类型是两个字节,所以可以存放汉字,日文等
char a = 1;
char b = 'b';
char c = '码';
char d = 'ブ';
//只能有一个字符
String e = "abcdef";
char[] arr = e.toCharArray();
char[] f = new char[10];//指定大小
char[] g = new char[]{'字', '符', '串', '数', '组'};
char[] h = {'字', '符', '串', '数', '组'};
String[] i = {"字", "jhjjj"};
8. blog类型是?
blog简单理解就是字节型二进制流,也就是可以存放大的文件或者图片等信息。
9.blog与text的区别?
text 是字符型二进制流
blob类型数据是根据其二进制编码进行比较和排序的,而text类型是文本模式进行比较和排序的。
10.索引的前缀?mysql不支持后置索引,使用的场景
当blob或者varchar还有text等列如果使用索引的话,不能够进行全文索引(太长)
所以使用前置索引,mysql不支持后置索引。
前置索引可以取前面的多少位作为索引内容,使用前置索引的函数
后置索引的场景:比如用户的邮箱的域名,统计不同域名的邮箱的用户数。
前置索引:
11.tinyint 也就是boolean类型应该定义为多少位?
项目中还是定义为tinyint(1)比较合理,其他长度应该是integer类型?
就算定义为tinyint(4) 那么其实存放boolean也是可以的 只不过左补0进行存储。有点浪费空间。
tinyint 的大小是 1 byte大小,所以也就是2的8次方,有一个位是符号位的话,2的七次方
区间:-128 ~ 127
12. mysql real类型?
MySQL also treats REAL as a synonym for DOUBLE PRECISION (a nonstandard variation), unless the REAL_AS_FLOAT SQL mode is enabled.
双精度类型,非标准写法。除非开启REAL_AS_FLOAT ,
13.汉字占数据库的字节数与编码有关?
MySQL 5.0以上的版本:
1.一个汉字占多少长度与编码有关:
UTF-8:一个汉字=3个字节
GBK:一个汉字=2个字节
PS:java 使用Unicode编码 一个汉字占用2个字节
2.varchar(n)表示n个字符,无论汉字和英文,Mysql都能存入n个字符,仅是实际字节长度有所区别
3.MySQL检查长度,可用SQL语言:
select LENGTH(fieldname) from tablename 来查看
转载:https://www.cnblogs.com/chris-oil/p/4787767.html
14. sql mod?
15. mysql int(3) 与 int(6)的区别(别的数据库可能不不太一样)
无论是int(3), int(6), 都可以显示6位以上的整数。但是,当数字不足3位或6位时,前面会用0补齐。
它在数据库里面存储的都是4个字节的长度(int是四个字节)
所以用int 或者int(3) int(10)
都没有关系,都是四个字节
如果选用了zerofill 会对少于位数的进行补零,才会有区别。
ALTER TABLE `dk_db`.`user_table`
CHANGE COLUMN `hh` `hh` INT(3) ZEROFILL NULL DEFAULT NULL ;
设置了zerofill ,才会有不同。
那如果我设定int(100)呢,那样如果选择了zerofill 那么就会补超多的0,实验证明只是MYSQL前端给你显示超多的0,
实际上还是原来的数。
16. java基本类型的长度区间
字符数据类型的范围:0 *** 65535
字节数据类型的范围:-128 *** 127
短整型数据类型的范围:-32768 *** 32767
整型数据类型的范围:-2147483648 *** 2147483647
长整型数据类型的范围:-9223372036854775808 *** 9223372036854775807
单精度数据类型的范围:1.4E-45 *** 3.4028235E38
双精度数据类型的范围:4.9E-324 *** 1.7976931348623157E308
17. unsigned的使用场景
unsigned 就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。看起来unsigned 是个不错的类型,尤其是用在自增或者没有负数的情况。但是在实际使用中会出现一些意外的情况。
两个字段均为unsigned int型,插入两个值,然后做减法运算时报错,并不是我们想要的结果,正常情况 1-2=-1,但是当数据类型为unsigned时,MySQL 运算的结果也是unsigned,而 -1 已经超出了unsigned 范围,所以会报错。
如何解决这个问题呢,设置一下sql_mode就可以解决这个问题
set sql_mode = 'NO_UNSIGNED_SUBTRACTION'
sql_mode 的设置是有风险的,因为可以通过这个设置允许一些非法的操作。如将 null 值插入not null字段,将非法的日期2017-12-32插入到日期字段。一般在生产环境都都设置为严格模式。所以在不熟悉MySQL底层机制或者不了解 unsigned 原理时,慎用它。
unsigned 属性只针对整型,而binary属性只用于char 和varchar。!!
转自:https://www.cnblogs.com/Latiny/p/8058209.html (写的不错很好的解决了这个问题)
18. binary属性是什么?
Mysql默认查询是不分大小写的,可以在SQL语句中加入 binary来区分大小写;
BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写(在查询的时候加上binary是区分大小写的)
SELECT * FROM `user_table` WHERE BINARY user_name = "dk";
比如这样,也就是加上BINARY之后就可以区分大小写了。然而varchar类型勾选不上二进制。。。
二进制类型是在数据库中存储二进制数据的数据类型。二进制类型包括binary,varbinary,bit,tinyblob,blob,mediumblob,longblob。
binary类型的长度是固定的,在创建表时就指定了。不足最大长度的空间由‘\0’补全。举个例子,binary(50)就是指定binary类型的长度为50。
varbinary类型的长度是可变的,在创建表时指定了最大长度。指定好了varbinary类型的最大值以后,其长度可以在0到最大长度之间。
bit类型 bit类型也是在创建表时指定了最大长度,其基本形式如下:bit(M) ,最大值64位 在查询bit类型的数据时,要用bin(字段名+0)来将值转换为二进制显示
参考:https://blog.csdn.net/u011794238/article/details/50962702
19. Mysql默认查询是不分大小写的!
20. 设置id自动递增(auto_increment)
CREATE TABLE stu(
classId int primary key auto_increment,
name varchar(50)
);
21. 数据库时间类型区别
Date数据类型:用来存储没有时间的日期。Mysql获取和显示这个类型的格式为“YYYY-MM-DD”。支持的时间范围为“1000-00-00”到“9999-12-31”。
Datetime类型:存储既有日期又有时间的数据。存储和显示的格式为 “YYYY-MM-DD HH:MM:SS”。支持的时间范围是“1000-00-00 00:00:00”到“9999-12-31 23:59:59”。
Timestamp类型:也是存储既有日期又有时间的数据。存储和显示的格式跟Datetime一样。支持的时间范围是“1970-01-01 00:00:01”到“2038-01-19 03:14:07”。
TIME数据类型表示一天中的时间。MySQL检索并且以"HH:MM:SS"格式显示TIME值。支持的范围是'00:00:00'到'23:59:59'。
22. datetime 与 timestamp 有啥区别
- datetime的默认值为null,timestamp的默认值不为null,且为系统当前时间(current_timestatmp)。如果不做特殊处理,且update没有指定该列更新,则默认更新为当前时间。
- datetime占用8个字节,timestamp占用4个字节。timestamp利用率更高。
- 二者存储方式不一样,对于timestamp,它把客户端插入的时间从当前时区转化为世界标准时间(UTC)进行存储,查询时,逆向返回。但对于datetime,基本上存什么是什么。
- 二者范围不一样。timestamp范围:‘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’。原因是,timestamp占用4字节,能表示最大的时间毫秒为2的31次方减1,也就是2147483647,换成时间刚好是2038-01-19 03:14:07.999999。
- 转载:https://www.cnblogs.com/liuxs13/p/9760812.html
23. char varchar text 类型的选用和区别
char 定长,长度范围0 - 255 当存储一个不够255字符的时候,mysql使用空格进行填充
所以在读取数据的时候,char类型会去掉空格操作
varchar:以前长度是255,在5.0.3以上版本就是可以最高65535
text:不可以有默认值!
经常变化的字段用varchar 知道固定长度的用char 尽量用varchar 超过255字符的只能用varchar或者text 能用varchar的地方不用text