SQL菜鸟学习笔记1

近期看完了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。

之后的放在第二篇文章中~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值