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)

语句执行的效果与没有注释的时候完全一致,注释能够在阅读代码时帮助我们更好地理解一些语句。

是一个敲代码时的好习惯~~~

原文地址:https://www.cnblogs.com/MyDoldrums/p/14093226.html