SQL语言入门

  • 格式:pdf
  • 大小:124.07 KB
  • 文档页数:5

SQL语⾔⼊门

内容来源:唐成. PostgreSQL修炼之道[M]. 机械⼯业出版社, 2015.

此书购买链接:

SQL(Structured Query Language)

结构化查询语⾔

1. 语法简介

1.1 语句分类

DDL (Data Definition Language)数据定义语⾔,主要⽤于创建、删除,以及修改表、索引等数据库对象语⾔。

DML (Data Manupulation Language)

数据操作语句,主要⽤于插⼊、更新、删除数据,所以分为INSERT、UPDATE、DELETE三种语句。

DQL (Data Query Language)

数据查询语句,基本就是SELECT查询语句,⽤于数据查询。

1.2 语法结构

多条SQL语句之间⽤分号(

;)隔开

每个SQL命令有⼀些列的记号组成:关键字标识符双引号包围的标识符常量单引号包围的⽂本常量特殊的字符

……

2. DDL语句

2.1 建表语句

表⽰关系型数据库中最基本的对象,有很多列也有很多⾏,每⼀列有⼀个名字,不同的列有不同的数据类型。

建表语句的⼀个简单语法如下:

CREATE TABLE table_name (

col01_name data_type,

col02_name data_type,

col03_name data_type,

col04_name data_type

);

其中

CREATE和

TABLE为关键字,表⽰创建表。

table_name为表名,

col01_name

col02_name

col03_name

col04_name分别表⽰列名。

data_type表⽰数据类型,不同的数据库系统有不同的数据类型名称。

变长的字符串在⼤多数数据库中都可使⽤

varchar类型。整形数据⼀般使⽤

int类型。⽇期类型使⽤

date。

例如:

CREATE TABLE score (

student_name varchar(40),

chinese_score int,

math_score int,

test_date date

);

在建表的时候,可以指定表的主键,主键是表中⾏的唯⼀标识,这个唯⼀标识,是不能重复的。在创建表的语句中,可以在列定义后⾯⽤

primary key来指定这⼀列为主键。

例如:

CREATE TABLE student (

no int primary key,

student_name varchar(40),

age int

);

2.2 删除表语句

DROP TABLE table_name;

3. DML语句

3.1 插⼊语句

插⼊数据

INSERT INTO student VALUES(1, '张三', 14);

INSERT语句的语法:以

INSERT INTO关键字为⾸,后⾯跟表名,然后再跟

VALUES关键字,最后是由⼩括号包围起来的以逗号分隔的各列数

据,数据的顺序与表定义是表列的顺序是⼀样的。当然也可以在表名后指定要插⼊数据列的顺序:

INSERT INTO student (no, age, student_name) VALUES(2, 13, '李四');

在插⼊数据时,也可以指定某些列不插⼊数据,这是这些列的数据会被置为空,如下:

INSERT INTO student (no, student_name) VALUES(3, '王⼆');

3.2 更新语句

student表中所有学⽣的年龄(age)更新为“15”:

UPDATE student SET age = 15;

更新语句以

UPDATE关键字开始,后⾯跟表名,然后是

SET关键字,表⽰要设置的数据,字后⾯就是要设置的数据的表达式

age = 15,就是

列名

= 数据。

在更新数据时,还可以指定过滤表达式

WHERE,从⽽指定更新哪条数据或哪些数据:

UPDATE student SET age = 14 WHERE no = 3;

SET⼦句中,还可以同时更新多个列的值:

UPDATE student SET age = 13, student_name = '王明充' WHERE no =3;

3.3 删除语句

如果想删除学号(

no)为3的记录,语句如下:

DELETE FROM student WHERE no =3;

删除语句以

DELETE FROM开始,后⾯跟表名,然后加

WHERE⼦句⽤于指定要删除的记录。

如果没有

WHERE⼦句,这将会删除整个表的数据!

4. DQL语句

4.1 单表查询语句

查询

student表中所有数据的语句为:

SELECT no, student_name, age FROM student;

SELECT关键字开头,表⽰要查询,后⾯跟多个列名,各列之间使⽤逗号分隔。其后的

FROM是关键字,后⾯跟表的名称。各个列可以是表的

名称,也可以是⼀个表达式,如下:

SELECT age+5 FROM student;

表达式中可以包括表的列,也可以只是⼀个与表列⽆关的表达式:

SELECT no, 3+5 FROM student;当表达式与表的列⽆关时,在PostgreSQL和MySQL中可以不适⽤

FROM 表名,这样⼀来,就可以当计算器使⽤了:

SELECT 55+88;

SELECT 10*2, 3*5+2;

如果想查询表中所有列的数据,则可以使⽤

*代表所有列:

SELECT * FROM student;

4.2 过滤条件的查询

SELECT语句后⾯可以通过指定

WHERE⼦句来指定要查询哪条记录或哪些记录。

⽐如,要查询学号为3的记录,其SQL语句为:

SELECT * FROM student WHERE no=3;

WHERE条件中也可以使⽤⼤于、⼩于的表达式。

⽐如,想查询年龄⼤于等于15岁的学⽣,其语句如下:

SELECT * FROM student WHERE age >= 15;

4.3 排序

使⽤排序⼦句可以对查询出的数据进⾏排序,排序⼦句是在

SELECT语句后⾯加上

ORDER BY⼦句。

⽐如,希望查询出来的结果按年龄排序,则查询语句如下:

SELECT * FROM student ORDER BY age;

排序⼦句

ORDER BY应该在

WHERE⼦句之前,如果顺序错了,会报错。

还可以按多个列进⾏排序。

⽐如,根据

age和

student_name两个列来排序:

SELECT * FROM student ORDER BY age,student_name;

也可以在排序⼦句的列名后加

DESC进⾏倒序排序:

SELECT * FROM student ORDER BY age DESC;

SELECT * FROM student ORDER BY age DESC,student_name;

4.4 分组查询

如果需要统计不同年龄的学⽣⼈数,可以使⽤分组查询,分组查询⼦句的关键字为

GROUP BY,⽤法如下:

SELECT age, count(*) FROM student GROUP BY age;

使⽤

GROUP BY⼦句时,需要使⽤聚合函数,常⽤的聚合函数为

count、

sum等。

4.5 表join

表join也成为多表联合查询。假设有⼀张班级表,建表语句为:

CREATE TABLE class (

no int primary key,

class_name varchar(40)

);

插⼊⼀些测试数据:

INSERT INTO class VALUES(1,'初⼆(1)班');

INSERT INTO class VALUES(2,'初⼆(2)班');

INSERT INTO class VALUES(3,'初⼆(3)班');

INSERT INTO class VALUES(4,'初⼆(4)班');

还有另⼀张学⽣表student,建表语句为:

CREATE TABLE student (

no int primary key,

student_name varchar(40),

age int,

class_no int

);插⼊⼀些测试数据:

INSERT INTO class VALUES(1,'张三',14,1);

INSERT INTO class VALUES(2,'吴⼆',15,1);

INSERT INTO class VALUES(3,'李四',13,2);

INSERT INTO class VALUES(4,'吴三',15,2);

INSERT INTO class VALUES(5,'王⼆',15,3);

INSERT INTO class VALUES(6,'李三',14,3);

INSERT INTO class VALUES(7,'吴四',15,4);

INSERT INTO class VALUES(8,'张四',14,4);

若现在想查询出每个学⽣与班级的关系,那么此时就需要关联查询两张表:

SELECT student_name, class_name FROM student, class

WHERE student.class_no = class.no;

表关联查询就是在

WHERE条件上加上需要关联的条件(两张表关联):

WHERE student.class_no = class.no;

如果输⼊的表名⽐较长,可以给表起个别名:

SELECT student_name, class_name FROM student a, class b

WHERE a.class_no = b.no;

在关联查询的

WHERE⼦句中可以再加上其他的过滤条件:

SELECT student_name, class_name FROM student a, class b

WHERE a.class_no = b.no AND a.age>14;

5. 其他SQL语句

5.1

INSERT INTO ... SELECT语句

使⽤

INSERT INTO ... SELECT语句可以把数据从⼀张表插⼊到另⼀张表中,这个语句属于DML语句。

假设见了⼀张学⽣表的备份表:

student_bak

CREATE TABEL student_bak(

no int primary key,

student_name varchar(40),

age int,

class_no int

);

可以使⽤下⾯的语句把数据备份到下⾯这张备份表中:

INSERT INTO student_bak SELECT * FROM student;

5.2

UNION语句

可以讲从两张表查询出来的数据整合在⼀个结果集下:

SELECT * FROM student WHERE no = 1 UNION

SELECT * FROM student_bak WHERE no = 2;

注意,

UNION可以把

结果集中相同的两条记录合并成⼀条

如果不想合并,请使⽤

UNION ALL:

SELECT * FROM student WHERE no = 1 UNION ALL

SELECT * FROM student_bak WHERE no = 1;

5.3

TRUNCATE TABLE语句

TRUNCATE TABLE语句的⽤途是清空表内容。不带

WHERE条件⼦句的

DELETE语句也表⽰清空表的内容。从执⾏结果看,两者实现了相同的功

能,但两者实现的原理是不⼀样的。