mysql——知识点扫盲个人向(2019-05-31更新)

StayHungry 求知若渴 StayFoolish 放低姿态

 

目录

1.having

2.INNER JOIN

3.SELECT DISTINCT

4.如何选出来一条数据呢

5.sql语句中“!=”与“<>”的区别

6.char与varchar的区别

7.char与varchar的具体细节?比如去空格操作,还有一些理解

8. blog类型是?

9.blog与text的区别?

10.索引的前缀?mysql不支持后置索引,使用的场景

11.tinyint 也就是boolean类型应该定义为多少位?

12. mysql real类型?

13.汉字占数据库的字节数与编码有关?

14.  sql mod?

15. mysql   int(3) 与 int(6)的区别(别的数据库可能不不太一样)

16. java基本类型的长度区间

17. unsigned的使用场景

18. binary属性是什么?

19. Mysql默认查询是不分大小写的!

20. 设置id自动递增(auto_increment)


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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值