关于SQL 概述和分类

一、SQL概述

1. 什么是SQL?

SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL Oracle SQL Server等。SQL标准有:虽然SQL可以用在所有关系型数据库中,但很多数据库还都有标准之后的一些语法,我们可以称之为“方言”。例如MySQL中的LIMIT语句就是MySQL独有的方言,其它数据库都不支持!当然,Oracle或SQL Server都有自己的方言。

2. SQL语法要求

 SQL语句可以单行或多行书写,以分号结尾;

 可以用空格和缩进来来增强语句的可读性;

 关键字不区别大小写,建议使用大写;

二、分类

DDL(Data Definition Language):数据定义语言,用于库和表的创建 修改 删除;DML(Data Manipulation Language):数据操作语言,用于添加 删除 修改数据库据并检查数据完整性DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;DQL(Data Query Language):数据查询语言,用来查询数据

1.DDL

1.1 基本操作

基本操作


1.2 操作数据库

创建数据库

创建一个名为mydb1的数据库。如果这个数据已经存在,那么会报错。当不确定是否存在该数据库时,使用CREATE DATABASE IF NOT EXISTS mydb1,在名为mydb1的数据库不存在时创建该库,这样可以避免报错。


删除数据库

删除名为mydb1的数据库。如果这个数据库不存在,那么会报错。DROP DATABASE IF EXISTSmydb1,就算mydb1不存在,也不会的报错。


修改数据库的字符集

1.3 常用数据类型

MySQL与Python一样,也有数据类型。MySQL中数据类型主要应用在列上。

char和varchar的比较

char和varchar的比较

datetime和timestamp的比较

datetime和timestamp的比较

1.4 操作表

创建表

例如:

创建表

复制表

1.5 完整性约束

完整性约束是为了限制表中字段的数据的,从而进一步保证数据表的数据是一致的 准确的 可靠的。

主键:当某一列添加了主键约束后,那么这一列的数据就不能重复出现。这样每行记录中其主键列的值就是这一行的唯一标识。例如学生的学号可以用来做唯一标识,而学生的姓名是不能做唯一标识的,因为学习有可能同名。

注意:

1. 主键列的值不能为NULL,也不能重复!

2. 指定主键约束使用PRIMARY KEY关键字!

创建表时设置主键:

主键自增长

MySQL提供了主键自动增长的功能!这样用户就不用再为是否有主键重复而烦恼了。当主键设置为自动增长后,在没有给出主键值时,主键的值会自动生成,而且是最大主键值+1,也就不会出现重复主键的可能了 。

默认

指定默认值的列,在插入数据时,如果被默认约束的位置没有值,那么这个位置将会被DEFAULT的值填充。

非空

指定非空约束的列不能没有值,也就是说在插入记录时,对添加了非空约束的列一定要给值;在修改记录时,不能把非空列的值设置为NULL。

当为sname字段指定为非空后,在向students表中插入记录时,必须给sname字段指定值, 否则会报错


唯一

还可以为字段指定唯一约束!当为字段指定唯一约束后,那么字段的值必须是唯一的。这一点与主键相似!例如给students表的sname字段指定唯一约束。

外键

外键是构成表与表关联的唯一途径!外键是另一张表的主键! 为了更形象的让大家理解,做dage和xiaodi两个表,大哥表是主键表,小弟表是外键表。

数据表关系

一对多/多对一

存在最普遍的映射关系,简单来讲就如大哥与小弟的关系:

一对多:从社会组织角度来说一个大哥拥有多个小弟即为一对多;多对一:从小弟角度来说多个小弟属于一个大哥即为多对一

一对一

一对一关系就如大哥与组织之间的关系,一个大哥仅有一个组织,而一个组织也仅有一个大哥;数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联;

多对多

多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。

数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。

二、DML

2.1 插入数据

2.2 修改数据

注意:更新时一定要保证WHERE子句的正确性,一旦WHERE子句出错,将会破坏所有改变的数 据。

2.3 删除数据

注意:在实际的应用中,执行删除操作时,执行删除的条件一般应该为数据的id,而不是具 体某个字段值,这样就可以避免一些错误的发生。


注意:由于TRUNCATE TABLE语句会删除数据表中的所有数据,并且无法恢复,因此使用 TRUNCATE TABLE语句一定要十分小心。


三、DQL


3.1 基础查询


3.2 条件查询

条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:

带关键字IN的查询

关键字IN可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,该记录将被查询出来;如果不在集合中,则不满足查询条件。

带关键字BETWEEN AND的范围查询

关键字BETWEEN AND可以判断某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足查询条件,该记录将被查询出来。如果不在指定范围内,则不满足查询条件。

带关键字LIKE的字符匹配查询

通过LIKE可以实现模糊查询。它有两种通配符:“%”和下划线“_”

“%”可以匹配一个或多个字符,可以代表任意长度的字符串,,长度可以为0。例如,“L%D”表示以“L”开头,以“D”结尾的任意长度的字符串。

“_”只匹配一个字符。例如“m_n”表示以m开头,以n结尾的3个字符。中间的“_”可以代表任意一个字符。

带关键字IS NULL查询空值

关键字IS NULL可以用来判断字段的值是否为空值(NULL)。如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。

带关键字AND的多条件查询

关键字AND可以用来联合多个条件进行查询。使用关键字AND时,只有同时满足所有查询条件的记录会被查询出来。如果不满足这些查询条件的其中一个,这样的记录就会被排除掉。

带关键字OR的多条件查询

关键字OR也可以用来联合多个条件进行查询,但是与关键字AND不同,关键字OR只要满足查询条件中的一个,那么此记录就会被查询出来;如果不满足这些查询条件中的任何一个,这样的记录将被排除掉。

带关键字DISTINCT去除结果中的重复行

使用关键字DISTINCT可以去除查询结果中的重复记录

带关键字ORDER BY对查询结果排序

使用关键字ORDER BY可以对查询的结果进行升序和降序的排列,在默认情况下,ORDER BY按升序输出结果。如果要按降序排列可以使用DESC来实现。

使用关键字GROUP BY与GROUP_CONCAT()函数一起使用,可以将每个组中的记录数量都显示出来

按多个字段进行分组

使用关键字GROUP BY也可以按多个字段进行分组

用关键字LIMIT限制查询结果的数量

LIMIT是MySQL中一个特殊的关键字,可以对查询结果的记录条数进行限定,控制它输出的行数。

还可以从查询结果的中间部分取值。首先要定义两个参数,参数1是开始读取的第一条记录的编号(在查询结果中,第一个结果的记录编号是0,而不是1);参数2是要查询记录的个数

用关键字REGEXP使用正则表达式查询

正则表达式是用某种模式去匹配一类字符串的一个方式。正则表达式的查询能力比通配字符的查询能力更强大,而且更加灵活。

3.3 聚合函数查询

COUNT()函数

对于除"*"以外的任何参数,返回所选择集合中非NULL值的行的数目;对于参数“*”,返回选择集合中所有行的数据,包含NULL值的行。

SUM()函数

SUM()函数可以求出表中某个字段取值的总和

AVG()函数

AVG()函数可以求出表中某个字段取值的平均值

MAX()函数

MAX()函数可以求出表中某个字段取值的最大值

MIN()函数

MIN()函数可以求出表中某个字段取值的最小值

3.4 链接查询

内连接查询

列出数据表中与连接条件相匹配的数据行,组合成新记录【只有满足条件的记录才出现在查询结果】

内连接的最常见的例子是相等连接,也就是连接后的表中的某个字段与每个表中的都相同。

外连接查询

与内连接不同,外连接是指使用OUTER JOIN关键字将两个表连接起来。外连接生成的结果集不仅包含符合连接条件的行数据 ,而且还包含左表(左外连接时的表) 右表(右外连接时的表)或两边连接表(全外连接时的表)中所有的数据行。

左外连接

左外连接是指将左表中的所有数据分别与右表中的每条数据进行连接组合,返回的结果除了内连接的数据外,还包括左表中不符合条件的数据,并在右表的相对应列中添加NULL值

右外连接

右外连接是指将右表中的所有数据分别与左表中的每条数据进行连接组合,返回的结果除内连接的数据外,还包括右表中不符合条件的数据,并在左表的相应列中添加NULL

复合条件连接查询

在连接查询时,也可以增加其他的限制条件,通过多个条件的复合查询,可以使查询结果更加准确。


3.5 子查询

子查询就是SELECT查询是另一个查询的附属,MySQL4.1开始可以嵌套多个查询,在外面一层的查询中使用里面一层查询产生的结果集。这样就不是执行两个(或多个)独立的查询,而是执行包含一个(或多个)子查询的单独查询。

当遇到这样的多重查询时,MySQL从最内层的查询开始,然后从它开始向外向上移动到外层(主)查询,在这个过程中每个查询产生的结果集都被赋予到包围它的父查询,接着这个父查询被执行,它的结果也被指定给父查询。

除了结果集经常由包含一个或多个值的一列组成外,子查询和常规SELECT查询的执行方式一样。子查询可以用在任何可以使用表达式的地方,它必须由父查询包围,而且,如同常规的SELECT查询,它必须包含一个字段列表(这是一个单列列表) 具有一个或者多个表名字的FROM子句以及可选的WHEREHAVING和GROUP BY子句。

带关键字IN的子查询

只有子查询返回的结果列包含一个值时,比较运算符才适合。例如一个子查询返回的结果集是值的列表,这时比较运算符就必须用关键字IN代替。IN运算符可以检测结果集中是否存在某个特定的值,如果检测成功就执行外部的查询。

带比较运算符的子查询

子查询也可以使用比较运算符,包括= != > >= <和<=等。比较运算符在子查询时使用非常广泛

带关键字EXISTS的子查询

使用关键字EXISTS时,内层查询语句不返回查询的记录,而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真值(true),否则返回一个假值(false)。当返回的值为true时,外层查询语句将进行查询,当返回的值为false时,外层查询语句不进行查询或者查询不出任何记录。

当关键字EXISTS与其他查询条件一起使用时,需要使用AND或者OR来连接表达式与EXISTS关键字

带关键字ANY的子查询

关键字ANY表示满足其中任意一个条件。使用关键字ANY时,只要满足内层查询语句返回的结果中的任意一个,就可以通过该条件来执行外层查询语句。

带关键字ALL的子查询

关键字ALL表示满足所有条件,使用关键字ALL时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。


3.6 合并查询结果

合并查询结果是将多个SELECT语句的查询结果合并到一起。因为某种情况下,需要将几个SELECT语句查询出来的结果合并起来显示。合并查询结果使用关键字UNION和UNION ALL。关键字UNION是将所有的查询结果合并到一起,并且去除相同记录;而关键字UNION ALL 则只是简单地将结果合并到一起。

UNION

UNION JOIN


3.7 定义表和字段的别名

在查询时,可以为表和字段取一个别名,这个别名可以代替指定的表和字段。为字段和表取别名,能够使查询更加方便,而且可以使查询结果以更加合理的方式显示。


四、MySQL视图

视图是一个虚拟表,是从数据库中一个或多个表中导出来的表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放视图中的数据。视图是存储在数据库中的查询的SQL语句。这样,用户可以不用看到整个数据库表中的数据,而只关心对自己有用的数据。

4.1 视图的作用

对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。通过视图进行查询没有任何限制,通过他们进行数据修改时的限制也很少。

简单性

看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次制定全部的数据。

安全性

视图的安全性可以防止未授权用户查看特定的行或列

逻辑数据独立性

视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,程序一定是建立在表上的。有了视图之后买程序可以建立在视图上,从而程序与数据库表被视图分割开来。

4.2 创建视图

创建视图是指在已经存在的数据库表上建立视图,视图可以建立在一张表中,也可以建立在多张表中。


4.3 视图操作

查看视图

查看视图是指查看数据库中已经存在的视图。查看视图必须要有SHOW VIEW的权限。查看视图的方法主要包括DESCRIBE语句 SHOW TABLES STATUS语句 SHOW CREATE VIEW语句等。

修改视图

修改视图是指修改数据库中已经存在的表和定义。当基本表的某些字段发生变化时,可以通过修改视图来保持视图和基本表之间一致。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER语句来修改视图。

更新视图

对视图的更新其实就是对表的更新,更新视图是指通过视图来插入(INSERT) 更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据,超出了范围,就不能更新。

更新成功后查看视图表数据是否变化,再去查看基本表数据是否变化。         结论:对视图的更新其实就是对基本表的更新

更新视图的限制

以下几种情况是不能更新视图的。

删除视图

删除视图是指删除数据库中已经存在的视图。删除视图时,只能删除视图的定义,而不会删除数据。

你可能感兴趣的:(关于SQL 概述和分类)