内容来源:唐成. 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
);

其中CREATETABLE为关键字,表示创建表。

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子句之前,如果顺序错了,会报错。

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

比如,根据agestudent_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子句时,需要使用聚合函数,常用的聚合函数为countsum等。

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语句也表示清空表的内容。从执行结果看,两者实现了相同的功能,但两者实现的原理是不一样的。

TRUNCATE TABLE是DDL语句,即数据定义语句,相当于用重新定义一个新表的方法,把原先表的内容直接丢弃了,所以TRUNCATE TABLE执行起来很快,而DELETE是DML语句,可以认为DELETE是把数据一条一条地删除。

如果想把表student_bak中的数据清理掉,则可以使用如下命令:

TRUNCATE TABLE student_bak;

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

此书购买链接:京东 亚马逊

SQL语言入门的更多相关文章

  1. 2016 - 3 - 12 SQLite的学习之SQL语言入门

    1.SQL语句的特点: 1.1 不区分大小写 1.2 每条语句以;结尾 2.SQL语句中常用关键字: select,insert,update,from,create,where,desc,order ...

  2. Oracle学习笔记之四,SQL语言入门

    1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...

  3. [SQL]SQL语言入门级教材_SQL语言快速入门(五)

    SQL语言快速入门(一) SQL是英文Structured Query Language的缩写,意思为结构化查询语言. SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按照ANSI(美国国家标 ...

  4. MySQL入门——MySQL数据库和SQL语言

    MySQL入门——MySQL数据库和SQL语言 摘要:本文主要了解了MySQL关系型数据库和SQL语言的基本知识. MySQL数据库 简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB ...

  5. 数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)

    数据库从入门到精通合集(超详细,学习数据库必看) 查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表 ...

  6. 数据库SQL语言从入门到精通--Part 4--SQL语言中的模式、基本表、视图

    数据库从入门到精通合集(超详细,学习数据库必看) 前言: 使用SQL语言时,要注意SQL语言对大小写并不敏感,一般使用大写.所有符号一定是西文标点符号(虽然是常识,但我还是提一嘴) 1.模式的定义与删 ...

  7. 数据库SQL语言从入门到精通--Part 1--SQL语言概述

    数据库从入门到精通合集(超详细,学习数据库必看) 一.SQL概述 关系数据库标准语言SQL(结构化查询语言). 结构化查询语言(Structured Query Language)简称SQL,是一种特 ...

  8. SQL入门(4): 嵌入式SQL语言

    本节讲述内容: 1.嵌入式SQL 语言概述 2.变量声明与数据库连接 3.数据集与游标 4.可滚动游标与数据库的增删改 5.状态捕捉以及错误处理机制 (一)嵌入式SQL语言 之前我们所学的都是交互式S ...

  9. 1.SQL语句入门

    --SQL语句入门-- --1.sql语言是解释语言 --2.它不区分大小写 --3.没有"",所有字符或者字符串都使用''包含 --4.sql里面也有类似于c#的运算符 -- 算 ...

随机推荐

  1. Git:文件操作和历史回退

    目录 创建仓库 创建文件/文件夹 修改文件/文件夹 回到修改前的版本 撤销修改 删除文件 工作区.暂存区.版本区 创建仓库 创建新文件夹:mkdir learngit 进入:cd learngit l ...

  2. 优雅的退出/关闭/重启gunicorn进程

    在工作中,会发现gunicorn启动的web服务,无论怎么使用kill -9 进程号都是无法杀死gunicorn,经过我一番百度和谷歌,发现想要删除gunicorn进程其实很简单. 第一步获取Guni ...

  3. 详解Cookie、LocalStorage、SessionStorage

    不管是笔试还是面试相信大家都会经常遇到问Cookie.LocalStorage.SessionStorage 这三个不同的,什么不说先上一波图先: 针对他们大小之分应用场景也有不同: 因为考虑到每个 ...

  4. noip模拟赛 整除

    分析:最暴力的思想就是枚举一边啦,然后就会发现有很多n/i的结果都是相同的,可以每次跳过这一段,这样能过60分. 想不出其它解法了,打个表找了一下规律: ans   num 1     1 2    ...

  5. PatentTips – RDMA data transfer in a virtual environment

    BACKGROUND Embodiments of this invention relate to RDMA (remote direct memory access) data transfer ...

  6. sqlServer杂计

    In与Exists的区别 这两个函数是差不多的,但由于优化方案不同,通常NOT Exists要比NOT IN要快,因为NOT EXISTS可以使用结合算法二NOT IN就不行了,而EXISTS则不如I ...

  7. Hadoop1.0之集群搭建

    VirtualBox虚拟机 下载地址 下载择操作系统对应的基础安装包 下载扩展包(不区分操作系统) http://www.oracle.com/technetwork/cn/server-storag ...

  8. RDS for MySQL查询缓存 (Query Cache) 的设置和使用

    https://help.aliyun.com/knowledge_detail/41717.html?spm=5176.7841698.2.11.aCvOXJ RDS for MySQL查询缓存 ( ...

  9. spring历史背景

    1.2004年spring出现第一版本spring frameworl1.0 2.写代码永远是最简单的,后续的运维工作才是让人感到无助的 3.spring boot在运维方面做了很多工作,部署,监控, ...

  10. 找出二叉查找树中指定结点的”下一个&quot;结点(也即中序后继)

    设计一个算法.找出二叉查找树中指定结点的"下一个"结点(也即中序后继).能够假定每一个结点都含有指向父结点的连接. watermark/2/text/aHR0cDovL2Jsb2c ...