内容来源:唐成. 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 建表语句

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

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

  1. CREATE TABLE table_name (
  2. col01_name data_type,
  3. col02_name data_type,
  4. col03_name data_type,
  5. col04_name data_type
  6. );

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

table_name为表名,col01_name col02_name col03_name col04_name分别表示列名。

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

变长的字符串在大多数数据库中都可使用varchar类型。整形数据一般使用int类型。日期类型使用date

例如:

  1. CREATE TABLE score (
  2. student_name varchar(40),
  3. chinese_score int,
  4. math_score int,
  5. test_date date
  6. );

在建表的时候,可以指定表的主键,主键是表中行的唯一标识,这个唯一标识,是不能重复的。

在创建表的语句中,可以在列定义后面用primary key来指定这一列为主键。

例如:

  1. CREATE TABLE student (
  2. no int primary key,
  3. student_name varchar(40),
  4. age int
  5. );

2.2 删除表语句

  1. DROP TABLE table_name;

3. DML语句

3.1 插入语句

插入数据

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

INSERT语句的语法:以INSERT INTO关键字为首,后面跟表名,然后再跟VALUES关键字,最后是由小括号包围起来的以逗号分隔的各列数据,数据的顺序与表定义是表列的顺序是一样的。当然也可以在表名后指定要插入数据列的顺序:

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

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

  1. INSERT INTO student (no, student_name) VALUES(3, '王二');

3.2 更新语句

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

  1. UPDATE student SET age = 15;

更新语句以UPDATE关键字开始,后面跟表名,然后是SET关键字,表示要设置的数据,字后面就是要设置的数据的表达式age = 15,就是列名 = 数据

在更新数据时,还可以指定过滤表达式WHERE,从而指定更新哪条数据或哪些数据:

  1. UPDATE student SET age = 14 WHERE no = 3;

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

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

3.3 删除语句

如果想删除学号(no)为3的记录,语句如下:

  1. DELETE FROM student WHERE no =3;

删除语句以DELETE FROM开始,后面跟表名,然后加WHERE子句用于指定要删除的记录。

如果没有WHERE子句,这将会删除整个表的数据!

4. DQL语句

4.1 单表查询语句

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

  1. SELECT no, student_name, age FROM student;

SELECT关键字开头,表示要查询,后面跟多个列名,各列之间使用逗号分隔。其后的FROM是关键字,后面跟表的名称。各个列可以是表的名称,也可以是一个表达式,如下:

  1. SELECT age+5 FROM student;

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

  1. SELECT no, 3+5 FROM student;

当表达式与表的列无关时,在PostgreSQL和MySQL中可以不适用FROM 表名,这样一来,就可以当计算器使用了:

  1. SELECT 55+88;
  2. SELECT 10*2, 3*5+2

如果想查询表中所有列的数据,则可以使用*代表所有列:

  1. SELECT * FROM student;

4.2 过滤条件的查询

SELECT语句后面可以通过指定WHERE子句来指定要查询哪条记录或哪些记录。

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

  1. SELECT * FROM student WHERE no=3;

WHERE条件中也可以使用大于、小于的表达式。

比如,想查询年龄大于等于15岁的学生,其语句如下:

  1. SELECT * FROM student WHERE age >= 15;

4.3 排序

使用排序子句可以对查询出的数据进行排序,排序子句是在SELECT语句后面加上ORDER BY子句。

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

  1. SELECT * FROM student ORDER BY age;

排序子句ORDER BY应该在WHERE子句之前,如果顺序错了,会报错。

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

比如,根据agestudent_name两个列来排序:

  1. SELECT * FROM student ORDER BY age,student_name;

也可以在排序子句的列名后加DESC进行倒序排序:

  1. SELECT * FROM student ORDER BY age DESC;
  2. SELECT * FROM student ORDER BY age DESC,student_name;

4.4 分组查询

如果需要统计不同年龄的学生人数,可以使用分组查询,分组查询子句的关键字为GROUP BY,用法如下:

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

使用GROUP BY子句时,需要使用聚合函数,常用的聚合函数为countsum等。

4.5 表join

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

  1. CREATE TABLE class (
  2. no int primary key,
  3. class_name varchar(40)
  4. );

插入一些测试数据:

  1. INSERT INTO class VALUES(1,'初二(1)班');
  2. INSERT INTO class VALUES(2,'初二(2)班');
  3. INSERT INTO class VALUES(3,'初二(3)班');
  4. INSERT INTO class VALUES(4,'初二(4)班');

还有另一张学生表student,建表语句为:

  1. CREATE TABLE student (
  2. no int primary key,
  3. student_name varchar(40),
  4. age int,
  5. class_no int
  6. );

插入一些测试数据:

  1. INSERT INTO class VALUES(1,'张三',14,1);
  2. INSERT INTO class VALUES(2,'吴二',15,1);
  3. INSERT INTO class VALUES(3,'李四',13,2);
  4. INSERT INTO class VALUES(4,'吴三',15,2);
  5. INSERT INTO class VALUES(5,'王二',15,3);
  6. INSERT INTO class VALUES(6,'李三',14,3);
  7. INSERT INTO class VALUES(7,'吴四',15,4);
  8. INSERT INTO class VALUES(8,'张四',14,4);

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

  1. SELECT student_name, class_name FROM student, class
  2. WHERE student.class_no = class.no;

表关联查询就是在WHERE条件上加上需要关联的条件(两张表关联):

  1. WHERE student.class_no = class.no;

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

  1. SELECT student_name, class_name FROM student a, class b
  2. WHERE a.class_no = b.no;

在关联查询的WHERE子句中可以再加上其他的过滤条件:

  1. SELECT student_name, class_name FROM student a, class b
  2. WHERE a.class_no = b.no AND a.age>14;

5. 其他SQL语句

5.1 INSERT INTO ... SELECT语句

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

假设见了一张学生表的备份表:student_bak

  1. CREATE TABEL student_bak(
  2. no int primary key,
  3. student_name varchar(40),
  4. age int,
  5. class_no int
  6. );

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

  1. INSERT INTO student_bak SELECT * FROM student;

5.2 UNION语句

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

  1. SELECT * FROM student WHERE no = 1 UNION
  2. SELECT * FROM student_bak WHERE no = 2;

注意,UNION可以把结果集中相同的两条记录合并成一条

如果不想合并,请使用UNION ALL

  1. SELECT * FROM student WHERE no = 1 UNION ALL
  2. 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中的数据清理掉,则可以使用如下命令:

  1. 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. BUAA_OO_博客作业一

    BUAA_OO_博客作业一 (一)程序结构分析 1.代码统计 第一次作业 第二次作业 第三次作业 代码复杂度展示第三次作业的 method ev(G) iv(G) v(G) Constant.Cons ...

  2. C#关键字详解第六节

    3.28 日志记录:前段时间参加技能大赛,所以未更新博客,特此补上,第一次写博客,希望自己认真下去,努力,天道酬勤! 比赛给我的感悟很深!古语云:山外有山,强中自有强中手! do:执行语句 说do之前 ...

  3. max_element()与min_element()

    #include<iostream>#include<algorithm>using namespace std;bool cmp(int i,int j){ return i ...

  4. Java基础学习总结(42)——Log4j 2使用教程

    1. 去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以了(xx是乱七八糟的版本号): log4j-core-xx.jar log4j-api-xx.jar 2. 导入到 ...

  5. JavaSE 学习笔记之异 常(十)

    异 常: 异常:就是不正常.程序在运行时出现的不正常情况.其实就是程序中出现的问题.这个问题按照面向对象思想进行描述,并封装成了对象.因为问题的产生有产生的原因.有问题的名称.有问题的描述等多个属性信 ...

  6. 使用MySQLMigrationToolkit快速将Oracle数据导入MySQL

    使用MySQL Migration Toolkit快速将Oracle数据导入MySQL 上来先说点废话 本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoD ...

  7. mysql :=和=的区别

    :=和=的区别 = 只有在set和update时才是和:=一样,赋值的作用,其它都是等于的作用.鉴于此,用变量实现行号时,必须用:= := 不只在set和update时时赋值的作用,在select也是 ...

  8. N天学习一个Linux命令之top

    用途 查看机器负载以及进程资源占用情况,linux系统性能分析工具 用法 top -hv | -abcHimMsS -d delay -n iterations -p pid [, pid ...] ...

  9. [Cocos2d-x v3.x]Mac OX 创建新的Cocos2d-x 3.0 项目

    文章内容来自于: http://cocos2d-x.org/wiki/How_to_Start_A_New_Cocos2D-X_Game Mac OS X 10.9 Software Requirem ...

  10. 浅谈 System.Decimal 结构

    引言 我们知道,Microsoft .NET Framework 中的 System.Decimal 结构(在 C# 语言中等价于 decimal keyword)用来表示十进制数,范围从 -(296 ...