系统学习SQL1:误入SQL Server
Posted hunpi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统学习SQL1:误入SQL Server相关的知识,希望对你有一定的参考价值。
误入SQL Server
参考《SQL结构化查询语言速查宝典 第2版》,数据库软件是SQL Server。
从第2篇SQL数据查询和处理
篇、第4章SQL数据查询
开始学习 。
粗想一下,使用串联的方式可以直接读取一行数据,某种程度上更加方便。
4.1 SQL数据查询功能使用select语句完成,并以表格的形式返回查询结果。
SQL语法结构:
select [all| distinct] select_list (查询n个列)
from table_list/view_list (从n个表或视图中)
[where conditions] (检索条件,限制行)
[group by group_list] (对查询结果进行分组)
[having conditions] (组的限制条件,限制组)
[order by order_list] (对查询结果进行排序)
4.2 投影查询:指查询特定的列。简单说明:
查询单列,select id from users。
查询多列,select id,username from users。
查询所有列,select * from users。
消除重复列,select distinct username from users
4.3 列的计算、及别名查询
列的计算:数据库表的各列之间不存在函数依赖,为了方便查询,可以使用运算符。
现实问题:表里存储的是员工工资,而我们想要通过工资计算奖金,就可以使用运算符,比如select salary*0.08 from employee
,这种字段成为虚拟字段
(运算符:加减乘除、大于小于等于)。
衍生问题1-列标题:查询表里已有的字段,视图会返回列名及其列值,但上面这种列的计算没有列标题。开发者设计了别名查询,比如select salary*0.08 as bonus from employee
。
衍生问题2-列精度:函数column_name decimal(P,D)
,P表示有效数字数的精度,重点是D表示小数点后的位数。需要搭配显示类型转换函数(cast('9.5' as decimal(10,0)))
。
比如select (cast(salari*0.08 as decimal(18,2))) as bonus from employee
。
select的条件查询,除了where子句、having子句,还有select关键字后的case子句。
比如case when xx>90 then '优秀' when xx>80 and xx<=90 then '良' end from grade
。
完整的查询语句是,select score,estimate=case score=xx then xx end from grade
。
4.3 连接列值,串联多列为1列-解锁假姿势!
解锁新姿势!select不需要逗号,
就可以查询多列。在Union查询中可能会用到。
现实问题:用户查看抽象的、没有说明的查询结果不方便。
设计方法-串联:可以把不同的列值连接起来,并加上说明性文字,即合并成单列。如
select username +'的工资是:'+cast(salary as varchar(10)) as 工资说明 from employee
。
(对数值型字段,需要使用cast()转换成字符串型,才能与字符串连接)
mysql串联测试-不能用加号,要用concat()
MySQL中不能使用+
号连接字符串,但MySQL有2-3类型转换函数。
concat(id,str2)连接字符串,可以把int转换成char。(如果算进类型转换函数)
主流是这两种:cast(x as x)。以及convert(xx,xx),具体查看参考文章。
varchar()函数会报错,使用char()不会报错。
select cast(id as char(10))+username+ as chuanlian from users;
串联失败,只返回id列的值。
原因:在MySQL中+号有且只有一个功能,运算符。即只能作加法,不能连接字符串。
int+字符串,系统会尝试把字符串转换成int,本地测试发现转换的结果是0。
堆信息
关于嵌套查询,又称为子查询,需要对虚拟表进行命名。
否则会报错ERROR 1248 (42000): Every derived table must have its own alias
,即每一个派生出来的表都必须有它自己的别名。
比赛中比较小众,但实战中可能会出现的:
like注入,基于关键词模糊查询。还有order by 注入。
4.9 排序查询:语句order by 关键字/第几列
。
问题:为何order by可以用第几列,select不能用第几列?
解答:因为select 数字
的查询结果就是数字本身,比如select 1的结果就是1。
总结
收获
关键词总结:投影查询、虚拟字段的别名查询、列的串联。
2-3个类型转换函数、+号的功能。
参考
主要参考《SQL结构化查询语言速查宝典 第2版》,数据库软件是SQL Server。
《MYSQL学习:基础查询:去重,+号用法,连接字符串》,2021-01
https://www.icode9.com/content-2-815083.html
《MySQL数字类型转换函数(concat/cast)1、将Int转为varchar经常用concat》, 2016
https://blog.csdn.net/u011334621/article/details/53011359
《Every derived table must have its own alias(sql语句错误解决方法)》,2018-10
https://blog.csdn.net/qq_32863631/article/details/83024322
反思
目前贴合实际的,应该是看MySQL方面的书籍,而不是SQL Server。
但是这本书写得很好,让人有一种继续读下去的冲动,如果找不到合适的MySQL书籍,
可以学习这本书来了解SQL的相关概念和应用场景。
以上是关于系统学习SQL1:误入SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
【SQL Server问题1】哪位大神能帮忙看一下这10问。最好给点简单的说明。十分感激,手上财富已全部奉上