数据库系统原理(第四章: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;

  1. 字符集(character set):定义了字符以及字符的编码。
  2. 字符序(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的客户姓名及其地址

转载于:https://www.cnblogs.com/jalja/p/11605648.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium操作浏览器窗口最大化和刷新

实际测试过程中经常遇到打开一个页面并不是全屏显示,但是却希望它能够全屏显示或者新增一条记录后需要刷新一下看能不能再列表中正常显示。 于是就有了今天的关于对浏览器窗口的最大化和刷新页面。需要说明的一点:所有和python相关的记录都是基于3.6版本…

Git安装步骤+Mac终端配置

Git安装步骤 其实可以直接略过。因为安装的时候,一路 next 即可。 注意,安装路径中不能出现中文。安装完成后,不得更改安装路径。 检查Git是否安装成功 在任何文件夹,空白处,右键。如果看到 “Git Bash Here”&#xf…

数据库系统原理(第5章:数据库编程)

一、存储过程 概念:存储过程是一组为了完成某项特定功能的SQL语句集, 其实质就是一段存储在数据库中的代码。 它可以由声明式的sql语句和过程式sql语句组成。 特点: 可增强SQL语言的功能和灵活性良好的封装性高性能可减少网络流量可作为一种安…

科学-中医:儒医

ylbtech-科学-中医:儒医"儒医"是一种历史悠久的社会文化现象。阐释了"儒医"的三重境界,即良医、大医、圣医。"良医"注重技,属于知识论,追求的是"真";"大医"注重德,属于道德论,追求的是"善";"圣医…

Ajax — 第六天

Ajax-06 GET和POST的区别 字面意思不同 GET 是获取意思。想从服务器获取数据,用GET方式的请求POST是邮递、邮寄意思。如果提交数据到服务器,用POST方式 请求参数位置不同 GET 请求参数会和url拼接到一起,形如 api/getbooks?id2&age3PO…

iOS Tips 模拟器屏幕截图

当我们发布app到AppStore的时候,在itunes connect里面,苹果官方要求我们提供各种尺寸的屏幕截图。由于受到硬件条件的限制,我们不可能在每个真实的物理机器上测试并截图,相反如果我们能直接在模拟器上进行屏幕截图的话&#xff0c…

数据库系统原理(第6章:数据库安全与保护)

一、数据库完整性 数据库完整性是指数据库中数据的正确性和相容性。 完整性约束条件的作用对象 列级约束: 包括对列的类型、取值范围、精度等的约束元组约束: 指元组中各个字段之间的相互约束表级约束: 指若干元组、关系之间的联系的约束定义…

.net core WebApi 使用Swagger生成API文档

关于 Swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API。Swagger 可以生成客户端SDK代码用于各种不同的平台上的实现。Swagger 文件可…

Git — 初体验

准备工作 版本管理软件 作用 记录代码的版本实现多人协作 分类 集中式,典型代表 SVN分布式,典型代表 Git 注册远程仓库账号 远程仓库相当于中央服务器我们需要在github上或码云上注册一个账号,用于创建远程仓库使用注册的时候&#xff0…

iOS CoreTelephony框架介绍与使用案列

昨晚看一篇文章时看到了私有API这个词,貌似开发者对私有API的使用很反感于是果断百度谷歌,以下是Stackoverflow中关于Private Frameworks的一个解释: Private frameworks are frameworks which you are not allowed to use. They are not exp…

JS数组的迭代器方法

迭代器forEachevery一、迭代器方法 迭代器方法, 这些方法对数组中的每一个元素应用一个函数,可以返回一个值,一组值或一个新数组。 不生成新数组的迭代器方法 1.forEach() forEach()输出 forEach输出结果2.every() 该方法按接受一个返回值为布…

Git 笔记

三个区域 下面三个区域,是Git虚拟的区域,看不到,摸不着。 工作区 工作区,指的是使用Git管理后的文件,这些文件显示在磁盘上,供我们使用或修改的区域。所以,粗略的说,项目文件夹就是…

git -- 练习的笔记

gitgitee.com:my_exercises/my_exercises.githttps://gitee.com/my_exercises/my_exercises/invite_link?invite3ab56c724a0aed34ae2bd193ce87e741e67fe05ee029cc01b7993663152babc57d76203fdafbbb42e766b0d826817bc91.在任意位置右键打开 2.初始化设置 3.添加远程仓库地址 4.…

Swift傻傻分不清楚系列(十二) 属性

本页包含内容: 存储属性(Stored Properties)计算属性(Computed Properties)属性观察器(Property Observers)全局变量和局部变量(Global and Local Variables)类型属性&a…

GIT — 使用回顾

回顾Git的使用 记录每次的变更 工作区 --> 暂存区 git add . / git add 文件 文件夹 .... 工作区 --> 暂存区/本地仓库 前提条件:文件曾经被添加到暂存区或提交到仓库git commit -a -m 提交说明 暂存区 --> 本地仓库 git commit -m 提交说明 / git commi…

Ajax — 大事件项目(第一天)

应用的前端技术 Ajax (重要) — jQuery方式接口请求Layui 框架使用HTML CSS JS 项目说明和演示 线上 DEMO 项目地址:http://www.liulongbin.top:8086/项目的 API 接口地址: https://www.showdoc.cc/escook?page_id3707158761215217 项目请求根路径…

iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

说明: 1)该文简短介绍在iOS开发中遍历字典、数组和集合的几种常见方式。 2)该文对应的代码可以在下面的地址获得:https://github.com/HanGangAndHanMeimei/Code 一、使用for循环 要遍历字典、数组或者是集合,for循环是…

Ajax — 大事件项目(第二天)

大事件-02 fix一个bug 原因: 开始做注册的时候,页面中只有一个 namepassword的input,所以 $(‘input[name“password”]’) 可以准确的找到元素后来做登录的时候,页面中多了一个namepassword的input,所以$(‘input[…

OpenCV自带dnn的Example研究(3)— object_detection

这个博客系列,简单来说,今天我们就是要研究https://docs.opencv.org/master/examples.html下的6个文件,看看在最新的OpenCV中,它们是如何发挥作用的。在配置使用的过程中,需要注意使用较高版本的VS避免编译器兼容问题&…

Ajax — 大事件项目(第三天)

大事件-03 用户信息 表单验证 html中&#xff0c;直接使用layui提供的内置验证规则 email <input type"text" name"email" required lay-verify"required|email" placeholder"请输入邮箱" autocomplete"off" class&q…