数据库系统原理(第四章:SQL与关系数据库基本操作 )
一、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的客户姓名及其地址
数据库系统原理(第四章:SQL与关系数据库基本操作 )的更多相关文章
- 【概念原理】四种SQL事务隔离级别和事务ACID特性
摘要: SQL事务隔离级别和事务的ACID特性 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性. 事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UNCOMMITTED.R ...
- 编译原理-第四章 语法分析-4.6 简单LR技术
简单LR分析方法 一.LR语言分析器模型与算法 1.输入.输出.栈和方法 2.LR语法分析表 3.LR分析程序 4.例 例1: 例2: 二.LR语法分析算法 1.LR语法分析算法的定义和概念 定义: ...
- 编译原理-第四章 语法分析-4.7 规范的LR分析
规范的LR分析 一.规范LR(l)项 二.规范LR(l)项集族 1.构建项目集 2.例 三.规范LR(1)语法分析表 1.构造 2.例1 3.例2 四.LALR语法分析表 1.重要性 2.特点 3.构 ...
- 第12章 SQL联接
第12章 SQL联接 关系数据库的3个支柱:选择.投影和联接. 两种基本的连接同等联接和非同等联接. 源表和目标表有相同的名称的列,就可以在他们之间执行自然联接,而无需指定连接列. 自然join us ...
- 数据库系统原理之SQL(四)
数据库系统原理之SQL(四) 1. 数据更新 插入数据 INSERT-VALUES语句 #插入多条数据 insert [into] table_name (column_name,...) value ...
- C#语言和SQL Server第十三 十四章笔记
十三章 使用ADO.NET访问数据库 十四章使用ADO.NET查询和操作数据库 十三章: ...
- Android艺术开发探索第四章——View的工作原理(下)
Android艺术开发探索第四章--View的工作原理(下) 我们上篇BB了这么多,这篇就多多少少要来点实战了,上篇主席叫我多点自己的理解,那我就多点真诚,少点套路了,老司机,开车吧! 我们这一篇就扯 ...
- MyBatis 3(中文版) 第四章 使用注解配置SQL映射器
本章将涵盖以下话题: l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l ...
- web安全之SQL注入---第四章 如何进行SQL注入攻击
第四章 如何进行SQL注入攻击1.数字注入2.字符串注入 '# '--
随机推荐
- 微信公众号支付提示当前页面的URL未注册
问题: 记一下前端时间自己做了一个微信公众号支付的功能,因为有一段时间没有接触过了微信支付方面的开发,居然忘记了在微信商户商户号中配置了对应的支付目录,所以提示我当前的域名是没有注册的. 设置支付目录 ...
- Docker for Java Developers
1. 基本概念 1.1. 主要组件 Docker有三个主要组件: 镜像是Docker的构建组件,而且是定义应用程序操作系统的只读模板 容器是Docker的运行组件,它是从镜像创建的.容器可以运行. ...
- css 揭秘-读书笔记
css 揭秘 [希]Lea verou 著 css 魔法 译 该书涵盖7大主题,47个css技巧,是css进阶必备书籍,开阔思路,探寻更优雅的解决方案.这本书完全用css渲染出的html写成的(布局. ...
- 使用 Polly 实现复杂策略(超时重试)
一.背景 第一次接触 Polly 还是在做某个微服务系统的时候,那时只会使用单一的超时策略与重试策略,更加高级的特性就没有再进行学习了.最近开为某个客户开发 PC 端的上位机的时候,客户有个需求,在发 ...
- PlayJava Day015
今日所学: /* 2019.08.19开始学习,此为补档. */ StringBuffer 定义: 可变字符序列 - 线程安全的 作用:基本与String相同,也是用于描述字符串 与String的区别 ...
- 基于opencv -python--银行卡识别
import cv2 def sort_contours(cnts, method="left-to-right"): reverse = False i = 0 if metho ...
- [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析【转】
转自:https://www.cnblogs.com/x_wukong/p/8573602.html 转自;https://www.cnblogs.com/aaronLinux/p/5890924.h ...
- jsp连接mysql出现不支持认证协议的解决办法
错误提示 com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Client does not support authent ...
- Day11 - Python基础11 模块学习——optparse
Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大 ...
- git解决"failed to push some refs to"问题
当我们正常的使用git发布文件更新Github仓库时, 比如我想传一张照片上去,首先把照片"2.png"复制到了".git"文件夹追踪的本地仓库中: 在Git ...