zoukankan      html  css  js  c++  java
  • 【SQL语言】SQL语言基础01

    1、了解sql

    1.1数据库基础

    1.1.1数据库(database)

      :保存有组织的数据的容器(通常是一个文件或一组文件)(也可理解为某种有组织的方式存储的集合)
      注:数据库软件称为DBMS(数据库管理系统)

    1.1.2表(table)

      :某种特定类型数据的结构清单(同一个类型且名字唯一)
      特性:
      定义了数据在表中如何存储,包含存储什么样的数据,和数据如何分解命名等~
      表名:使表名成为唯一的,实际上是数据库名和表名等的组合。
      模式:关于数据库和表的布局等特性信息。

    1.1.3列(column)

      :表中的一个字段。所有表都是由一个或者多个列组成
      注:
      每个列都有相应的数据类型。
      数据类型(datatype)
      :定义了列可以存储哪些数据种类。

      分解数据:
      正确的将数据分解为多个列极为重要。

    1.1.4行(row)

      :表中的一个记录

    1.1.5主键(primary key)

      一组(或一列)其值能够唯一标识表中每一行。
      提示:
      应该总是定义主键,虽然并不总是需要主键,但多数数据库设计者都
      会保证增他们创建的每个表都具有主键,以便于以后的数据操作
      和管理。

      表中的任何列都可以作为主键,只要它满足以下条件:
      1)任意两行都不具有相同的主键值
      2)每一行都必须具有一个主键值(主键列不允许NULL值)
      3)主键列中的值不允许修改或更新
      4)主键值不能重用(如果某行从表中删除,他的主键不能赋值给以后的新行)

    1.2什么是SQL

      SQL是Structured Query Language(结构化查询语言的缩写)。SQL
      是专门用来与数据库沟通的语言
      优点:
      1)sql不是某个特定数据库供应商准有的语言,几乎所有重要的
       DBMS都支持SQL
      2)简单易学
      3)可以进行非常复杂和高级的数据库操作

    2、检索数据

    2.1 SELECT语句

      关键字(Keyword):
      作为SQL组成部分的保留字。关键字不能用作表或列的名字。
      附录E列出了某些常用的保留字
      提示:SQL是一种语言而不是一个应用程序,具体如何写SQL语句并显示输出,是随不同的应用程序而变化的

    2.2检索单个列

      select pro_name From Products;
      上述语句利用select语句从Products表中检索一个名为pro_name的列。
      所需列名跟在select之后,from关键字支出从那个表中检索数据

      提示:
      多数SQL语句以分号(;)分隔。
      SQL语句不区分大小写因此SELECT与select是相同的。许多开发人员
      喜欢对SQL关键字使用大写,而对列名和表名使用小写,这样做使代码更易于阅读和调试。
      不过虽然SQL是不区分大小写的,但是表名、列名和值可能有所不同(具体情况依赖于DBMS的配置)
      在处理SQL语句时,其中所有空格都被忽略。SQL可写成长长的一行也可以分写多行

    2.3检索多个列

      检索多个列时,仍使用相同的SELECT语句。唯一不同的是必须在SELECT关键字后给出多个列名,
      列名之间必须以逗号分隔。

      提示
      数据表示
      SQL语句一般返回原始的,无格式的数据。数据的格式化是表示问题,而不是检索问题。
      因此,表示一般显示该数据的应用程序中规定。通常很少直接使用实际检索出的数据(没有应用程序提供的格式)

    2.4检索所有列

      在实际列名的位置使用星号(*)通配符

      提示如果给定一个通配符(*),则返回表中所有列。列的顺序一般是列在表定义中出现的物理顺序
      但并不总是如此。
      最大的优点是检索出未知列

    2.5检索不同的值(distinct)

       DISTINCT它指示数据库只返回不同(具有唯一性)的值。如果使用distinct关键字,它必须放在列名前面

      提示不能部分使用distinct
      此关键字作用于所有的列,不仅仅是跟在其后的那一列。除非指定的列完全相同,否则所有的行都会被检索出来

    2.6限制结果

      如果你想返回第一行或一定数量的行,但是在不同的数据库中这一实现并不相同
      在SQL sever和Access中可以使用TOP关键字来限制最多返回多少行
      例:
        SELECT TOP 5 pro_name FROM Products;
      此代码使用SELECT TOP 5语句只检索前五行数据
      在oracle需要基于ROWNUM(行计数器)来计算运行
      例:
        SELECT prod_name
        FROM Prodects
        WHERE ROWNUM <=5;
      在mysql中需要使用LIMIT子句
      例: SELECT prod_name
        FROM Products
        LIMIT 5;
      limit 5返回不超过五行的数据
      为了的倒后面的5行数据,需要指定从哪开始以及检索的行数
      例:
        SELECT pro_name
        FROM Products
        LIMIT 5 OFFSET 5;
      第一个5字表示返回5行,第二个5表示从第6行开始(包括第六行)

      ###经常用到在数据库中查询中间几条数据的需求

      比如下面的sql语句:

        ① selete * from testtable limit 2,1;

        ② selete * from testtable limit 2 offset 1;

      注意:

      1.数据库数据计算是从0开始的

      2.offset X是跳过X个数据,limit Y是选取Y个数据

      3.limit X,Y 中X表示跳过X个数据,读取Y个数据

      这两个都是能完成需要,但是他们之间是有区别的:

      ①是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过

      ②是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。

      offset就代表偏移量的意思 offset num 代表从 num+1开始查询

      并非所有的sql实现都一样

    2.7使用注释

      注释使用--(两个连字符)嵌在行内。--之后的文本就是注释,这种比较常用
      还有一种注释#,在一行的开始处使用#,这一整行都将作为注释。
      /*开始,到*/结束

    3、排序检索数据

      ORDER BY(按.....顺序)

    3.1排序数据

      关系数据库设计理论认为,如果不明确规定顺序排序,则不应该假定检索出的
      数据的顺序有任何意义
      提示
      ORDER BY子句的位置
      在指定一条ORDER BY子句时,应保证它是SELECT语句中最后一条子句。
      通常ORDER BY子句中使用的列将是为显示二选择的列。但是,用非检索的列排序数据是完全合法的。

    3.2按照多个列排序

      例:

        SELECT prod_id,prod_price,prod_name FRMO Products
        ORDER BY prod_price,prodname;
      对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按照prod_name进行排序、如果
      prod_price列中所有的值都是唯一的,则不会按prod_name排序。

    3.3按列位置排序

      例:
        SELECT prod_id,prod_price,prod_name
        FROM Products
        ORDER BY 2,3;
      提示:当根据不出现在SELECT清单中的列记性排序时,不能采用这项技术

    3.4指定排序方向(DESC)   

      数据的排序不限于升序排列(从A到Z)这知识默认的排序
      使用ORDER BY 子句+DESC可降序排列
        SELECT prod_id,prod_price,prod_name
        FRMO Products
        ORDER BY prod_price DESC;

      若是打算用多个列进行排序
        SELECT prod_id,prod_price,prod_name
        FROM Products
        ORDER BY prod_price DESC,prod_name;
      提示:
      DESC关键字只应用到直接位于其前面的列名。
      如果想在多个列上进行降序排序,必须对每一列指定DESC关键字
      DESC=descending降序,ASC=ascending升序(此为DBMS默认的)
      在字典(disctionary)排序顺序中,A被视为与a相同,这是大多数DBMS的默认行为

    4、过滤数据(WHERE)

    4.1使用WHERE子句

      WHERE子句在表名(FROM子句)之后给出
      在同时使用ORDER BY和WHERE子句时,让ORDER BY位于WHERE之后
      例子:
        SELECT prod_id,prod_price,prod_name
        FROM Products
        WHERE 3<prod_price AND prod_price<10
        ORDER BY prod_price DESC,prod_name;

    4.2 WHERE子句操作符号

      操作符    说明
      =      等于
      <>      不等于
      <      小于
      <=      小于等于
      !<      不小于
      >      大于
      >=      大于等于
      !=      不大于
      BETWEEN 在指定的两个指之间
      IS NULL 为NULL值

    4.2.1检查单个值

      例:
        SELECT prod_name,prod_price
        FROM Products
        WHERE pro_price<10;

    4.2.2 不匹配检查

        SELECT prod_id,prod_price,prod_name,vend_id
        FROM Products
        WHERE vend_id <> 'DLL01';
      检索出所有供应商不是DLL01制造的商品
      提示:如果将值与字符串类型的列进行比较,就需要限定引号。
          用来与数值比较不用引号

    4.2.3 范围值检查

      BETWEEN
      例:
        SELECT prod_id,prod_name,prod_price
        FROM Prudcts
        WHERE prod_price BETWEEN 3 AND 9;
      在使用BETWEEN时,必须制定两个值————所需范围的低端值和高端值。
      这两个值必须用AND关键字分隔

    4.2.4 空值检查

      在创建表时,表的列可指定其中的列能否不包含值,在一个列不包含值时
      称其包含空值NULL
      NULL:
      无值(no value),它与字段包含0,空字符串货仅仅包含空格不同

      例:
        SELECT prod_name
        FROM Products
        WHERE prod_prcie IS NULL;
      提示:各个DBMS特有的操作符
      注意:NULL和非匹配
      过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回数据中

      SQL语句中AND时且的意思,OR是或者即满足一个即为真

    5、高级过滤方式

      WHERE子句的高级过滤方式和NOT和IN的

    5.1 组合WHERE子句

      SQL允许给出多个WHERE子句,这个子句有两种使用方式即AMD和
      OR子句使用方式。
      操作符号(operator)
      用来联结或改变WHERE子句中的子句的关键字,也称为逻辑操作符
      (logical operator)

    5.1.1 AND操作符

      用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行(
      即同时满足多行),可以增加多个
      过滤条件,每个条件间都要使用AND关键字
      例:
        SELECT prod_id,prod_name,prod_price
        FROM Products
        WHERE vend_id='DLL01' AND prod_price <= 4
        ORDER BY prod_price DESC;

    5.1.2 OR 操作符

      用在WHERE子句中的关键字,与AND相反,许多DBMS在第一个条件满足时
      不管第二个条件是否满足,相应的行都会被检索出来。
      例:
        SELECT prod_id,prod_name,prod_price,vend_id
        FROM Products
        WHERE vend_id='DLL01' OR prod_price BETWEEN 1 AND 4
        ORDER BY prod_price DESC , prod_name;

    5.1.3 求值顺序

      例:假如需要列出价格为10及以上,且由DLL01或
      BRS01制造的所有产品。
        SELECT prod_name, prod_price
        FROM Products
        WHERE vend_id = 'DLL01' OR vend_id = 'BRSO1' AND prod_price >= 10
        ORDER BY prod_price DESC ,prod_name;
      ++输出结果为:
        prod_name    prod_price
        -------------------------------------------------
        Bird bean bag toy   3.49
        Fish bean bag toy    3.49
        Rabbit bean bag toy   3.49
        Raggedy Ann       4.99
        18 inch teddy bear 1  1.99

      上面的结果,返回的行中有4行价格小于10,显然,返回的行
      未按照预期的进行过滤,由于AND在求值过程中优先级更高,操作符被
      符被错误的组合了

      此问题解决方法是使用圆括号对操作符进行明确分组
        SELECT prod_name,prod_price
        FROM Products
        WHERE vend_id='DLL01' OR vend_id ='BRS01' AND prod_price >= 10
        ORDER BY prod_price DESC , prod_name;
      输出结果为:
        prod_name prod_price
        ----------------------------------------------------
        18 inch teddy bear 11.99

      提示:
      任何时候使用具有AND和OR操作符的WHERE子句,
      都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序。
      使用圆括号也没什么坏处,它能消除歧义。

    5.2 IN操作符

      IN操作符指定条件范围,范围或者能够的每个条件都可以进行匹配。IN取一组由逗号分隔,
      括在圆括号中的合法值。

      例:SELECT prod_id,prod_name,prod_price,vend_id
        FROM Products
        WHERE prod_price IN ('DLL01','BRS01')
        ORDER BY prod_name DESC;

    5.3 not操作符

      有且只有一个功能,WHERE 子句中用来否定其后条件的关键字

      列:SELECT prod_name
        FROM Products
        WHERE NOT vend_id ='DLL01'
        ORDER BY prod_name;
      匹配非DLL01之外的所有东西
      这个例子也可以使用操作符号<>来完成
      给:
        SELECT prod_name
        FROM Prodcuts
        WHERE vend_id <> 'DLL01'
        ORDER BY prod_name

    6、 用通配符进行过滤

    6.1 LIEK 操作符

      通配符(wildcard)
      用来匹配值的一部分字符

      搜索模式(search pattern)
      由字面值、通配符或两者的组合构成的搜索条件

      谓词(predicate)
      操作符何时不是操作符?当她作为谓词时。从技术上说LIKE
      是谓词而不是操作符。虽然最终的结果是相同的,但应该对此术语有所了解

      注意:通配符搜索只能用于文本字段(字符串),非文本数据类型
      字段不能使用通配符搜索

    6.1.1 百分号(%)通配符

      最常使用的通配符是百分号(%),%百分号表示任何字符出现的次数
      例子:
        SELECT prod_id,prod_name
        FROM Products
      WHERE prod_name LIKE 'Fish%'
      执行这条语句时将检索任意以Fish起头
      的词。
      注意NULL:
      通配符%看起来像是可以匹配任何东西,但有个例外
      就是NULL子句 WHERE prod_name LIKE '%' 不会匹配产品
      名称为NULL的行

    6.1.2 下划线(_)通配符

      下划线的用途与%一样,但它只匹配单个字符,而不是多个字符
      即加几个下划线匹配几个字符
      例子:
        SELECT * FROM Products
        WHERE prod_name LIKE '__ inch tedy bear'

    6.1.3 方括号([])通配符

      方括号([])通配符用来指定一个字符集
      她必须匹配指定位置(通配符的位置)的一个字符

      说明:并不总是支持集合
      并不是所有的DBMS都支持用来创建集合的[]
      。只有微软的Access和SQL Sever支持集合。
      例子:找出所有名字以J或M起头的联系人!
        SELECT cust_contact
        FROM Customers
        WHERE cust_contact LIKE '[JM]%'
        ORDER BY cust_contact;
      输出:
        cust_contact
        --------------
        Jim Jones
        John Smith
        Michelle Green

      [JM]匹配括号中任意一个字符,它也只能匹配单个字符
      [JM]之后的%通配符匹配第一个字符之后的任意数目的字符,返回所需的结果

      此通配符可以用前缀字符^(脱字号)来否定。
      列子:
      查询匹配J和M之外的任意字符起头的任意联系人名
        SELECT cust_contact
        FROM Customers
        WHERE cust_contact LIKE '[^JM]%'
        ORDER BY cust_custact;

      说明:Access中的否定集合
      需要用!而不是^

      注:当然也可以使用NOT操作符得出类似的结果。
      ^的唯一优点是在使用多个WHERE 子句时可以简化语法
      例子:
        SELECT cust_contact
        FROM Customers
        WHERE NOT cust_contact LIKE '[JM]'
        ORDER BY cust_contact;

    6.2 使用通配符的技巧

      不要过度使用通配符。如果其他操作符能达到相同的目的
      应该使用其他操作符

      确实需要使用通配符时,也尽量不要把他们用在搜索模式的开始处
      把通配符置于开始处,搜索起来是最慢的

      仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据!

    7. 创建计算字段

    7.1 计算字段

      存储在数据库表中的数据一般不是应用程序所需要的格式

      字段(field)
      基本上与列(column)的意思相同,经常互换使用
      不过数据库列一般称为列,而术语字段通常与计算字段一起使用

      从客户端(如应用程序)来看,计算字段的数据与其他列的数据返回方式相同

      提示:客户端与服务器的格式
      在SQL语句内可完成的许多的转换和格式化工作可都可以
      直接在客户端内完成。但一般来说,在数据库服务器上完成操作
      要比在客户端快的多

    7.2 拼接字段

      拼接(concatenate
      将值联结到一起(将一个值附加到另一个值)构成单个值

      题设:创建由两列组成的标题
        Vendors 表包含供应商名和地址信息、假如要生成一个供应商报表
        需要在格式化的名称(位置)中列出供应商的位置
        此报表需要一个值,而表中的数据存储在两个列:vend_name
        和vend_country中。此外,需要用括号将vend_country括起来,

        在SQL中的SELECT语句中,可使用一个特殊的操作符来拼接两个列。
        根据你所使用的DBMS,此操作符可用加号(+)或者两个竖杠(||)表示

      说明:+与||
        Access和SQL Sever使用+号。DB2,ORCALE,PostgreSQL,SQLite和Open Office Base使用||
      列子:
        SELECT vend_name+_'('+vend_country+')'
        FROM Vendors
        ORDER BY vend_name;
      输出:
        (无列名)
      ---------------------------------------
        Bear Enporium (USA )
        Bears R Us (USA )
        Doll House Inc (USA )
        Fun and Games (England )
        Fuball Inc (USA )
        Jouets et ours (France )

        下面是相同的语句,但使用的是||语法
        SELECT vend_name ||'('|| vend_country ||')'
        FROM Vendors
        ORDER BY vend_name;
        输出如上~

      下面是使用
      MY SQL或MariaDB时需要使用的语句:
        SELECT Concat(vend_name,'(',vend_country,')')
        FROM Vendors
        ORDER BY vend_name;

      从上述输出中可以看到,SELECT 语句返回包含上述
      四个元素的一个列(计算字段)。
      在看看上述SELECT 语句返回的输出。结合成一个计算字段的两个列用空格填充,
      许多数据库(不是所有)保存填充为列宽的文本值,而实际上
      你要的结果不需要这些空格。所以为正确返回格式化数据
      ,必须去掉这些空格。这可以使用
      SQL的RTRIM()函数来完成
      例子:
        SELECT RTRIM(vend_name)+'('+RTRIM(vend_country)+')'
        FROM Vendors
        ORDER BY vend_name;
      输出:
        ---------------------------------
        Bear Emporium (USA)
        Bears R Us (USA)
        Doll House Inc. (USA)
        Fun and Games (England)
        Furball Inc. (USA)
        Jouets et ours (France)

      RTRIM()函数去掉值右边的所有空格。各个列都进行了整理

      说明:TRIM函数
      大多数DBMS都支持RTRIM()去掉字符右边的空格
        LTRIM() 去掉字符左边的空格
        TRIM() 去掉字符串左右两边的空格

      使用别名(alias):
      原因:SELECT语句可以很好地拼接地址字段。但是这个新计算列的名字实际上是没有的
      它只是一个值。r如果仅在SQL查询工具中查看一下结果,这样没什么不好。
      但是一个未命名的列不能用于客户端应用中,因为客户端没有办法引用它
      且使用别名可以让SQL语句更简短。

      SQL支持别名,是一个字段或值的替换名。用关键字AS赋予
      例子:
        SELECT RTRIM(vend_name)+'('+RTRIM(vend_country)')'
        AS vend_title
        FROM Vendors
        ORDER BY vend_name;

      输出:
        vend_title
        --------------------
        Bear Emporium (USA)
        Bears R Us (USA)
        Doll House Inc. (USA)
        Fun and Games (England)
        Furball Inc. (USA)
        Jouets et ours (France)

      下面是相同的语句,但是使用的是||语法;
        SELECT RTRIM(vend_name) || '('||RTRIM(vend_country)||')'
        AS vend_title
        FROM Vendors
        ORDER BY vend_name;

      下面是MySQL合MariaDB中使用的语句
        SELECT Concat(vend_name,'(',vend_country,')')
        AS vend_title
        FROM Vendors
        ORDER BY vend_name;

      使用别名可以让SQL语句更简短
      例子:表的别名实例
      下面的 SQL 语句选取 "菜鸟教程" 的所访问记录。我们使用 "Websites" 和 "access_log" 表,
      并分别为它们指定表别名 "w" 和 "a"(通过使用别名让 SQL 更简短):

      实例
        SELECT w.name, w.url, a.count, a.date
        FROM Websites AS w, access_log AS a
        WHERE a.site_id=w.id and w.name="菜鸟教程";

      说明:AS通常可选
      提示:别名的其他用途
      别名还有其他用途。常见的用途包括
      在实际的表列名包含不合法的字符(如空格)时
      重新命名它,在原来的名字含混或容易误解时扩充它。
      别名有时也称为导出列(derived volumn)是相同的东西

    7.3 执行算术计算

      计算字段的另一常见用途是对检索出的数据进行算术计算。
      例子:
        SELECT prod_id,
        quantity,
        item_price
        ,quantity*item_price AS expanded_price
        FROM OrderItems
        WHERE order_num=20008;
      输出如下:
        prod_id quantity item_price expanded_price
        ---------- ----------- ------------ -----------------
        RGAN01 5 4.9900 24.9500
        BR03 5 11.9900 59.9500
        BNBG01 10 3.4900 34.9000
        BNBG02 10 3.4900 34.9000
        BNBG03 10 3.4900 34.9000

      基本算术操作符如下:圆括号可以用来区分优先顺序
      操作符   说明
      +       加
      -        减
      *        乘
      /        除

      提示:如何测试计算
        SELECT语句为测试、检验函数和计算提供了很好的方法·。虽然
        SELECT通常用于从表中检索数据,但是省略了FROM子句后就是简单地
        访问和处理表达式。

  • 相关阅读:
    剑指offer系列40:构建乘积数组
    自学网站
    存储分析--- 转载
    程序员面试宝典第四版
    资源查找
    诗句
    fifo manage
    charlse抓包
    python基础之-----列表list工厂的仓库
    python内置函数积累
  • 原文地址:https://www.cnblogs.com/huaweiming/p/9291882.html
Copyright © 2011-2022 走看看