1.SQL 介绍
SQL是什么?
- SQL指结构化查询语言,全称是Structured Query Language。
- SQL可以访问和处理数据库,包括数据查询,插入,更新和删除。
- SQL在1986年成为ANSI的一项标准,在1987成为国际化标准组织标准。
SQL能做什么?
- SQL可以从数据库中查询数据,插入数据,更新和删除数据。
- SQL可以创建新数据库,新的表和创建存储过程。
- SQL可以创建视图,并设置表,存储过程,视图的权限等。
注意: 除了SQL标准之外,大部分SQL数据库程序都拥有自己的专属扩展。
2.SQL语法
介绍:
- 一个数据库通常包含一个或多个表,每个表都有表名(标识符)来区分,每个表通常包含数据的记录(行)。
- SQL对大小写不敏感,SELECt和select是一样。但是SQL引擎通常会把语句都转换为大写字符来执行。
- 某些数据库系统要求每条SQL语句的末端使用分号,有些不要求。
3.SQL select 语句
- select 语句用于从数据库中选取数据,结果被存储在一个结果表中。
1)从websites 表中提取name和country字段。
2)从websites 表中提取全部字段。
4.SQL select distinct 语句
- 在表中,一个列可能包含多个重复值,有时我们希望列出不同的值,dintinct关键字返回唯一不同的值。
1)选取websites表中的country字段。
2)选取websites表中的不含重复值的country字段。
5.SQL where 子句
- where 子句用于提取那些满足指定条件的记录。
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值字段,请不要使用引号。
可以的where子句中使用的运算符以下9种:
1)从 “Websites” 表中选取国家为 “CN” 的所有网站:
6.SQL and&or 运算符
- and和or运算符用于基于一个以上的条件对记录进行过滤。
- 如果第一个条件和第二个条件都成立,则 and运算符显示一条记录。
- 如果第一个条件和第二个条件中只要有一个成立,则 or运算符显示一条记录。
1)从 “Websites” 表中选取国家为 “CN” 且alexa排名大于 “50” 的所有网站:
2)从 “Websites” 表中选取 alexa 排名大于 “15” 且国家为 “CN” 或 “USA” 的所有网站:
7.SQL order by 关键字
- order by 主要对结果表进行排序。
- oder by关键字用于对结果集按照一个列或者多个列进行排序。
- oder by关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 dese 关键字。
1)从 “Websites” 表中选取所有网站,并按照 “alexa” 列排序:
2)从 “Websites” 表中选取所有网站,并按照 “country” 和 “alexa” 列排序:
8.SQL insert into 语句
- insert into 语句用于向表中插入新记录。
1)第一种形式需指定要插入数据的列名,只需提供被插入的值即可:
2)第二种形式要指定列名及被插入的值:
演示:
1)向 “Websites” 表中插入一个新行。
9.SQL update 语句
- update语句用于更新表中的记录。
where子句规定哪条记录或者哪些记录需要更新。如果您省略了 where子句,所有的记录都将被更新!
1)我们要把 Websites表中的 "菜鸟教程"的alexa 排名更新为 5000,country 改为 USA。
9.SQL delete 语句
- delete删除表中的记录
where子句规定哪条记录或者哪些记录需要删除。如果您省略了 where 子句,所有的记录都将被删除!
1)从 “Websites” 表中删除网站名为 “Facebook” 且国家为 USA 的网站。
10.SQL group by 语句
- GROUP BY 语句可结合一些聚合函数来使用
- GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
1)统计 access_log 各个 site_id 的访问量:
2)下面的 SQL 语句统计有记录的网站的记录数量:
11.SQL having子句
- 在 SQL 中增加 HAVINg 子句原因是,WHERe 关键字无法与聚合函数一起使用。
- HAVINg 子句可以让我们筛选分组后的各组数据。
1)查找总访问量大于 200 的网站。
2)查找总访问量大于 200 的网站,并且 alexa 排名小于 200。
12.SQL exists 运算符
- EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
1)查找总访问量(count 字段)大于 200 的网站是否存在。
1.SQL select top ,limit ,rownum 子句
- select top子句用于规定要返回的记录的数目。
- select top 子句对于拥有数千条记录的大型表来说,是非常有用的。
**注意:并非所有的数据库系统都支持 select top语句。 MySQL 支持 limit语句来选取指定的条数数据, Oracle 可以使用 rownum来选取。
SQL Server / MS Access 语法
Mysql语法
Oracle 语法
1)从 “Websites” 表中选取头两条记录:
2.SQL like 操作符
- like操作符用于在 where子句中搜索列中的指定模式。
1)从websites表中选取 name 以字母 “G” 开始的所有客户
2)从websites表中选取 name 包含模式 “oo” 的所有客户
3)从websites表中选取 name 不包含模式 “oo” 的所有客户
3.SQL 通配符
-
通配符可用于替代字符串中的任何其他字符。
-
在 sql中,通配符与 sql like 操作符一起使用。
-
sql 通配符用于搜索表中的数据。
-
在 SQL 中,可使用以下通配符:
通配符 描述 % 替代 0 个或多个字符 _ 替代一个字符 [charlist] 字符列中的任何单一字符 [^charlist] 或 [!charlist] 不在字符列中的任何单一字符
1) websites表中选取 url 以字母 “https” 开始的所有网站:
4.SQL in 操作符
- in 操作符允许您在 WHERe 子句中规定多个值。
1)websites表中选取 name 为 “Google” 或 “菜鸟教程” 的所有网站:
5.SQL between 操作符
- between操作符用于选取介于两个值之间的数据范围内的值。
- 这些值可以是数值、文本或者日期。
1)websites表中选取 alexa 介于 1 和 20 之间的所有网站:
2)websites表中选取 alexa 不在介于 1 和 20 之间的所有网站:
6.SQL 别名(as)
- as 可以为表名称或列名称指定别名。
- 基本上,创建别名是为了让列名称的可读性更强。
1)使用 “Websites” 和 “access_log” 表,并分别为它们指定表别名 “w” 和 “a”,选取 “淘宝” 的所有访问记录:
7.SQL join 链接
-
SQL join 用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
-
下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。
不同的sql join:
- INNER JOIN:如果表中有至少一个匹配,则返回行。
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行。
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行。
- FULL JOIN:只要其中一个表中存在匹配,则返回行。
1)inner join
1)返回所有网站的访问记录:
2)sql left join
1)返回所有网站及他们的访问量(如果有的话):
3)sql right join
1)返回网站的访问记录:
4)sql full outer join
8.SQL union 操作符
- union 操作符合并两个或多个 SELECT 语句的结果。
- union内部的每个 select语句必须拥有相同数量的列。
- 列也必须拥有相似的数据类型。
- 同时,每个 select 语句中的列的顺序必须相同。
- union结果集中的列名总是等于 union中第一个select 语句中的列名。
1)从 “Websites” 和 “apps” 表中选取所有不同的country(只有不同的值)
2)从 “Websites” 和 “apps” 表中选取所有的country(也有重复的值)
9.SQL select into 语句
- select into语句从一个表复制数据,然后把数据插入到另一个新表中。
10.SQL insert into select
- insert into select 语句从一个表复制数据,然后把数据插入到一个已存在的表中。
1)复制 “apps” 中的数据插入到 “Websites” 中:
11.SQL create database 语句
- create database 语句用于创建数据库。
12.SQL create table 语句
- create table语句用于创建数据库中的表。
- 表由行和列组成,每个表都必须有个表名。
13.SQL 约束
- SQL 约束用于规定表中的数据规则。
- 如果存在违反约束的数据行为,行为会被约束终止。
- 约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
语法:
在 SQL 中,我们有如下约束:
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。
- DEFAULT - 规定没有给列赋值时的默认值。
1)not null 约束
- NOT NULL 约束强制列不接受 NULL 值。
- NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
1)创建表时添加not null约束:
2)已创建的表添加not null 约束
3)已创建的表中删除not null约束
2)unique 约束
- UNIQUE 约束唯一标识数据库表中的每条记录。
- UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
- PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
- 每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
1)创建表时添加unique约束:
2)已创建的表添加unique约束
3)已创建的表中删除unique约束
3)primary key 约束
- PRIMARY KEY 约束唯一标识数据库表中的每条记录。
- 主键必须包含唯一的值。
- 主键列不能包含 NULL 值。
- 每个表都应该有一个主键,并且每个表只能有一个主键。
1)创建表时添加primary key 约束:
2)已创建的表添加primary key 约束
3)已创建的表中删除primary key 约束
4)foreign key 约束
- 一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。
- FOREIGN KEY 约束用于预防破坏表之间连接的行为。
- FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
“Persons” 表:
“Orders” 表:
- “Orders” 表中的 “P_Id” 列指向 “Persons” 表中的 “P_Id” 列。
- “Persons” 表中的 “P_Id” 列是 “Persons” 表中的 PRIMARY KEY。
- “Orders” 表中的 “P_Id” 列是 “Orders” 表中的 FOREIGN KEY。
1)创建表时添加foreign key 约束:
2)已创建的表添加foreign key 约束
3)已创建的表中删除foreign key 约束
5)check 约束
- CHECK 约束用于限制列中的值的范围。
- 如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
- 如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
1)创建表时添加check 约束:
2)已创建的表添加check 约束
3)已创建的表中删除check 约束
6)default 约束
- DEFAULT 约束用于向列中插入默认值。
- 如果没有规定其他的值,那么会将默认值添加到所有的新记录。
1)创建表时添加default 约束:
2)已创建的表添加default 约束
3)已创建的表中删除default 约束
14.create index 语句
- CREATE INDEX 语句用于在表中创建索引。
- 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
- 可以在表中创建索引,以便更加快速高效地查询数据。
- 用户无法看到索引,它们只能被用来加速搜索/查询。
1)在 “Persons” 表的 “LastName” 列上创建一个名为 “PIndex” 的索引:
2)如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
15.SQL drop
- 通过使用 DROP 语句,可以轻松地删除索引、表和数据库。
16.SQL alter table 语句
- ALTER TABLE 语句用于在已有的表中添加、删除或修改列
17.SQL auto increment 字段
- Auto-increment 会在新记录插入表中时生成一个唯一的数字。
- 通常希望在每次插入新记录时,自动地创建主键字段的值
18.SQL 视图
- 视图是基于 SQL 语句的结果集的可视化的表。
- 视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
- 以向视图添加 SQL 函数、WHERe 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。
1)视图 “Current Product List” 会从 “Products” 表列出所有正在使用的产品(未停产的产品)。
2)更新视图:
3)删除视图
19.SQL null值
- NULL 值代表遗漏的未知数据。
- 默认地,表的列可以存放 NULL 值。
- 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
- NULL 值的处理方式与其他值不同。
- NULL 用作未知的或不适用的值的占位符。
- 无法比较 NULL 和 0;它们是不等价的。
如何测试 NULL 值
- 无法使用比较运算符来测试 NULL 值,比如 =、< 或 <>。
- 必须使用 IS NULL 和 IS NOT NULL 操作符来测试null
1)选取在 “Address” 列中带有 NULL 值的记录:
2)选取在 “Address” 列中不带有 NULL 值的记录
SQL Date 数据类型
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式:YYYY-MM-DD
- DATETIME - 格式:YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
- YEAR - 格式:YYYY 或 YY
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式:YYYY-MM-DD
- DATETIME - 格式:YYYY-MM-DD HH:MM:SS
- SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式:唯一的数字
MySQL Date 函数
下面的表格列出了 MySQL 中最重要的内建日期函数:
SQL Server Date 函数
下面的表格列出了 SQL Server 中最重要的内建日期函数:
1.AVG() - 返回平均值
- AVG() 函数返回数值列的平均值。
1)从 “access_log” 表的 “count” 列获取平均值:
2)选择访问量高于平均访问量的 “site_id” 和 “count”:
2.COUNT() - 返回行数
- COUNT() 函数返回匹配指定条件的行数。
1)计算 “access_log” 表中 “site_id”=3 的总访问量:
2)计算 “access_log” 表中总记录数:
3)计算 “access_log” 表中不同 site_id 的记录数:
3.FIRST() - 返回第一个记录的值
- FIRST() 函数返回指定的列中第一个记录的值。
1)选取 “Websites” 表的 “name” 列中第一个记录的值:
4.LAST() - 返回最后一个记录的值
- LAST() 函数返回指定的列中最后一个记录的值。
1)选取 “Websites” 表的 “name” 列中最后一个记录的值:
5.MAX() - 返回最大值
- MAX() 函数返回指定列的最大值。
1)从 “Websites” 表的 “alexa” 列获取最大值:
6.MIN() - 返回最小值
- MIN() 函数返回指定列的最小值。
1)从 “Websites” 表的 “alexa” 列获取最小值:
7.SUM() - 返回总和
- SUM() 函数返回数值列的总数。
1)查找 “access_log” 表的 “count” 字段的总数:
1.UCASE() - 将某个字段转换为大写
- UCASE() 函数把字段的值转换为大写。
1)从 “Websites” 表中选取 “name” 和 “url” 列,并把 “name” 列的值转换为大写:
2.LCASE() - 将某个字段转换为小写
- LCASE() 函数把字段的值转换为小写。
1)从 “Websites” 表中选取 “name” 和 “url” 列,并把 “name” 列的值转换为小写:
3.MId() - 从某个文本字段提取字符,MySql 中使用
- MId() 函数用于从文本字段中提取字符。
1)从 “Websites” 表的 “name” 列中提取前 2个字符:
4.LEN() - 返回某个文本字段的长度
- LEN() 函数返回文本字段中值的长度。
1)从 “Websites” 表中选取 “name” 和 “url” 列中值的长度:
5.ROUND() - 对某个数值字段进行指定小数位数的四舍五入
- ROUND() 函数用于把数值字段舍入为指定的小数位数。
1)ROUND(X): 返回参数X的四舍五入的一个整数。
2)ROUND(X,D): 返回参数X的四舍五入的有 D 位小数的一个数字。如果D为0,结果将没有小数点或小数部分。
6.NOW() - 返回当前的系统日期和时间
- NOW() 函数返回当前系统的日期和时间。
1)从 “Websites” 表中选取 name,url,及当天日期:
7.FORMAT() - 格式化某个字段的显示方式
- FORMAT() 函数用于对字段的显示进行格式化。
1)从 “Websites” 表中选取 name, url 以及格式化为 YYYY-MM-DD 的日期:
Microsoft Access 数据类型和范围
MySql 数据类型和范围
在 MySQL 中,有三种主要的类型:Text(文本)、Number(数字)和 Date/Time(日期/时间)类型。
Text 类型:
注意: 以上的 size 代表的并不是存储在数据库中的具体的长度,如 int(4) 并不是只能存储4个长度的数字。
实际上int(size)所占多少存储空间并无任何关系。int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。就是在显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。
SQL Server 数据类型和范围
String 类型:
其他数据类型: