学习sql Part 1

2018/04/14 数据库

学习sql Part 1


1、了解sql

1.1 数据库基础知识

1.1.1 数据库

数据库(database): 以一种有组织的方式存储的数据集合。我们常说的数据库,实际上保存有组织的数据的容器(通常是一个文件或者一组文件)。

数据库软件:实际上是数据库管理系统(DBMS),数据库通过DBMS创建和操作。

1.1.2 表

:某种特定类型数据的结构化清单。存储在同一张表内的数据实际上是同一类型的。

表名:数据库名 + 表名唯一确定一个表。

模式(schema):描述数据库和表的布局及特征的信息。

1.1.3 列和数据类型

表由列组成,列存储表中的某部分的信息。

:表中的一个字段,所有表都有一个或者多个列组成。

数据库中每个列都有相应的数据类型,数据类型定义了列可以存储哪些数据类型。例如如果列中存储的是数字,则相应的数据类型应该是数值类型。日期、文本、注释、金额等,都有相应的数据类型。

数据类型:所允许的数据的类型,每个表列都有相应的数据类型,它限制(或者允许)该列中存储的数据。

数据类型可以帮助正确地分类数据,并在优化磁盘使用方面起到重要的作用。因此,在创建表的时候,要特别关注所用的数据类型。

数据类型及其名称是SQL不兼容的一个主要原因,虽然大多数基本数据类型得到了一致的支持,但许多高级的数据类型却没有。更糟的是,偶尔会有相同的数据类型在不同的DBMS中具有不同的名称。因此我们需要在创建表结构的时候就记住这些差异。

1.1.4 行

表中的数据是按照行来存储的,所保存的每个记录都存储在自己的行内。如果把表想象成网格,网格中垂直的列是表名,水平的行是表行。

:表中的一个记录。有时也称之为record,即记录。

1.1.5 主键

表中每一行都应该有一列或者几列来唯一标示自己。

主键 :一列(或者一组列),其值能够唯一标识表中的每一行。

如果没有主键,更新或者删除表中特定的行就会变得非常困难,因为你不能保证你的操作只会涉及到相应的行。

作为主键的条件:

  • 任意两行都不具有相同的主键值;

  • 每一行都必须有一个主键值(主键列是不允许NULL值的);

  • 主键列的值不允许修改或者更新

  • 主键值不能重用(一般不建议重用,如果某行从表中删除,它的主键是不能赋给以后的新行的)。

当然也可以用多个列的组合来作为主键,但是这些列的组合的值必须是唯一的。

1.2 什么是sql

SQL: Structured Query Language(—结构化查询语言),SQL是一种专门与数据库沟通的语言。

SQL只提供了很少的词,它可以实现从数据库中简单有效地读写数据。

SQL的优点:

  • SQL不是某个特定数据库供应商的专有语言,几乎所有重要的DBMS都支持SQL。

  • 简单易学,关键词少;

  • 看起来很简单,但是实际上是一种强有力的语言,可以实现非常复杂和高级的数据库操作。

SQL的拓展:许多DBMS厂商通过增加语句或者指令,对SQL进行了拓展。这种拓展的目的是提供执行特定操作的额外功能或者简化方法。

标准的SQL由ANSI标准委员会管理,从而成为ANSI SQL,所有主要的DBMS,即使有自己的拓展,也都支持ANSI SQL。各个实现都有自己的名称,如:PL/SQL, Transact-SQL。

学习SQL最好的方法就是自己动手实践,为此需要一个数据库和用来测试SQL语句的应用系统。

2、检索数据

2.1 SELECT语句

关键字:作为SQL组成部分的保留字, 关键字不能作为表或者列的名字。

为了使用SELECT语句,至少需要给出两条信息:想选择什么,以及从什么地方开始选择。

2.2 检索单个列

  SELECT 列名 FROM 表名;

SQL语句以分号结尾,SQL语句不区分大小写,sql语句中的换行会被忽略。

2.3 检索多个列

SELECT 1, 2, ... , n FROM 表名;

不同列之间用半角逗号分隔。

2.4 检索所有列

SELECT * FROM 表名

其中星号 * 称为通配符,可以返回所有列,而列的顺序一般是列在表中出现的物理顺序。

一般不用*,因为我们不一定需要把所有的列都取出来,只需要按需取就行。

2.5 检索不同的值

SELECT DISTINCT 列名 FROM 表名;

只返回列的不同取值,注意DISTINCT关键词必须在列名前面。

DISTINCT 对后面所有的列起作用。

2.6 限制结果

如何让数据库返回某几行的结果。不用数据库使用限制的方法不一样。mysql数据库使用LIMIT关键词。

SELECT 列名 FROM 表名 LIMIT offs, num;

等价:
SELECT 列名 FROM 表名 LIMIT num OFFSET offs;

这样会返回第offs行开始不超过num行的结果。

2.7 使用注释

对sql语句进行标注,或者注释部分语句来进行调试

行内注释

SELECT 列名  --这是sql的行内注释
FROM 表名;

等价:

SELECT 列名  #这是sql的行内注释
FROM 表名;

多行注释

/* SELECT *
FROM TEST*/
SELECT 列名 FROM 表名;

3、排序检索数据

3.1 排序数据

前面的SQL语句返回某个数据库表的某个列,输出结果并没有特定的顺序。

为了明确排序SELECT语句检索出的数据,可以使用ORDER BY子句,它可以取一个或者多个列的名字,据此对输出进行排序。

SELECT 列名 FROM 表名 ORDER BY 列名;

ORDER BY 子句一般是SQL语句的最后一部分。否则会出现报错。

排序原则:数字和字符串都按照升序。

3.2 按照多个列排序

SELECT 列名 FROM 表名 ORDER BY 列名1,列名2;

要注意多个列排序的结果,实际上是先按前面的列排序,然后对于前面列结果相同的,按照后面的列进行排序。

列名之间用逗号分割。

3.3 按照列的位置排序

ORDER BY 子句支持按照相对位置来进行排序。

SELECT 列名1, 列名2 FROM 表名 ORDER BY 位置1,位置2;

如:
SELECT * FROM ORDERS ORDER BY 1,2;

这里的位置就是前面select的列号,从1开始。

后面的位置不能超过前面的列数。

3.4 指定排序方向

SQL排序结果默认是升序的,如果要降序,需要用到DESC关键字。

SELECT 列名 FROM 表名 ORDER BY 列名 DESC;

DESC只应用到直接位于其前面的列名。

4、过滤数据

4.1 使用WHERE语句

只检索需要的数据需要指定搜索条件,搜索条件也称为过滤条件

过滤条件可以使用WHERE语句来实现。

SELECT 列名 FROM 表名 WHERE 列名 = value;

只返回列等于value的数据。

WHERE 语句和 ORDER BY语句一起使用的时候,WHERE语句放在ORDER BY语句前面。

4.2 WHERE子句的操作符

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

4.2.1 检查单个值

可以使用WHERE 列名 = value 等操作,根据需要选择操作符。

4.2.2 不匹配检查

使用!=或者<>

注意value是字符串时,需要使用单引号。

4.2.3 范围值检查

要检查某个范围的值,可以用BETWEEN操作符。其后需要需要连两个值。

SELECT 列名 FROM 表名 WHERE 列名 BETWEEN v1 AND v2;

between指包含v1和v2的二者之间的所有值。

4.2.4 空值检查

NULL 表示不包含值

SELECT 列名 FROM 表名 WHERE 列名 IS NULL;

不能直接返回非NULL的匹配。(需要使用NOT)

5、高级过滤

如何组合WHERE子句以创建功能更强的搜索条件。

5.1 组合WHERE子句

可以使用WHERE子句中的子句关键词来连接,他们称为逻辑操作符。

5.1.1 AND操作符

SELECT 列名 FROM 表名 WHERE 条件1 AND 条件2;

5.1.2 OR操作符

SELECT 列名 FROM 表名 WHERE 条件1 OR 条件2;

5.1.3 括号、AND、OR的组合

通过三者的组合实现复杂的过滤。

5.2 IN操作符

IN操作符用来限定条件范围,范围内的所有条件都可以进行匹配。IN 取一组由逗号分隔、括在圆括号里面的合法值。

SELECT 列名 FROM 表名 WHERE 列名 IN (V1, V2);

IN的功能,可以通过OR实现,但是IN具有更多优点:

  • IN在选项很多的时候,更简洁直观;
  • IN 操作符一般比一组OR操作执行的更快;
  • IN 最大的优点就是可以包含其他的SELECT语句,能够更加动态地简历WHERE子句。

5.3 NOT操作符

WHERE语句中的NOT操作符只有一个功能,即否定其后所跟的任何条件。

SELECT 列名 FROM 表名 WHERE NOT 条件1;

6、用通配符进行过滤

6.1 LIKE通配符

通配符:用来匹配值的一部分的特殊字符

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

为了在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示DBMS,后面的搜索模式利用通配符匹配而不是简单的相等匹配。

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

6.1.1 百分号(%)通配符

%表示任意字符出现任意次数。

例如匹配HAHA:

--HAHA出现在开头
SELECT * FROM T WHERE a like 'HAHA%'
--HAHA出现在任意位置
SELECT * FROM T WHERE a like '%HAHA%'
--HAHA出现在尾部
SELECT * FROM T WHERE a like '%HAHA'

注意%不能匹配NULL

6.1.2 下划线(_)

用法与%类似,只是它每次只匹配一个字符,一个不多一个不少。%可以匹配0到任意个字符。

6.1.3 更复杂的情况

可以使用正则表达式

搜索

    Table of Contents