zoukankan      html  css  js  c++  java
  • 2 SQL 查询基础

    2 查询基础

    2-1 SELECT语句基础

    通过SELECT语句查询并选取必要数据的过程称为匹配查询或查询(query)。

    子句是SQL语句的组成要素,是以SELECT或者FROM等作为起始的短语。

    查询出的列的顺序可以任意指定。查询多列是,需要使用逗号进行分隔排序。查询结果中列的顺序和SELECT子句中的顺序相同。

    列的查询

    -- SELECT <列名>, ...... FROM <表名>;

    SELECT shohin_id, shohin_mei FROM shohin;

    查询全部的列

    -- SELECT * FROM <表名>;

    SELECT * FROM shohin;

    SELECT shohin_id AS id,shohin_mei AS namae FROM shohin;

    法则2-1

    星号(*)代表全部列的意思。

    如果使用星号的话,就无法设定列的显示顺序了。这时就会按照CREATE TABLE语句的定义对列进行排序。

    SQL语句可以使用AS关键字为列设定别名。

    别名可以使用汉语,使用汉语时需要用双引号(“)括起来。

    为列设定别名

    SELECT shohin_id AS id,shohin_mei AS namae FROM shohin;

    法则2-2

    设定汉语别名时需要使用双引号(“)括起来。

    SELECT子句中不仅可以书写列名,还可以书写常数。

    常数的查询

    SELECT '商品' AS mojiretsu, 38 AS kazu, '2009-02-24' AS hizuke, shohin_id, shohin_mei FROM shohin;

    -- SELECT子句中的第一列“商品”是字符串常数,第二列38是数字常数,第三列“2009-02-24”是日期常数,它们将与shohin_id列和shohin_mei列一起被查询出来。

    如果想要删除重复行时,可以通过在SELECT子句中使用DISTINCT来实现。

    从结果中删除重复行

    SELECT DISTINCT shohin_bunrui FROM shohin;

    SELECT DISTINCT shiire_tanka FROM shohin;

    SELECT DISTINCT shohin_bunrui FROM shohin;

    SELECT DISTINCT torokubi FROM shohin;

    SELECT  torokubi, shohin_bunrui FROM shohin;

    SELECT DISTINCT  torokubi, shohin_bunrui FROM shohin;

    在使用DISTINCT时,NULL也被视为一类数据。存在多条NULL数据行时,也会结合为一条NULL数据。

    法则2-3

    在SELECT语句中使用DISTINCT可以删除重复行。

    DISTINCT关键字只能用在第一个列名之前。因此,请注意不能写成torokubi,DISTINCT shohin_bunrui。

    SELECT语句通过WHERE子句来指定查询数据的条件。在WHERE子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。执行含有这些条件的SELECT语句,就可以查询出只符合该条件的记录了。

    根据WHERE语句来选择记录

    -- SELECT <列名>, ...... FROM <表名> WHERE <条件表达式>;

    SELECT shohin_mei, shohin_bunrui FROM shohin WHERE shohin_bunrui = '衣服';

    -- 首先通过where子句查询出符合指定条件的记录,然后再选取select语句指定的列

    SQL中子句的书写顺序是固定的,不能随意更改。WHERE子句必须紧跟在FROM子句之后。书写顺序发生改变的话会造成执行错误。

    法则2-4

    WHERE子句要紧跟在FROM子句之后。

    MySQL中需要在“--”之后加入半角空格(如果不加的话就不会被认为是注释)。

    注释的书写方法

    一行注释:书写在“—”之后,只能写在同一行。

    多行注释:书写在“/*”和“*/”之间,可以跨多行。

    法则2-5

    注释是sql语句中用来标识说明或者注意事项的部分,分为1行注释和多行注释两种。

    2-2 算术运算符和比较运算符

    SQL语句中可以使用计算机表达式。

    算术运算符

    SELECT shohin_mei, hanbai_tanka, hanbai_tanka * 2 AS "hanbai_tanka_x2" FROM shohin;

    运算就是这样以行为单位执行的。

    所有包含NULL的计算(+ - * /),结果肯定是NULL。

    通常情况下,类似5/0这样除数为0的话会发生错误,只有NULL除以0时不会发生错误,并且结果还是NULL。

    SQL语句中可以使用的四则运算的主要运算符 :

    加法运算(减法、乘法、除法) : + - * /

    四则运算所使用的运算符(+ - * /)称为算术运算符。运算符就是使用其两边的值进行四则运算或者字符串拼接、数值大小比较等运算,并返回结果的符合。

    只包含SELECT子句的SELECT语句:

    SELECT (100+200)*3 AS keisan;(此处说明FROM子句也不一定是必要的)

    法则2-6

    SELECT子句中可以使用常数或者表达式。

    像符号 = 这样用来比较其两边的列或者值的符号称为比较运算符。符号 = 就是比较运算符。

    比较运算符

    SELECT shohin_mei, shohin_bunrui FROM shohin WHERE hanbai_tanka <> 500;

    SELECT shohin_mei, shohin_bunrui FROM shohin WHERE hanbai_tanka >= 1000;

    SELECT shohin_mei, shohin_bunrui FROM shohin WHERE torokubi < '2009-09-27';

    -- 使用比较运算符对计算结果进行比较

    SELECT shohin_mei, hanbai_tanka, shiire_tanka FROM shohin WHERE hanbai_tanka - shiire_tanka >= 500;

    比较运算符 :相等(=)、不相等(<>)、大于等于(>=)、大于(>)、小于等于(<=)、小于(<)

    这些比较运算符可以对字符、数字和日期几乎所有数据类型的列和值进行比较。

    一定要注意不等号(<>)和等号(=)的位置不能颠倒。一定要让不等号在左,等号在右。

    法则2-7

    使用比较运算符是一定要注意不等号和等号的位置。

    对字符串使用不等号时的注意事项

    -- DDL 创建表

    CREATE TABLE chars (

    chr CHAR(3) NOT NULL,

    PRIMARY KEY (chr)

    );

    START TRANSACTION;

    INSERT INTO chars VALUES ('1');

    INSERT INTO chars VALUES ('2');

    INSERT INTO chars VALUES ('3');

    INSERT INTO chars VALUES ('10');

    INSERT INTO chars VALUES ('11');

    INSERT INTO chars VALUES ('222');

    COMMIT;

    SELECT chr FROM chars WHERE chr > '2';

    输出:3   22

    /*

    现在,chr列被定为字符串类型,并且在对字符串类型的数据进行大小比较时,使用的是和数字比较不同的规则。典型的规则就是按照字典顺序进行比较,也就是像姓名那样,按照条目在字典中出现的顺序来进行排序。该规则最重要的一点就是,以相同字符开头的单词比不同字符开头的单词更相近。

    char类型排序

    1    10     11   2   22    3  数据

    1    1-1   1-2  1-3   2  2-1  2-2 3  数据排序

    */

    法则2-8

    字符串类型的数据原则上按照字典顺序进行排序。不能与数字的大写顺序混淆。

    对比较运算符来说还有一点十分重要。那就是,作为查询条件的列中含有NULL的情况。

    即使使用 <> 运算符也还是无法选取出NULL的记录。因此,SQL提供了专门用来判断是否为NULL的运算符IS NULL;反之,希望选取不是NULL的记录时,需要使用IS NOT NULL运算符。

    不能对NULL使用比较运算符

    SELECT shohin_mei, shiire_tanka FROM shohin WHERE shiire_tanka IS NULL;

    SELECT shohin_mei, shiire_tanka FROM shohin WHERE shiire_tanka IS NOT NULL;

    法则2-9

    希望选区NULL记录时,需要在条件表达式中使用IS NULL运算符。 希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL。

    2-3 逻辑运算符

    NOT不能单独使用,必须和其他查询条件组合起来使用。

    NOT运算符

    SELECT shohin_mei, shohin_bunrui, hanbai_tanka FROM shohin WHERE hanbai_tanka >= 1000;

    SELECT shohin_mei, shohin_bunrui, hanbai_tanka FROM shohin WHERE hanbai_tanka < 1000;

    SELECT shohin_mei, shohin_bunrui, hanbai_tanka FROM shohin WHERE NOT hanbai_tanka >= 1000;

    通过以上的例子大家可以发现,不使用NOT运算符也可以编写出效果相同的查询条件。不仅如此,不使用NOT运算符的查询条件更容易让人理解。建议不用滥用。

    法则2-10

    NOT运算符用来否定某一条件,但是不能滥用。

    在WHERE子句中使用AND运算符或者OR运算符,可以对多个查询条件进行组合。

    And运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于并且。

    Or运算符在其两侧的查询条件有一个成立时整个查询条件都成立,其意思相当于或者。

    AND运算符和OR运算符

    -- 文氏图 图解工作效果图

    SELECT shohin_mei, shiire_tanka FROM shohin WHERE shohin_bunrui = '厨房用具' AND hanbai_tanka >= 3000;

    SELECT shohin_mei, shiire_tanka FROM shohin WHERE shohin_bunrui = '厨房用具' OR hanbai_tanka >= 3000;

    法则2-11

    多个查询条件进行组合时,需要使用AND运算符或者OR运算符。

    法则2-12

    文氏图很方便。

    通过括号进行强化

    SELECT shohin_mei, shohin_bunrui, torokubi FROM shohin

    WHERE shohin_bunrui = '办公用品' AND torokubi = '2009-09-11' OR torokubi = '2009-09-20';

    /*

    分析:and运算优先于or运算执行

    【shohin_bunrui = '办公用品' AND torokubi = '2009-09-11'】 OR 【torokubi = '2009-09-20'】

    也就是;   "商品种类是办公用品,并且登记日期是2009-09-11" 或者 "登记日期是2009-09-20"

    */

    SELECT shohin_mei, shohin_bunrui, torokubi FROM shohin

    WHERE shohin_bunrui = '办公用品' AND ( torokubi = '2009-09-11' OR torokubi = '2009-09-20' );

    法则2-13

    And运算符的优先级高于OR运算符,想要优先执行OR运算符时可以使用括号。

    法则2-14

    通过创建真值表,无论多复杂的条件,都会更容易理解。

    真值就是值为真(TRUE)或假(FALSE)其中之一的值。

    含有NULL时的真值,既不是真也不是假,这时真值是除真假之外的第三种值—不确定(UNKNOWN)。与通常的逻辑运算被称为二值逻辑相对,只有SQL中的逻辑运算被称为三值逻辑。

  • 相关阅读:
    IE调试页面总结
    解决XAMPP不能启动Apche服务问题
    WCF与Ajax开发实践系列课程
    Team Foundation 中的错误和事件消息
    设置SVN提交日志必填
    MyBatis.Net 学习手记
    PandorBox 中安装aria2失败的解决办法
    Linux 启动出现 busybox vx.x.xx built-in shell 的问题
    Sql Server 中查询存储过程的修改时间
    ubuntu挂载和挂载NTFS分区命令
  • 原文地址:https://www.cnblogs.com/yly-blog/p/9808362.html
Copyright © 2011-2022 走看看