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
语句也表示清空表的内容。从执行结果看,两者实现了相同的功能,但两者实现的原理是不一样的。
TRUNCATE TABLE
是DDL语句,即数据定义语句,相当于用重新定义一个新表的方法,把原先表的内容直接丢弃了,所以TRUNCATE TABLE
执行起来很快,而DELETE
是DML语句,可以认为DELETE
是把数据一条一条地删除。
如果想把表student_bak
中的数据清理掉,则可以使用如下命令:
TRUNCATE TABLE student_bak;
内容来源:唐成. PostgreSQL修炼之道[M]. 机械工业出版社, 2015.
SQL语言入门的更多相关文章
- 2016 - 3 - 12 SQLite的学习之SQL语言入门
1.SQL语句的特点: 1.1 不区分大小写 1.2 每条语句以;结尾 2.SQL语句中常用关键字: select,insert,update,from,create,where,desc,order ...
- Oracle学习笔记之四,SQL语言入门
1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...
- [SQL]SQL语言入门级教材_SQL语言快速入门(五)
SQL语言快速入门(一) SQL是英文Structured Query Language的缩写,意思为结构化查询语言. SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按照ANSI(美国国家标 ...
- MySQL入门——MySQL数据库和SQL语言
MySQL入门——MySQL数据库和SQL语言 摘要:本文主要了解了MySQL关系型数据库和SQL语言的基本知识. MySQL数据库 简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB ...
- 数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
数据库从入门到精通合集(超详细,学习数据库必看) 查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表 ...
- 数据库SQL语言从入门到精通--Part 4--SQL语言中的模式、基本表、视图
数据库从入门到精通合集(超详细,学习数据库必看) 前言: 使用SQL语言时,要注意SQL语言对大小写并不敏感,一般使用大写.所有符号一定是西文标点符号(虽然是常识,但我还是提一嘴) 1.模式的定义与删 ...
- 数据库SQL语言从入门到精通--Part 1--SQL语言概述
数据库从入门到精通合集(超详细,学习数据库必看) 一.SQL概述 关系数据库标准语言SQL(结构化查询语言). 结构化查询语言(Structured Query Language)简称SQL,是一种特 ...
- SQL入门(4): 嵌入式SQL语言
本节讲述内容: 1.嵌入式SQL 语言概述 2.变量声明与数据库连接 3.数据集与游标 4.可滚动游标与数据库的增删改 5.状态捕捉以及错误处理机制 (一)嵌入式SQL语言 之前我们所学的都是交互式S ...
- 1.SQL语句入门
--SQL语句入门-- --1.sql语言是解释语言 --2.它不区分大小写 --3.没有"",所有字符或者字符串都使用''包含 --4.sql里面也有类似于c#的运算符 -- 算 ...
随机推荐
- List多字段排序,orderBy,ThenBy
List排序问题,orderBy,ThenBy 1.List中一个字段排序 前几天做的项目中,获取的List<T>需要用某个字段来进行排序,困扰了很久.用OrderBy解决了.具体是这样的 ...
- C# WPF 无窗体传递消息
WPF如果存在窗体(或至少,在任务栏有图标显示),互相传递消息是很容易的. 寻找目标窗体句柄->WindowsAPI SendMessage/PostMessage->目标窗体AddHoo ...
- [bzoj1634][Usaco2007 Jan]Protecting the Flowers 护花_贪心
Protecting the Flowers 护花 bzoj-1634 Usaco-2007 Jan 题目大意:n头牛,每头牛有两个参数t和atk.表示弄走这头牛需要2*t秒,这头牛每秒会啃食atk朵 ...
- HIHO 16 C
树分治.对于一棵子树的根节点,至少有一条边与儿子相连的属于重边.对于一条轻边,它的贡献值是两端子树大小的乘积,所以,重边应该是贡献值最大的一边. 至于要求所有的点,进行深度优先搜索,因为移动一个点只会 ...
- Delphi春天将来临,Android遇到XE7我也是醉了,Hello World
回首往日,从Delphi 7走到如今.总感觉不愠不火.期间论坛倒掉无数,没倒掉的也半死不活,大批的程序猿转向C#,Java,PHP. Delphi的开发高效有目共睹,一直不忍放弃.Delphi以前一夜 ...
- [RxJS] AsyncSubject and ReplaySubject - Learn the Differences
We can use Subject as Observable and Observer: // Subject should be only used to emit value for priv ...
- GPS-Graph Processing System 改动源代码经验总结 (四)
HamaWhite原创,转载请注明出处.欢迎大家增加Giraph 技术交流群: 228591158 本文目的:在改动GPS源代码后,具体描写叙述怎样编译和分发到各Worker节点上. 以下以Graph ...
- 好记性不如烂笔头——WebService与Remoting
一.WebService总体上分为5个层次: 1)HTTP传输信道 2)XML的数据格式 3)SOAP的封装协议,用于传输 4)WSDL的描述方式,用于引用 5)UDDI,通用描述.发现与集成服务,用 ...
- oc44--多对象内存管理
// Room.h #import <Foundation/Foundation.h> @interface Room : NSObject @property int no;// 房间号 ...
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...