zoukankan      html  css  js  c++  java
  • 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)

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

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

  • 相关阅读:
    人见人爱a+b,算出两个时间的和
    远程推送原理
    iOS中的定时器
    四大对象
    核心动画类关系图
    无沙盒缓存原理
    应用程序的生命周期
    同样明文同样算法得到不同密码原理
    线程状态
    iOS中的几个重要方法
  • 原文地址:https://www.cnblogs.com/MyDoldrums/p/14093226.html
Copyright © 2011-2022 走看看