一.SQL语法
1. SQL功能
数据定义(DDL):用户定义、删除和修改数据模式
数据查询(DQL):用于查询数据
数据操纵(DML):用于增、删、改数据
数据控制(DCL):用于控制数据访问权限
2. 语法
SQL的语法很像自然语言。每个语句都是一个祈使句,以动词开头,表示所要做的动作。
3. 命令
SQL由命令组成,每个命令以分号(;)结束。如下面是3个独立的命令:
SELECT id, name FROM foods;
INSERT INTO foods VALUES (NULL, 'Whataburger');
4. 常量
也称为Literals,表示确切的值,有3种:字符串常量、数据常量和二进制常量。
字符串常量如:'Jerry' 'Newman' 'JujyFruit'
数据常量:数字常量有整数、十进制数和科学记数法表示的数,如:-1 3.142 6.0221415E23
二进制值用如x'0000'的表示法,其中每个数据是一个16进制数。二进制值必须由两个两个的16进制数(8 bits)组成,如:x'01' X'0fff'x'0F0EFF'
5. 保留字和标识符
保留字由SQL保留用做特殊的用途,如SELECT UPDATE、INSERT、CREATE、DROP和BEGIN等。标识符指明数据库里的具体对象,如表或索引。保留字预定义,不能用做标识符。SQL不区分大小写,下面是相同的语句:
SELECT * fromfoo;
select * fromfoo;
二.创建数据库
1. 创建表
在SQL中,创建和删除数据库对象的语句一般被称为数据定义语言(data definition language,DDL),操作这些对象中数据的语句称为数据操作语言(data manipulation language,DML)。创建表的语句属于DDL,用CREATETABLE命令,如下定义:
CREATE [TEMP] TABLE table_name (column_definitions [, constraints]);
CREATE TABLE命令至少需要一个表名和一个字段名。命令中table_name表示表名,必须与其它所有的标识符不同。column_definitions表示一个用逗号分隔的字段列表。每个字段定义包括一个名称、一个域和一个逗号分隔的字段约束表。“域”一般情况下是一个类型,与编程语言中的数据类型同名,指明存储在该列的数据的类型。
在SQLite中有5种本地类型:INTEGER、REAL、TEXT、BLOB和NULL
2.改变表
ALTER TABLE table { RENAME TO name | ADD COLUMNcolumn_def }
3.数据查询语句
v SQL查询语句的基本结构
v 简单查询
v 多表连接查询
v 合并多个结果集
v SELECT INTO
v 使用TOP限制结果集
v 子查询
SELECT <目标列名序列>
FROM <数据源>
[WHERE <检索条件表达式>]
[GROUP BY <分组依据列>]
[HAVING <分组提取条件>]
[ORDER BY <排序依据列>]
SELECT <目标列名序列>(需要哪些列)
FROM <表名序列> (从哪些表)
WHERE <查询条件> (根据什么条件)
(1) 查询指定列
例:查询全体学生的学号与姓名
SELECT Sno,Sname FROM Student
(2) 查询全部列
例:查询全体学生的详细记录
SELECT Sno,Sname,Ssex, Sage, SdeptFROM Student
等价于:SELECT * FROMStudent
(3) 常用的查询条件
例:查询计算机系全体学生
SELECT SnameFROM Student WHERE Sdept=’CS’
例:查询所有年龄在20岁以下的学生姓名及其年龄
SELECTSname, Sage FROM Student WHERE Sage< 20
SELECT Sname,Sage FROM Student WHERE NOT Sage >= 20
(4) 确定范围:
BETWEEN … AND … 包括临界值
NOT BETWEEN… AND …不包括临界值
作用:查找属性值在或不在指定范围内的元组
说明:
BETWEEN后是范围的下限(低值)
AND后是范围的上限(高值)
例:查询年龄在20~23岁之间的学生的姓名、所在系和年龄
SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23
等价于:
SELECT Sname, Sdept, Sage FROM Student WHERE Sage >=20 AND Sage<=23
(5) 确定集合
作用:用来查找属性值属于指定集合的元组
例:查询信息系(IS)、数学系(MA)和计算机系(CS)学生的姓名和性别。
SELECTSname, Ssex FROM Student WHERE Sdept IN(‘IS’,‘CS’, ‘MA’)
等价于:
SELECT Sname, Ssex FROM Student WHERE Sdept=‘IS’ OR Sdept=‘MA’ OR Sdept=‘CS’
(6) 字符匹配
v 一般形式为:列名 [NOT ] LIKE 匹配串
v 作用:查找指定列名与匹配串常量匹配的元组。
v 匹配串类型:匹配串可以是字符串常量,也可以含有通配符。
v 通配符种类:
%(百分号):匹配0个或多个字符。
_(下划线):匹配一个字符。
[ ]:匹配括号中的字符
[∧ ]:不匹配括号中的字符
例:查询名字中第2个字为“海”字的学生的姓名和学号
SELECTSname, Sno FROM Student WHERE Sname LIKE ‘_海%’
(7) 多重条件查询
用逻辑运算符AND和OR组成多条件查询。
例:查询计算机系年龄在20岁以下的学生姓名
SELECT SnameFROM Student WHERE Sdept=‘CS’ AND Sage<20
(8) 对查询结果进行排序的子句为:
ORDER BY <列名> [<列名> … ] [ASC |DESC ]
说明:按<列名>进行升序(ASC)或降序(DESC)排序。
例:查询全体学生情况,查询结果按所在系的系号升序排列,同一系的学生按年龄降序排列
SELECT *FROM Student ORDER BY Sdept, Sage DESC
(9) SQL提供的计算函数
v COUNT(*):统计表中元组个数
v COUNT(<列名>):统计本列非空列值个数
v SUM(<列名>):计算列值总和(必须是数值型列)
v AVG(<列名>):计算列值平均值(必须是数值型列)
v MAX(<列名>):求列值最大值
v MIN(<列名>):求列值最小值
(10) 对查询结果分组
v 作用:可以控制计算的级别(对全表还是对一组)
v 目的:细化计算函数的作用对象
v 分组语句的一般形式:
[WHERE<条件> ]
[GROUP BY <分组条件>]
[HAVING <组自身条件>]
例:统计每门课程的选课人数,列出课程号和人数
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno
4.插入数据
语法格式如下:
INSERT [ INTO]
table_name
{ [ ( column_list ) ]
{ VALUES
( { expression } [ ,...n] )
}
}
v 语法注释:
Ø [INTO]:一个可选的关键字,可以将它用在 INSERT 和目标表之间。
Ø table_name:将要接收数据的表或 table 变量的名称。
Ø (column_list):要在其中插入数据的一列或多列的列表。必须用圆括号将column_list括起来,并且用逗号进行分隔。
Ø VALUES:引入要插入的数据值的列表。对于column_list(如果已指定)中或者表中的每个列,都必须有一个数据值。必须用圆括号将值列表括起来。如果 VALUES 列表中的值与表中列的顺序不相同,或者未包含表中所有列的值,那么必须使用column_list明确地指定存储每个传入值的列。
Ø 最简单的INSERT 语句
例:
在“Northwind”数据库的“OrderDetails”表里插入一条记录,其中“OrderID”字段的值为10248;“ProductID”字段的值为1;“UnitPrice”字段的值为10;“Quantity”字段的值为2;“Discount”字段的值为0.8 。
程序清单如下:
INSERT [order details](orderid,productid,unitprice,quantity,discount)
VALUES(10248,1,10,2,0.8)
Ø 标识列、允许为空字段的处理
例:
在“Northwind”数据库的“Categories”表里插入一条记录,其中“CategoryName”字段的值为“图书”;“Description”字段的值为“所有类型的图书” 。
程序清单如下:
INSERT INTO categories(categoryname,description) VALUES('图书','所有类型的图书')
Ø 有默认值字段的处理
例:
在“学生”数据库中创建“教师”表(性别为有默认值列) 。在该表中录入数据。
程序清单如下:
INSERT INTO teachers(teach_id,teach_name,tsex,tdegree)
VALUES('rj001', '李波',DEFAULT, '本科')
insert Into Student Values (95020, '陈冬', '男','IS', 18);
insert Into SC (Sno, Cno,grade) Values(95020, 1,100);
5.修改数据
修改数据
Update <表名>
Set <列名>=<表达式>[{, <列名>=<表达式>}] Set 列名 表达式 [{, 列名 表达式 }] [Where <条件>]
例:
Ø 将学生95001的年龄改为22岁
Update Student Set Sage = 22 Where Sno=95001
Ø 将所有学生的年龄增加1岁
Update Student Set Sage=Sage+1
6.删除语句
删除数据
Delete From <表名>[Where <条件>]
例:
删除学号为95019的学生的记录
Delete From Student
Where Sno=95019
删除所有学生的选课记录
Delete From SC