近期看完了SQL菜鸟学习教程,SQL 总结 | 菜鸟教程 对其中遇到的一些疑惑和学习笔记打算做做整理,分几篇发出来,供大家交流和自己以后方便查看 :D
问题一:如果select同时选取不同表里不同列,会是什么情况?
问题二:关于通配符的其他tips
问题三:关于order by多列时
问题四:关于SQL server里top 百分比时
问题五:关于select和子语句计算的顺序
问题六:列名包含空格时的表达方法
问题七:关于SQL不分大小写的问题
问题八:关于insert into select的新表里有标识列
问题九:关于数据类型
问题十:关于数据编码方式
问题一:如果select同时选取不同表里不同列,会是什么情况?
1、显示结果:从两个不同的表AB里选取A1B1列,得到的是A1每一个元素分别对应B1的所有元素的结果,也就是说会有A1*B1行。
2、选取多列呢?B表中再加上B2列,同样是A1每一个元素对应的B1B2的元素的结果;同理在A表中加上若干列;
3、如果加上distinct呢?A1B1列前加一个distinct,会把原查询结果中行内容相同的去掉。
4、如果加上where子句条件?假设两个表有一列是对应的,比如一张网站表的网站编号,和另一张表里有一列是网站编号,相当于是类似外键,反正就是能对应起来啦,然后选取两个表里的列后,在加上where a.id=b.site_id,结果就是!
默认为,如果两边id 和site id 都是唯一的值unique的,最左边的列是哪个表的,出来的查询表的顺序就是哪个;如果两边有一边是不唯一的值,那么对应时就以不唯一的值那个表的顺序排列;其中的结果就是inner join。
问题二:关于通配符的其他tips
1、通配符也可以代替数字 count like '%0'
2、select * from 表 where 列 like 'G%';(G开头的所有)
not like
'%G'(最后一个是G)
'%G%'(中间包含G)
'g_o_le'
'[aln]%' (以a、l、n开头的所有)
'[!aln]%' (不以a、l、n开头的所有)(SQLserver里!不行)
'[^aln]%' (不以a、l、n开头的所有)
3、正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
4、发现一个选取在某个模糊范围内,SQLserver里可以用的方法。菜鸟网站上,mySQL上可以用like[^a-h],但server不行,刚好看到后一章between,突然想结合between和通配符,也可以诶
select * from Websites where name between 'a%' and 'g%';
比如这样,就是选取abcdef,不包括g
问题三:关于order by多列时
按列的先后顺序,依次排序
问题四:关于SQL server里top 百分比时
1、如果百分比后不是整数的,按加1来算。比如5行的50%,显示3行。
2、如果没有特定指定的列,则可以写*默认选择全部列。
select top 50 percent * from Websites;
问题五:关于select和子语句计算的顺序
1、order by和 where 先,最后是select。也就是说,比如先order by顺序,然后再从中select选取内容。
问题六:列名包含空格时的表达方法
如果列名包含空格,那么在写的时候site_id 也可能是[app name],就是说可以加下划线或者[ ]
问题七:关于SQL不分大小写的问题
SQL语句不分大小写,distinct和union的结果也是!查询出来的数据表按大小写一样给去重了。
问题八:关于insert into select的新表里有标识列
如果新表有规定好的自增标识列的话,则无法把原表的*复制过去;
如果把新表的自增标识去除的话,则可以把原表的*复制过去;
如果不关闭自增标识的话,单独复制其他所有列,成功,但是自增标识列会有问题。
问题九:关于数据类型(这个真的晕晕的)
char、varchar和nvarchar的区别
-
char(n)是固定长度的,而varchar会根据具体的长度来使用存储空间,后面的n是多少就用多少个字节存储。对于已知长度和都差不多类似长度的用char比较好,减少因数据长度前后不一致导致的存储空间碎片困扰。
-
varchar(n):长度为n个字节的可变长度且非Unicode的字符数据。n必须是一个介于1和8,000之间的数值。存储大小为输入数据的字节的实际长度+一个记录字符串长度的字节,相比char,在可变的长度字符串存储中就很节省空间。另外,考虑到内存是根据n的内存块来保存值,所以还是不能在n上过于慷慨。
-
nvarchar(n):包含n个字符的可变长度Unicode字符数据。n的值必须介于1与4,000之间。字节的存储大小是所输入字符个数的两倍。
-
前面带n就是Unicode编码
如何选择数据类型?
-
如果数据量非常大,又能100%确定长度且保存只是ansii字符,那么char
-
能确定长度又不一定是ansii字符或者,那么用nchar;
-
对于超大数据,如文章内容,使用nText
-
其他的通用nvarchar
考虑到字节存储上的进一步深入
中文字符存储到SQL Server中会保存为两个字节(一般采用Unico编码),英文字符保存到数据库中,如果字段的类型为varchar,则只会占用一个字节,而如果字段的类型为nvarchar,则会占用两个字节.
考虑存储:varchar比较好
考虑兼容性(中文在英文主机下可能乱码):nvarchar
总结:如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar
问题十:关于数据编码方式(这个真的晕晕的+n)
1、ASCII码:每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种 状态,这被称为一个字节(byte)。一个字节一共256种,从 0000000到11111111。
ASCII码一共规定了128个字符的编码(英文字母+符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
2、非ASCII编码:不同的国家有不同的字母,比如, 简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。
3、Unicode:是一种包含所有符号的编码,现在的规模可以容纳100多万个符号。Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
4、UTF-8:UTF-8是Unicode的实现方式之一。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
5、Little endian和Big endian:Unicode码可以采用UCS-2格式直接存储。以汉字”严“为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。
详细看这篇文章 ↓
字符编码之ASCII码、Unicode、UTF-8的关系和区别_liugec的博客-CSDN博客
关于十进制、二进制、十六进制等:
十进制转二进制的计算方法(整数部分):数不停的除2,直到小于1,然后把余数从后往前排列一下
同理十六进制,但是十六进制包含数字和字母,用英文字母A B C D E F来分别表示数字10-15,计数到F后,再增加一位,就进位。
十六进制数是计算机常用的一种计数方法,它可以弥补二进制数书写位数过长的不足,也用于电视机中。十六进制数的表示方式为0x开头。示例:0xAF=175
关于Unicode和GB2312:
于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。但是目前的电脑来看,硬盘都是白菜价,电脑性能也已经足够无视这点性能的消耗了。所以推荐所有的网页使用统一编码:UTF-8。
之后的放在第二篇文章中~