SQL速通-001.001-安装MySQL数据管理系统

下载地址

搜索 mysql community download 跳转到 mysql 的官方网站的社区版下载网页。

版本选择

选择 8.0 版本,选择离线安装版。

安装时注意点

  • 可能是家庭版系统的原因,安装时不能选择 development 模式,只好选择 custom 模式,然后额外选择了 odbc, c++ 之类的。
  • 可能是家庭版系统原因,不能选择安装位置,只能默认安装到 C盘,安装完成大约占用 10G 空间。
  • 安装一路下一步即可。
  • 安装时提示没有 visualstudio 也没有关系,这个 vs 连接 mysql 的驱动可以在官网下载,搜索 mysql for visual studio 即可。

SQL速通-003-小查询里有故事

概述

  • sql 分为 server 和 client 两大块
  • 使用时我们在 client 中输入命令,client 把命令通过网络传递给 server
  • server 执行命令并通过网络把结果返回给我们

use

在使用 select 等语句前,一定要确认是否选中了需要用到的 库, 如果没有,那么需要使用 use 命令来选择。

大小写是否敏感

在 win 系统默认不敏感,在 linux 系统默认敏感。 具体还要看是否设置了大小写敏感。

query

  • 在一个查询行为中可包含多个查询语句。
  • 一个查询行为只会产生一个查询结果,也就是说查询行为的次数与查询结果的个数是对应的。
  • 一个包含多条查询语句的查询行为会产生一个查询结果,而在这个结果中包含多个表。

SQL速通-004-万变不离其宗

语法

sql 语法其实就是层层嵌套的套娃语法。基本就是对 select 的层层包装。

select Name from
(select * from abc) as ddd

上面这个就是先从 abc 这个表里面获取数据,然后使用 ddd 这个别名。然后从 ddd 中获取 Name 这一列的内容,作为最终的结果集。

SQL速通-005-数据从何而来

  • select * from abc 指的是获取 abc 表中的所有列
  • select Name from abc 指的是获取 abc 表中的 Name 这一列。

as

as 表示别名。

SELECT P.FirstName, P.MiddleName, P.LastName
FROM Person.Person AS P

derived_table

嵌套时使用,下面括号中的就是 derived_table

SELECT * FROM
(SELECT FirstName, MiddleName, LastName
FROM Person.Person) AS PersonName

view

如果某个 derived_table 经常使用,就可以专门拿出来作为 view,方便使用。

正交组合

SELECT * FROM abc, def

最后的结果是 abc 和 def 中的数据做笛卡尔乘积,如果他们都是 10 行两列,那么最终的结果就是两两组合 10 x 10 = 100 行。

SQL速通-006-给数据做个按摩

正交组合

  • SELECT * FROM abc, def 这个是组合后一共 100 行数据
  • SELECT abc.* FROM abc, def 这个还是一共 100 行数据,只不过只显示 abc 的数据而已。

字符串拼接

  • sql server 中,可以直接使用 + 来拼接字符串
  • mysql 中,只能使用 concat 来拼接字符串

去重

  • distinct 去重,如果只选择一列,那么就是不重复的,如果是多列,那么就是组合是不重复的。
  • all 代表所有,和 distinct 相反。

数量限制

  • sql server 中使用 top 来限制返回的数量
  • mysql 中使用 limit 来限制数量
select CountryCode from city limit 0, 7;

SQL速通-007-源数据的筛选及CTE

  • from 前面是结果集,后面是数据源。
  • where 只能从数据源中进行筛选. 可以把结果集外面加括号,做成一个嵌入进去的数据源。
  • 但是不建议使用嵌套写法,理解麻烦,建议使用 with 语句,方便理解。

查找姓名首字母

有问题

select concat(substring(firstname,1,1),substring(lastname,1,1)) as initial
from person.person where initial='TL'

有问题:筛选的来源必须是数据源,而不能是操作的数据。

筛选过程中使用数据源

select concat(substring(firstname,1,1),substring(lastname,1,1)) as initial
from person.person
where concat(substring(firstname,1,1),substring(lastname,1,1))='TL'

缺点:出现重复语句,后期修改时如果没有全部修改,容易出现错误

把修改的数据做成数据源的形式便于筛选

select * from
(select concat(substring(firstname,1,1),substring(lastname,1,1)) as initial
from person.person) as personname
where initial='TL'

缺点:出现了select的嵌套,不利于后期修改

CTE(Commen Table Expression):先设置好被嵌套的表,后面再引用

with personname as
(select concat(substring(firstname,1,1),substring(lastname,1,1)) as initial
from person.person)

select *
from personname
where initial='TL'

优点:易懂,易修改

SQL速通-007.001-神隐的布尔类型

  • sql server 中不支持直接使用 bool,比如 select 2=2 这个就不行。只能使用 if 2=2 select 'True' else select 'False' 这种形式
  • sql server 中支持隐式的使用 bool, 比如下面代码中的 where 部分
  • mysql 中支持直接使用 bool, select 2=2 返回 1, 错误返回 0
select *
from city
where Population > 100000 and Population < 200000;

SQL速通-007.002-数据的比较

cast

cast 可以转换类型

select 100 = cast('100.1' as float);

科学计数法

  • sql server 不支持科学计数法的隐式转换
  • mysql 支持
select 100.1 = '1001e-1';

字符串

支持字符串大小比较。

select 'Tim' < 'Timo';

日期

可以使用 cast 来强制转换,也可以隐式转换。

cast('2012-01-01' as datetime)

float and real

  • 整型精度最好
  • 非整型中 float 的精度比 real 的精度要好。

SQL速通-007.003-字符串的筛选

大小写敏感

  • sql server 中要看数据库中的 collation

模糊搜索

  • where Name < 'C' 开头小于 C 的字符串
  • where Name like '%AA%'; 中间是 AA,前后随意
  • where Name like '%AA_'; 倒数 2,3 是 AA,其他随意

类正则

  • mysql like 不支持方括号匹配,需要 regexp 才支持,并且必须是正则语法。 sql server like 直接支持。
  • [ac]% 只能 a 或者 c开头
  • [a-z]% a-z 都可以开头
  • [^ac]% 不能 a 或者 c 开头
  • 5[%]% 开头是5,后面接着一个 %,再后面任意字符。 或者 5/%% escape ‘/’ 表示斜杠后面紧跟的是原始字符。

参考