SQL语言SQL语言基础01

Posted 花未名

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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子句后就是简单地
    访问和处理表达式。

 





















































































































































































































































































































































































































以上是关于SQL语言SQL语言基础01的主要内容,如果未能解决你的问题,请参考以下文章

关系数据库标准语言SQL01

oracle之基本SQL语句

Oracle-02:SQL语言的分类或者说SQL语言的组成

2-01SQL的概述

SQL语言中按月查询

Oracle_PL/SQL 匿名块