SQL语言入门
2016-05-29 13:02
519 查看
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.
此书购买链接:京东 亚马逊
相关文章推荐
- MYSQL基础学习(二)
- MYSQL学习
- MySQL 配置优化(多个参数)
- Mysql事务隔离级别与锁
- MySQL数据库InnoDB引擎下服务器断电数据恢复
- JamesMusic浅读--------5,文件选择系统的数据库绑定
- Redis源码解析:20sentinel(一)初始化、建链
- 直接修改Datagridview并保存到数据库
- 介绍几个SQL SERVER中与内存相关的计数器
- debian8-install postgresql-9.4
- Oracle Dedicated server 和 Shared server(专用模式 和 共享模式) 说明
- mysql tmp_table_size优化之设置多大合适
- Hibernate 中的session 的flush、reflush 和clear 方法 ,及数据库的隔离级别
- [Sql2008错误问题]附件数据库时出现的3种常见错误的解决办法
- mysql 配置文件
- 从ORACLE RAC角度看跨数据中心的存储双活配置注意事项
- jdbcTemplate 插入Mysql 并返回主键ID
- MySql二进制连接方式详解
- oracle使用exp与imp对数据迁移备份的方法
- cmd进入 链接mysql注意事项