数据库系统原理第四章
一、SQL概述
sql是结构化查询语言(Structured Query Language,SQL)是专门用来与数 据库通信的语言,它可以帮助用户操作关系数据库。
SQL的特点:
SQL不是某个特定数据库供应商专有的语言; SQL简单易学 ;SQL强大、灵活,可以进行非常复杂和高级的数据库操作
SQL的组成:
- 数据查询
- 数据定义语言(Data Definition Language,DDL)
- 数据操纵(DML)
- 数据控制(DCL)
*******************数据定义语言**********************
CREATE 创建数据库或数据库对象
ALTER 对数据库或数据库对象进行修改
DROP 删除数据库或数据库对象
************数据操纵语言(Data Manipulation Language,DML)***********
SELECT 从表或视图中检索数据
INSERT 将数据插入到表或视图中
UPDATE 修改表或视图中的数据
DELETE 从表或视图中删除数据
***************数据控制语言(Data Control Language,DCL)****************
GRANT 用于授予权限
REVOKE 用于收回权限
二、MySQL预备知识
嵌入式和动态SQL规则:规定了SQL语句在高级语言程序设计中 使用的规范方法,以便适应较为复杂的应用
SQL 调 用(以便提高SQL的灵活性、有效性、共享性以及使SQL具有更多的高级语言的特征):SQL 例 程、调 用 规 则
MySQL使用基础:LAMP模式 、WAMP模式 L(Linux) A(Apache)M(MySQL) P(PHP、Perl、Python)
关系数据库管理系统(RDBMS):优点:体积小、速度快、开放源代码、遵循GPL
MySQL扩展语言要素
常量:也称字面值或标量值
- 字符串常量:用单引号或双引号括起来的字符序列,分为ASCII字符串常量和Unicode字符串常量
- 数值常量:整数常量、 浮点数常量
- 十六进制常量:每对十六进制数字被转换为一个字符,其最前面有一个字母“X”(或“x”)
- 时间日期常量:用单引号将表示日期时间的字符串括起来而构成的 例如:’2018-06-05’
- 位字段值
- 布尔值:TRUE:1 ;FALSE: 0
- NULL值
变量:
- 用户变量:用户变量前常添加一个符号@,用于将 其与列名区分开
- 系统变量:大多数系统变量应用于其他SQL语句中 时,必须在系统变量前添加两个@
表达式 表达式是常量、变量、列名、复杂计算、运算符和函数的组合。
- 字符型表达式
- 数值型表达式
- 日期型表达式
三、数据定义(DDL)
创建数据库(CREATE):使用CREATE DATABASE 或 CREATE SCHEMA语句
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT]CHARACTER SET[=]charset_name |[DEFAULT]COLLATE[=]collation_name
例句:create DATABASE test_sy CHARACTER SET ="UTF8" COLLATION ="utf8_general_ci"; CREATE DATABASE mysql_test;
- 字符集(character set):定义了字符以及字符的编码。
- 字符序(collation):指定字符集的 校对规则。
查看数据库(SHOW):查看数据库的所有表
SHOW {DATABASES | SCHEMAS} [LIKE’pattern’ | WHERE expr]
Like关键字用于匹配指定的数据库名称; Where从句用于指定数据库名称查询范围的条件
例句:SHOW DATABASES; SHOW DATABASES LIKE "%test%";
SHOW TABLES:查看数据库非系统表
选择数据库(USE):USE db_name; 从一个数据库“跳转”到另一个数据库。
修改数据库:alert
mysql>ALTER DATABASE mysql_test -> DEFAULT CHARACTER SET gb2312 -> DEFAULT COLLATE gb2312_chinese_ci;
删除数据库:
DROP{DATABASE|SCHEMA}[IF EXISTS]db_name
例句:DROP DATABASE hahaha; DROP DATABASE IF EXISTS hahaha;
*****************************表定义**********************************
创建表:数据表是关系数据库中最重要、最基本的数据对象, 也是数据存储的基本单位。
数据表, 被定义为字段的集合 按(行 )和(列 )的格式来存储的, 每一( 行)代表一条记录, 每一(列 )代表记录中一个字段的取值。
CREATE[TEMPORARY]TABLE tbl_name ( 字段名1 数据类型 [列级完整性约束条件][默认值] [,字段名2 数据类型 [列级完整性约束条件][默认值]] [,……] [,表级完整性约束条件] )[ENGINT=引擎类型];
若添加“TEMPORARY”,则为临时表
在一个已有数据库mysql_test中新建一个包含客户姓名、性别、地址、 联系方式等内容的客户基本信息表,要求将客户的id号指定为该表的 主键。
PRIMARY KEY(cust_id):指定主键
数据类型:
- 整型int
- 浮点型double
- 布尔型bool
- 日期型date
- 时间戳timestamp
- 时间型time 定长
- 字符类型char
- 可变长字符varchar
更新表(ALTER):使用ALTER TABLE语句,增加或删减列、创建或取消索引、更改原有列的 数据类型、重新命名列或表,更改表的评注和表的引擎类型,为表重新创 建触发器、存储过程、索引和外键等。
1、ADD COLUMN
例如:向数据库mysql_test的表customers中添加一列,并命名为 cust_city,要求其不能为NULL,默认值为字符串“Wuhan”,且该列位 于原表cust_sex列之后。
ALTER TABLE mysql_test.customers ->ADD COLUMN cust_city char(10)NOT NULL DEFAULT ‘Wuhan’ AFTER cust_sex;
2、CHANGE[COLUMN]子句 修改表中列的名称或数据类型
3、ALTER[COLUMN]子句 修改或删除表中指定列的默认值
ALTER TABLE mysql_test.customers ->ALTER COLUMN cust_city SET DEFAULT ‘Beijing’;
4、MODIFY[COLUMN]子句 只修改指定列的数据类型,不会干涉它的列名
ALTER TABLE mysql_test.customers ->MODIFY COLUMN cust_name char(20) FIRST;
5、DROP[COLUMN]子句 删除表中多余的列
ALTER TABLE mysql_test.customers ->DROP COLUMN cust_contact;
6、RENAME[TO]子句 为表重新赋予一个表名
ALTER TABLE mysql_test.customers ->RENAME TO mysql_test.backup_customers;
给表重命名表的第二种写法:RENAME TABLE db_a.old_table TO db_b.new_table;
7、DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [ ,tbl_name ] … [RESTRICT | CASCADE]
查看表结构:
SHOW [FULL] COLUMNS {FROM | IN} tbl_name[{FROM | IN} db_name] [LIKE’pattern’ | WHERE expr]
例如:SHOW COLUMNS FROM t_role;
{DESCRIBE | DESC} tbl_name [col_name | wild]
例如:DESC t_role;
********************************************索引****************************************
索引:索引是提高数据文件访问效率的有效方法
索引存在的弊端: 1)索引是以文件的形式存储的,如果有大量的索引,索引文件可能比数据 文件更快达到最大的文件尺寸; 2)索引在提高查询速度的同时,会降低更新表的速度。
索引的分类:索引通常被创建成单列索引和组合索引
- 普通索引 INDEX或KEY
- 唯一性索引 UNIQUE
- 主键 PRIMARY KEY
索引的创建 Create index
例如:在数据库mysql_test的表customers上,根据客户姓名列的前三个 字符创建一个升序索引index_customers。
create index index_customers on mysql_test.customers (name(3) ASC);
在数据库mysql_test的表customers上,根据客户姓名列和客户id 号创建一个组合索引index_cust。
create index index_cust on mysql_test.customers (cust_name,cust_id);
2、语法项[CONSTRAINT[symbol]] UNIQUE [INDEX|KEY] [index_name] (index_col_name,…),
用于表示在创建新表的同时创建该表的唯一性索引;
3、语法项[CONSTRAINT[symbol]] FOREIGN KEY [index_name] (index_col_name,…),
用于表示在创建新表的同时创建该表的外键;
索引的创建:使用ALTER TABLE语句创建
- 1)语法项ADD {INDEX|KEY} [index_name](index_col_name,…), 用于表示在修改表的同时为该表添加索引;
- 2)语法项ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,…), 用于表示在创建新表的同时为该表添加主键;
- 3)语法项ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] (index_col_name,…), 用于表示在修改表的同时为该表添加唯一性索引;
- 4)语法项ADD [CONSTRAINT [symbol]] FOREIGN KEY (index_col_name,…), 用于表示在创建新表的同时为该表添加外键
例如:使用ALTER TABLE语句在数据库mysql_test中表seller的姓名上添加一列 非唯一的索引,取名为index_seller_name。
ALTER TABLE mysql_test.seller ADD INDEX index_seller_name(seller_name);
索引的查看(SHOW INDEX )
SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name ] [WHERE expr]
SHOW index FROM t_test.tb_dept;
索引的删除:使用DROP INDEX语句
DROP INDEX index_name ON tbl_name;
索引的删除:使用ALTER TABLE语句
- 1)选用DROP PRIMARY KEY子句用于删除表中的主键,由于一个表中只有 一个主键,其也是一个索引;
- 2)选用DROP INDEX子句用于删除各种类型的索引;
- 3)选用DROP FOREIGN KEY子句用于删除外键。
例如:使用ALTER TABLE语句删除数据库mysql_test中表customers的主键和索引 index_customers。
四、数据更新(数据操纵语言DML)
插入数据
- INSERT…VALUES语句
- INSERT…SET语句
- INSERT…SELECT语句
例如:
1、使用INSERT…VALUES语句向数据库mysql_test的表customers中 插入这样一行完整数据:(901,张三 ,F,北京市,朝阳区)
INSERT INTO mysql_test.customers VALUES (901,’张三’,’F’,’北京市’,’朝阳区’);
2、使用INSERT…VALUES语句向数据库mysql_test的表customers中插入这样一行 数据,要求该数据目前只用明确给出cust_name列和cust_address列的信息,即分别为 ‘李四’‘武汉’,而cust_id由系统自动生成,cust_sex列选用表中默认值,另外 cust_contact列的值暂不确定,可不用指定
INSERT INTO mysql_test.customers VALUES (0,’李四’,DEFAULT,’武汉市’,NULL);
********************使用INSERT…SET语句插入部分列值数据***************************
语法:INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},…
例如:使用INSERT…SET语句向数据库mysql_test的表customers中插入 数据:名为李四 ,地址为武汉,性别默认
insert into mysql_test.customers set cu_name="李四",cu_address="武汉",cu_sex=DEFAULT;
***********************使用INSERT…SELECT语句插入子查询数据****************************
语法:INSERT [INTO] tbl_name [(col_name,…)] SELECT…
例句:INSERT INTO db1_name (field1,field2) SELECT field1,field2 FROM db2_name;
删除数据
语法:DELETE FROM tbl_name [WHERE where_condition ] [ORDER BY … ] [LIMIT row_count ]
例如:使用DELETE语句删除数据库mysql_test的表customers中客户名 为“李四”的客户信息。
delete from mysql_test.customers where cu_name="李四";
修改数据
语法:UPDATE tbl_name SET col_name1={expr1|DEFAULT}[,col_name2={expr2|DEFAULT}]… [WHERE where_condition] [ORDER BY …] [LIMIT row_count]
例如:使用UPDATE语句将数据库mysql_test的表customers中姓名为“ 张三”的客户的地址更新为“武汉”
UPDATE mssql_test.customers SET cust_address=‘武汉市’ WHERE cust_name=‘张三’;
五、数据查询
SELECT语句
例如:查询数据库mysql_sest的表customers中各个客户的姓名、性别和地址信息
SELECT cust_name,cust_sex,cust_address FROM mysql_test.customers;
定义并使用列的别名:SELECT cust_name,cust_address AS 地址,cust_contact FROM mysql_test.customers;
替换查询结果集中的数据
SELECT CASE id WHEN 1 then "yf" when 2 then "cs" WHEN 3 THEN "yw" WHEN 4 THEN "jl" ELSE "qt" END AS NAME FROM tb_dept;
聚合函数通常是数据库系统中一类系统(内置函数)
*******************FROM子句与多表连接查询**********************
交叉连接,又称笛卡尔积
- SELECT * FROM tbl1 CROSS JOIN tbl2;
- SELECT * FROM tbl1,tbl2
内连接:SELECT * FROM tb_student INNER JOIN tb_score ON tb_student.studentNo=tb_score.studentNo
- 关于内连接的使用,可以将一个表与它本身进行连接,这种连接方式称为自连接;
- 关于内连接的使用,如若在ON子句的连接条件中使用运算符“=”,则此 连接方式为(等值连接)
外连接:
- 左外连接:在FROM子句中使用关键字LEFT OUTER JOIN或LEFT JOIN
- 右外连接:在FROM子句中使用关键字RIGHT OUTER JOIN或RIGHT JOIN
问答题:写出在MySQL中,内连接的语法格式。
简述左外连接和右外连接的区别。
- 左外连接:也称左连接。以左表为基表,在FROM子句中使用关键字“LEFT OUTER JOIN”或关键字“LEFT JOIN”来连接两张表。
- 右外连接:也称右连接。以右表为基表,在FROM子句中使用关键字“RIGHT OUTER JOIN”或关键字“RIGHT JOIN”来连接两张表。
where子句
判定范围:
1、当查询的过滤条件被限定在值的某个范围时,可以使用关键字“BETWEEN”。
例如:SELECT * FROM mysql_test.customers ->WHERE cust_id BETWEEN 903 AND 912;
2、使用关键字“IN”可以指定一个值的枚举表,该表中会列出所有可能的值
判定空值: is null ;is not null
子查询—结合关键字“IN”使用的子查询:主要用于判定一个给定值是否存在于子查询的结果集中
子查询—结合关键字“EXISTS”使用的子查询:子查询的结果集不为空,则返回TRUE,否则返回FALSE
GROUP BY子句与分组数据:
HAVING子句:HAVING where_condition(指定过滤条件)
having 语句与实际有出入为了考试请按照书本上的来哪怕他错了
ORDER BY子句:排序
例句:在数据库mysql_test的表customers中依次按照客户姓名和地址的降序方式输出客户的姓名和性别
SELECT cust_name,cust_sex FROM mysql_test.customers -> ORDER BY cust_name DESC,cust_address DESC;
LIMIT:使用LIMIT子句限制被SELECT语句返回的行数
六、视图
什么是视图:
- 视图是数据库中的一个对象,它是数据库管理系统提供给用户的以多种角度观察数据库中数据的一种重要机制。
- 视图不是数据库中真实的表,而是一张虚拟表,其自身并不存储数据。
使用视图的优点
- 集中分散数据
- 简化查询语句
- 重用SQL语句
- 保护数据安全
- 共享所需数据
- 更改数据格式
使用CREATE VIEW创建视图
语法;CREATE VIEW view_name[(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
- create or replace view的意思就是若数据库中已经存在这个名字的视图的话,就替代它,若没有则创建视图;
- create则不进行判断,若数据库中已经存在的话,则报错,说对象已存在;
在数据库mysql_test中创建视图customers_view,要求该视图包含客户信息表customers中所有男客户的信息,并且要求保证今后对该视图数据的修改都必须符合客户性别为男性这个条件
CREATE OR REPLACE VIEW mysql_test.customers_view AS SELECT*FROM mysql_test.customers WHERE cust_sex=‘M’ WITH CHECK OPTION;
使用DROP VIEW语句删除视图:
DROP VIEW [IF EXISTS] view_name [,view_name]… [RESTRICT | CASCADE]
使用ALTER VIEW语句对已有视图的定义(结构)进行修改
ALTER VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL]CHECK OPTION]
使用SHOW CREATE VIEW语句查看已有视图的定义(结构)
SHOW CREATE VIEW view_name
使用DELETE语句通过视图删除基本表的数据:
示例:删除视图customers_view中姓名为“周明”的客户信息
DELETE FROM mysql_test.customers_view -> WHERE cust_name=‘周明’
在视图customers_view中查找客户id号为905的客户姓名及其地址