数据库
首页 > 数据库> > SQL必知必会

SQL必知必会

作者:互联网

声明:全文来源《mysql SQL必知必会(第3版)》

第一章 了解SQL

1.1 数据库基础

  数据库(database)保存有组织的数据的容器

  表(table)某种特定类型数据的结构化清单。数据库中的每个表都有一个用来标识自己的名字。此名字是唯一的。

  模式(schema)关于数据库和表的布局及特性的信息。

  列(column)表中的一个字段。所有表都是由一个或多个列组成的。

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

  行(row)表中的一个记录。

  主键(primary key)一列,其值能够唯一标识表中每一行。

  结构化查询语言(SQL)Structured Query Language

第二章 创建和操纵表

  班级信息ClassInfo

班级编号

班主任编号

学生编号

年级

ClassID

TeacherID

StudentID

Grade

  学生信息StudentInfo

学生编号

性别

年龄

身份证

学生姓名

StudentID

Gender

Age

CardID

StudentName

  学生成绩StudentAchieve

学生编号

语文

数学

英语

年份

班级编号

StudentID

Chinese

Math

English

TestYear

ClassID

2.1 创建表

  为利用CREATE TABLE创建表,必须给出下列信息:

CREATE TABLE ClassInfo
(
    ClassID  CHAR(20) NOT NULL, --班级编号
    TeacherID CHAR(20) NOT NULL, --班主任编号
    StudentID CHAR(20) NOT NULL, --学生编号
    Grade CHAR(15) NOT NULL --年级
)
CREATE TABLE StudentInfo
(
    StudentID CHAR(20) NOT NULL, --学生编号
    StudentName CHAR(50) NOT NULL, --学生姓名
    Gender CHAR(5) NOT NULL, --性别
    Age INT NOT NULL DEFAULT 0, --年龄
    CardID VARCHAR(50) NULL DEFAULT '' --身份证
)
CREATE TABLE StudentAchieve
(
    StudentID CHAR(20) NOT NULL, --学生编号
    ClassID  CHAR(20) NOT NULL, --班级编号
    Chinese DECIMAL(10,5) NOT NULL DEFAULT 0, --语文
    Math DECIMAL(10,5) NOT NULL DEFAULT 0, --数学
    English DECIMAL(10,5) NOT NULL DEFAULT 0 --英语
)

2.2 更新表

  为更新表定义,可使用ALTER TABLE语句。

  为了使用ALTER TABLE更改表结构,必须给出下面的信息:

ALTER TABLE dbo.StudentAchieve ADD TestYear CHAR(20) NOT NULL --考试年份

添加考试年份的列

ALTER TABLE dbo.StudentAchieve DROP COLUMN TestYear

删除考试年份的列

2.3 删除表

DROP TABLE dbo.StudentAchieve

  删除学生成绩这张表。删除表没有确认,也不能撤销,执行这条语句将永久删除该表。

  注:可使用关系规则防止意外删除

第三章 检索数据

3.1 检索单个列

SELECT StudentName FROM dbo.StudentInfo

  

3.2 检索多个列

SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo 

  

3.3 检索所有列

SELECT * FROM dbo.StudentInfo

  

第四章 排序检索数据

4.1 排序数据

SELECT StudentName FROM dbo.StudentInfo  ORDER BY StudentName

  Order by子句的位置:应保证它是slect语句中最后一条子句。

4.2 按多个列排序

SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo ORDER BY StudentName,StudentID 

  

4.3 按列位置排序

SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo ORDER BY 1,3 

  

4.4 指定排序方向

SELECT StudentID,Gender,StudentName FROM dbo.StudentInfo ORDER BY Gender DESC 

  

  DESC降序排列,DESCENDING

  ASC升序排列,默认

第五章 过滤数据

5.1 使用WHERE子句

SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Age=5 

  

5.2 where子句操作符

操作符

说明

=

等于

<> 

不等于

!=

不等于

小于

<=

小于等于

!<

不小于

大于

>=

大于等于

!>

不大于

BETWEEN

再指定的两个值之间

IS NULL

为NULL值

5.2.1 检查单个值

SELECT StudentID,ClassID FROM dbo.StudentAchieve WHERE Chinese<95 

  

5.2.2 不匹配检查

SELECT * FROM dbo.StudentInfo WHERE CardID <>'' 

  

5.2.3 范围值检查

SELECT StudentID,Math FROM dbo.StudentAchieve WHERE Math BETWEEN 90 AND 100

  

5.2.4 空值检查

SELECT StudentName,StudentID FROM dbo.StudentInfo WHERE CardID IS NULL

  

第六章 高级数据过滤

6.1 组合WHERE子句

6.1.1 AND操作符

SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Gender='女' AND Age=6

  

6.1.2 OR操作符

SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Gender='女' OR Age=6

  

6.2 IN 操作符

SELECT StudentID,StudentName FROM dbo.StudentInfo WHERE Age IN (5,6)

  

6.2 NOT操作符

SELECT StudentID,StudentName,Gender FROM dbo.StudentInfo WHERE NOT Gender='女'

  

第七章 用通配符进行过滤

7.1 LIKE操作符

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

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

7.1.1 百分号(%)通配符

SELECT StudentID,StudentName,CardID FROM dbo.StudentInfo WHERE CardID LIKE 'card%'

     

  检索任意以card起头的词。

  %告诉DBMS接受card之后的任意字符,不管他有多少字符。

SELECT StudentID,StudentName,CardID FROM dbo.StudentInfo WHERE CardID LIKE '%01%'

  

  %可以匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。

7.1.2 下划线(_)通配符

  下划线的用途与%一样,但下划线只匹配一个字符而不是多个字符。

SELECT StudentID,StudentName,CardID FROM dbo.StudentInfo WHERE StudentName LIKE '名_2'

   

7.1.3 方括号([])通配符

  方括号通配符用来指定一个字符集,它必须匹配指定位置得一个字符。

SELECT * FROM dbo.StudentInfo WHERE CardID LIKE 'card000[23]%'

   

  找出以card0002或card0003开头得cardid

  此通配符可以用前缀字符^(脱子号)来否定。

SELECT * FROM dbo.StudentInfo WHERE CardID LIKE 'card000[^23]%'

   

7.2 使用通配符得技巧

第八章 创建计算字段

8.1 计算字段

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

8.2 拼接字段

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

SELECT StudentID+'name: '+StudentName  FROM dbo.StudentInfo

   

SELECT RTRIM(StudentID)+'name: '+RTRIM(StudentName)  FROM dbo.StudentInfo

   RTRIM()函数去掉右边的所有空格。 

SELECT RTRIM(StudentID)+'name: '+RTRIM(StudentName) info FROM dbo.StudentInfo

  使用别名

8.3 执行算术计算

SELECT StudentID,Chinese+Math+English AS total FROM dbo.StudentAchieve

   

第九章 使用数据处理函数

9.1 函数

  可移植(portable)所编写的代码可以在多个系统上运行。

9.2 使用函数

9.2.1 文本处理函数

SELECT StudentID,UPPER(CardID) cardinfo FROM dbo.StudentInfo

  UPPER()将文本转换为大写

  常用的文本处理函数

函数

说明

LEFT()

返回串左边的字符

LENGTH()

返回串的长度

LOWER()

将串转换为小写

LTRIM()

去掉串左边的空格

RIGHT()

返回串右边的字符

RTRIM()

去掉串右边的空格

SOUNDEX()

返回串的SOUNDEX值

UPPER()

将串转换为大写

  SOUNDEX()函数是一个将任何文本串转换为描述其语音表达的字母数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。

9.2.2 日期和时间处理函数

  日期和时间采用相应的数据类型存储在表中,每种DBMS都有自己的变体。日期和时间值以特殊的格式存储,以便能快速和有效地排序或过滤,并且节约物理存储空间。

9.2.3 数值处理函数

函数

说明

ABS()

绝对值

COS()

余弦

EXP()

指数

PI()

圆周率

SIN()

正弦

SQRT()

平方根

TAN()

正切

第十章 汇总数据

10.1 聚集函数

  聚集函数(aggregate function)运行在行组上,计算和返回单个值的函数。

函数

说明

AVG()

平均值

COUNT()

行数

MAX()

最大值

MIN()

最小值

SUM()

10.1.1 AVG()函数

SELECT AVG(Chinese) AS avg_chinese FROM dbo.StudentAchieve

   

SELECT  AVG(Chinese) AS avg_chinese_11 FROM dbo.StudentAchieve WHERE ClassID='c00011'

   

  AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。只能用于单个列。

  AVG()函数忽略值为NULL的行。

10.1.2 COUNT()函数

  COUNT()函数又两种使用方式

SELECT COUNT(*) AS num FROM dbo.StudentInfo

   

SELECT COUNT(StudentID) AS num FROM dbo.StudentInfo

   

10.1.3 MAX()函数

SELECT MAX(Math) AS max_math FROM dbo.StudentAchieve

 

10.1.4 MIN()函数

SELECT MIN(Math) AS min_math FROM dbo.StudentAchieve

   

10.1.5 SUM()函数

SELECT sum(Math) AS sum_math FROM dbo.StudentAchieve

   

SELECT sum(Math+Chinese) AS total FROM dbo.StudentAchieve

   

10.2 聚集不同值

  以上5个聚集函数都可以如下使用:

SELECT AVG(distinct Math) AS math_avg FROM dbo.StudentAchieve

   

10.3 组合聚集函数

SELECT COUNT(*) as num_count,MIN(Math) AS min_math,MAX(Math) AS max_math FROM dbo.StudentAchieve

   

第十一章 分组数据

11.1 数据分组

SELECT COUNT(*) AS math_95 FROM dbo.StudentAchieve WHERE Math>95

   

11.2 创建分组

SELECT StudentID,COUNT(*) AS column1 FROM dbo.StudentAchieve GROUP BY StudentID

   

在具体使用GROUP BY子句前,需要知道一些重要的规定:

11.3 过滤分组

SELECT StudentID,COUNT(*) AS column1 FROM dbo.StudentAchieve GROUP BY StudentID HAVING COUNT(*)=2

   

11.4 分组和排序

  ORDER BY与GROUP BY

ORDER BY

GROUP BY

排序产生的输出

任意列都可以使用(甚至非选择的列也可以使用) 

不一定需要

分组行。但输出可能不是分组的顺序

只可能使用选择列或表达式列,而且必须使用每个选择列表达式

如果与聚集函数一起使用列(或表达式),则必须使用

11.5 SELECT子句顺序

子句

说明

是否必须使用

SELECT

要返回的列或表达式

FROM

从中检索数据的表

仅在从表选择数据时使用

WHERE

行级过滤

GROUP BY

分组说明

仅在按组计算聚集时使用

HAVING

组级说明

ORDER BY

输出排序顺序

第十二章 使用子查询

12.1 子查询

  查询(query)任何SQL语句都是查询。

  SQL还允许创建子查询(subquery),即:嵌套在其他查询中的查询。

12.2 利用子查询进行过滤

SELECT StudentName FROM dbo.StudentInfo WHERE StudentID IN ( SELECT StudentID FROM dbo.StudentAchieve WHERE Math > 95 );

   

12.3 作为计算字段使用子查询

SELECT StudentID,(  SELECT COUNT(*)FROM dbo.StudentAchieve WHERE StudentID = StudentID) AS column1 FROM dbo.StudentInfo;

   

第十三章 联结表

13.1 联结

  可伸缩性(scale)能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好、

13.2 创建联结

SELECT StudentName,Math, Chinese FROM dbo.StudentInfo,dbo.StudentAchieve WHERE StudentAchieve.StudentID = StudentInfo.StudentID;

   

13.2.1 WHERE子句的重要性

  笛卡儿积(cartesian product)由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

SELECT StudentName,Math,Chinese FROM dbo.StudentInfo,dbo.StudentAchieve

   

13.2.2 内部联结

SELECT StudentName, Math,Chinese FROM dbo.StudentInfo INNER join dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID

   

13.2.3 联结多个表

SELECT StudentName,Math,Chinese, Grade FROM dbo.StudentInfo,dbo.StudentAchieve, dbo.ClassInfo
WHERE StudentInfo.StudentID = StudentAchieve.StudentID  AND ClassInfo.StudentID = StudentAchieve.StudentID  AND Math > 90;

   

第十四章 创建高级联结

14.1 使用表别名

SELECT StudentName,Math, Chinese,Grade FROM dbo.StudentInfo AS a, dbo.StudentAchieve AS b, dbo.ClassInfo AS c
WHERE a.StudentID = b.StudentID  AND c.StudentID = a.StudentID  AND Math > 90;

   

14.2 使用不同类型的联结

14.2.1 自联结

SELECT StudentID,StudentName,Gender FROM dbo.StudentInfo WHERE Gender =( SELECT Gender FROM dbo.StudentInfo WHERE StudentID = 's00001')

   

SELECT a.StudentID,a.StudentName,a.Gender FROM dbo.StudentInfo AS a,dbo.StudentInfo AS b WHERE a.Gender = b.Gender  AND b.StudentID = 's00001';

   

14.2.2 自然联结

SELECT StudentName,Math, Chinese,Grade FROM dbo.StudentInfo AS a, dbo.StudentAchieve AS b, dbo.ClassInfo AS c WHERE a.StudentID = b.StudentID  AND c.StudentID = a.StudentID AND Math > 90;

   

14.2.3 外部联结

SELECT StudentName,Gender,Math,Chinese FROM dbo.StudentInfo  LEFT JOIN dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID;

   

SELECT StudentName,Gender,Math,Chinese FROM dbo.StudentInfo RIGHT JOIN dbo.StudentAchieve ON StudentAchieve.StudentID = StudentInfo.StudentID;

      

14.3 使用带聚集函数的联结

SELECT Grade,COUNT(Age) AS age_count,Age FROM dbo.StudentInfo INNER JOIN dbo.ClassInfo ON ClassInfo.StudentID = StudentInfo.StudentID GROUP BY ClassInfo.Grade,Age

   

14.4 使用联结和联结条件

第十五章 组合查询

15.1 组合查询

  SQL允许执行多个查询,并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。

15.2 创建组合查询

15.2.1 使用UNION

SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5
UNION
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Gender='男'

   

SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5 OR Gender='男'

   

15.2.2 UNION规则

15.2.3 包含或取消重复的行

SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5
UNION ALL
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Gender='男'

   

15.2.4 对组合查询结果排序

SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Age=5
UNION
SELECT StudentID,StudentName,Age,Gender FROM dbo.StudentInfo WHERE Gender='男'
ORDER BY Gender

   

第十六章 插入数据

16.1 数据插入

16.1.1 插入完整的行

INSERT INTO dbo.StudentInfo
VALUES( 's00010','新的名字', '男',7,'cardcard' )

   

更标准的写法:

INSERT INTO dbo.StudentInfo(StudentID,StudentName,Gender,Age,CardID)
VALUES('s00010','新的名字','男',7,'cardcard')

16.1.2 插入部分行

INSERT INTO dbo.StudentInfo( StudentID,StudentName,Gender, Age)
VALUES( 's00014','新的名字2', '女',7)

16.1.3 插入检索出的数据

INSERT INTO dbo.StudentInfo(StudentID,StudentName,Gender,Age)
VALUES('s00014','新的名字2', '女',7)

16.2 从一个表复制到另一个表

SELECT * INTO #tmp1 FROM dbo.StudentInfo

第十七章 更新和删除数据

17.1 更新数据

UPDATE dbo.StudentInfo SET CardID='cardnew' WHERE StudentID='s00002' AND Age=7

17.2 删除数据

DELETE FROM dbo.StudentInfo WHERE StudentID='s00002' AND Age=7

第十八章 使用视图

18.1 视图

  视图不包含任何列或数据,它包含的是一个查询。

18.1.1 为什么使用视图

18.1.2 视图的规则和限制

18.2 创建视图

18.2.1 利用视图简化复杂的联结

CREATE VIEW student_view
AS
SELECT StudentName,Gender,Math,Chinese FROM dbo.StudentInfo LEFT JOIN dbo.StudentAchieve  ON StudentAchieve.StudentID = StudentInfo.StudentID;

18.2.2 用视图重新格式化检索出的数据

CREATE VIEW student_view
AS
SELECT RTRIM(StudentID)+'('+RTRIM(StudentName)+')' AS stuinfo FROM dbo.StudentInfo
SELECT * FROM student_view

   

第十九章 使用存储过程

19.1 存储过程

  存储过程简单来说,就是为了以后的使用而保存的一条或多条SQL语句的集合。可将其视为批文件。

19.2 为什么要使用存储过程

  简单、安全、高性能。

19.3 执行存储过程

  EXECUTE

  EXECUTE后面跟着存储过程和需要传递给它的任何参数。

19.4 创建存储过程

CREATE PROCEDURE test
AS
DECLARE @n INTEGER
SELECT @n=COUNT(*) FROM dbo.StudentInfo WHERE CardID IS NOT NULL
RETURN @n

第二十章 管理事务处理

20.1 事务处理

  事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的SQL操作要么完全执行,要么完全不执行。

20.2 控制事务处理

BEGIN TRANSACTION operation
--****
COMMIT TRANSACTION operation

20.2.1 使用ROLLBACK

ROLLBACK operation

20.2.2 使用保留点

SAVE TRANSACTION operation

第二十一章 使用游标

21.1 游标

  结果集(result set)SQL查询所检索出的结果。

  游标(cursor)是一个存储在DBMS服务器上的数据库查询,它不是一条SELECT语句,二十被该语句检索出来的结果集。

21.2 使用游标

21.2.1 创建游标

DECLARE testcursor CURSOR
FOR
SELECT StudentID FROM dbo.StudentInfo

21.2.2 使用游标

DECLARE @n [char] (20)
DECLARE testcursor CURSOR
FOR
SELECT StudentID FROM dbo.StudentInfo
OPEN testcursor
FETCH NEXT FROM testcursor INTO @n
BEGIN
        --***
        FETCH NEXT FROM testcursor INTO @n
END

21.2.3 关闭游标

CLOSE testcursor

第二十二章 了解高级SQL特性

22.1 约束

  约束(constraint)管理如何插入或梳理数据库数据的规则

22.1.1 主键

  表中任意列只要满足以下条件,都可以用于主键:

22.1.2 外键

  外键是表中的一个列,其值必须再另一个表的主键中列出。

  外键可以帮助防止意外的删除。

22.1.3 唯一约束

  唯一约束用来保证一个列(或一组列)中的数据唯一。

22.1.4 检查约束

  检查约束用来保证一个列(或一组列)中的数据满足一组指定的条件。

  CHECK

22.2 索引

  CREATE INDEX

22.3 触发器

  CREATE TRIGGER

22.4 数据库安全

 

标签:StudentID,dbo,必知,SQL,StudentName,StudentInfo,必会,WHERE,SELECT
来源: https://www.cnblogs.com/Aries-rong/p/16203076.html