SQL杂俎_陪老婆一起学SQL系列_Chapter 02_查询基础1
一、创建一张练习表
1、创建student表
作为一个以实用为目的的学习教程,这里学习《MySQL必知必会》的内容架构,准备将代码创建表格,追加数据,修改表格这几部分的内容放到整个学习过程的后面。
前面的学习以查询数据为核心。
所以,设计了一张练习表,包含了后面可能会用到了大部分知识点所涉及的数据状况。
CREATE TABLE [student] ( [id] varchar(10), [class_no] char(4), [name] varchar(20), [name_en] varchar(20), [birthday] datetime, [sex] varchar(10), [score] int ); INSERT INTO [student] VALUES ('1001','一班','刘盖文','Gavin', '2012-10-12', 'M','86'); INSERT INTO [student] VALUES ('2002','二班','柯步丽','Kimberley', '2012-10-12', 'M','79'); INSERT INTO [student] VALUES ('1003','一班','费里西','Felicia', '2013-11-12', 'F','90'); INSERT INTO [student] VALUES ('3004','三班','撒瓦刀','Salvador', '2013-10-12', 'F','43'); INSERT INTO [student] VALUES ('2005','二班','刘思彤','Stone', '2012-09-12', 'M','55'); INSERT INTO [student] VALUES ('4006','四班','盖冷娜','Galena', '2014-02-10', 'M','16'); INSERT INTO [student] VALUES ('3007','三班','盖瑞森','Garrison', '2012-08-15', 'F','32'); INSERT INTO [student] VALUES ('2008','二班','爪克','Drake', '2013-05-06', 'M','56'); INSERT INTO [student] VALUES ('1009',NULL,'依刷克','Erake', '2013-05-06', 'M','66'); INSERT INTO [student] VALUES ('4006','四班','美芬','Meifen', '2013-02-10', 'M',NULL);
(可以先按步骤操作,表格创建的内容后面会单独介绍)
1)首先打开Navicat软件,点选左侧列表中的SQLite,上方的工具栏中 点选“新建查询”
2)软件中见区域出现了一个编辑器界面
这个位置就是以后编写代码的主战场咯~~~
你在这个界面中所编写的语句被数据库执行,然后得到相应的结果。
3)我们将练习表的代码完整的复制、粘贴到这个编辑器的界面里Ctrl+C、V
然后点击工具栏里的这个绿色箭头,运行代码。
(“运行”旁边的倒三角里面可以实现 仅执行选中部分的当前语句代码)
4)这时候会发现,界面下方出现了一个 “信息”的窗口,
这里是针对运行的代码的状态输出的一个信息,有问题的话会出现明显的报错信息哦~
5)这时候再去双击打开左侧界面里的表 发现在“表”这个模块下面多出来了一个“student”
双击试试看~~~~~~
是不是非常神奇,刚刚输入的代码运行完了之后竟然出现了一张表
大致说明一下每一列的含义,也就是表头的列名
id:学号
class_no:班级
name:姓名
name_en:英文名
birthday:出生日期
sex:性别
score:分数
好了,这样你就得到了一张新鲜出炉的练习表student
接下来的SQL语句练习我们都将基于这一张表进行。
2.保存一段代码
给这个代码文件起个名字,保存起来吧~~~(SQL脚本文件的后缀是“.sql”)
Tips:常用、重要的代码都可以保存起来,以后从文件中打开就可以直接运行,不用重复去写代码哦~
二、SELECT 查询语句基础
和网页浏览器一样,这里的选项卡可以单击切换,“X”关闭。
关掉这些选项卡,新建一个查询
1、列的查询
在数据库里,学生表的结构是这个样子的。
通过Select语句,可以查询出需要的指定列:
语法:
SELECT <列名1>,<列名2>,...
FROM <表名>;
Tips:
# SELECT 后面列举了想要查询出的列的名称,而FROM则指定了选取出数据的表的名称
# SELECT、FROM 这些SQL语句中特殊的部分,我们称之为关键字 ,作为SQL语句中的特殊存在,
规范写法中使用全大写字母,当然小写运行也不会报错。
另外,我们要避免列名和表名与这些关键字相同
# 如果查询多列,每个列名之间要用逗号 “,” 隔开;语句的最后结尾 要用分号“;”表示结束(符号均要使用英文状态下的符号格式输入!!!)
示例1:
SELECT name FROM student;
运行结果:
示例2:
SELECT name,name_en,sex FROM student;
运行结果:
示例3:
SELECT sex,name_en,name FROM student;
运行结果:
Tips:对比示例2、3 查询多列时,列名需要使用逗号进行分隔,查询结果中列的顺序和SELECT语句中列的顺序一致!
示例4:
SELECT id,class_no,name,name_en,birthday,sex,score FROM student;
运行结果:
示例5:
SELECT * FROM student
运行结果:
Tips:对比示例4、5,发现结果是完全一样的
当想查询所有列的时候,可以使用代表所有列的 星号(*)
但是!
当使用 SELECT * 这种方式的时候,没办法设定查询出来的数据的列的顺序 。
按表格原有的列顺序输出。
而且!
当数据量非常的的时候直接使用(*)查询会消耗比较大的运行资源,建议还是只SELECT必要的列出来。
重点!有一个概念要说明,SELECT语句的每一次查询只是改变最终输出的结果
并没有让原数据源student表中的数据发生变化。
2、列 の 别名(Alias)
黑怕界人人都有AKA
一个江湖称谓可能比本人更知名。
SQL语句中使用 关键字 AS 为查询出来的列设定一个新的名称、代号。称之为“别名”
我们在创建基础数据源表格的时候,往往喜欢将列名用单词、字母、拼音缩写去表示。。。
这样方便SQL语句的书写,不用中英文切换,但是查询出结果的时候可能看起来就不是那么明显
我们来看一下使用 关键字AS 的效果:
示例6:
SELECT name AS "姓名", name_en AS "英文名", sex AS 性别 FROM student;
运行结果:
此时输出的结果中显示的列名已经变成列我们设定的中文列名。
Tips:
1)别名可以使用汉字,但规范性的写法需要用 英文字符下的双引号(“)括起来,
实际使用中,其实不用双引号也是可以运行的,可以仔细看一下示例6
但是规范起见,建议使用
2)再次强调
重点!有一个概念要说明,SELECT语句的每一次查询只是改变最终输出的结果
并没有让原数据源student表中的数据发生变化。
别名只是让输出的结果更符合我们使用查看的需求,并没有让student表中的实际列名发生变化。
3、常数、常量的查询显示_临时列
设想一个场景需求:
如果我们在查询想临时多增加几列数据怎么办?
查询的时候增加一列信息标明 ”查询人“
查询的时候增加一列信息标明 ”查询时间“
查询的时候增加一列信息标明 ”满分“是百分制100分
示例7:
SELECT name AS "姓名", name_en AS "英文名", score AS "分数", '古睿可' AS "查询人", '2014-12-29 20:13:14' AS "查询时间", 100 AS "满分" FROM student;
执行结果:
仔细看图中的执行结果,每一行数据都新增了三列我们需要的常数信息。
Tips:
#第一列 '古睿可' 是 字符串常数
第二列'2014-12-29 20:13:14' 是 日期常数
第三列 100 是 数值常数
#SQL语句中 字符串常数和日期常数必须使用 单引号(')括起来
数值常数不需要。注意100 和 '100' 是有区别的,前者是数值可以参与计算,后者是字符串不能直接计算。
4、查询结果去重 _ 删除重复数据行
1)单列去重
当数据量很大的时候,我们想很直接的查询出来这个student表中,涉及哪几个班级的数据?
能不能有方法达到图中的效果?
又引入了一个新的 关键字 DISTINCT(读音:迪斯'廷-科特)
使用DISTINCT 删除班级列的重复数据
示例8:
SELECT DISTINCT class_no FROM student;
执行结果:
2)去重中的奇怪乱入
仔细看示例8的执行结果,和我们预想的结果之间有什么区别?
实际执行结果中多出了一个灰色的 (NULL)
为什么多出来一行数据呢?
Tips:NULL值的概念
NULL 无值、空值。它与字段包含0、仅仅包含空格不同,NULL表示真正意义上的真空~
看一下student表,会发现,班级号和分数都有null值,可以理解为当时漏填或者当时确实不知道分数,先空着在那里,
这与得分是0分的概念是不一样的哦!你细品一下
回到示例8的 distinct语句,不难理解,在对班级这一列数据做删除重复项操作时,
除了一班、二班、三班、四班、还有一个不容忽视的 空值NULL。
如果将其直接删重不显示出来显然是不合适的。
所以
在使用DISTINCT时,NULL也被视为一类数据。类似地,如果存在多条NULL数据,DISTINCT去重后也只会显示出一条NULL。(类比多个一班、二班,去重后的查询结果只会显示出一条数据)
3)多列去重
DISTINCT可以同时对多列使用,相当于将多个列的数据合并,然后查询出不重复的情况。
示例9:
SELECT DISTINCT class_no,sex FROM student;
执行结果:
示例9对班级列、以及性别列去重,可以看到,只有一班男女生都有,所以出现了两条一班的数据。
Tips:多列去重的时候,DISTINCT只能写在第一个列名前,否则会报错。
5、敲代码的好习惯:注释
在敲写代码的时候,经常需要对语句标注一些说明或者备注
在SQL中称之为注释
注释在SQL不会被执行,中英文都可以随意使用,有两种注释的写法:
a.单行注释:以"--"(英文字符状态下的两个短横)开头
b.多行注释:夹在 “/*” 和 “*/” 之间的任意多行内容
示例10:
SELECT --这是第一条单行测试注释 DISTINCT class_no,sex -- 这是第二行单行测试注释 FROM student;
示例11:
/* 这是示例11的第一个 多行 测试 注释!!!*/ SELECT DISTINCT class_no,sex /*这是第二个多行 测试注释 */ FROM student;
执行结果:(示例10 和示例11)
语句执行的效果与没有注释的时候完全一致,注释能够在阅读代码时帮助我们更好地理解一些语句。
是一个敲代码时的好习惯~~~
posted on 2020-12-08 14:17 AtDoldrums 阅读(118) 评论(0) 编辑 收藏 举报