数据库系统原理——备考计划1:关系数据库标准语言SQL_知识点汇总【附加例题演练】

目录

一、SQL语言(Structured Query Language)

1.概念:

2.什么是结构化查询语言?

3.SQL语言的特点:

(1)一体化:

(2)非过程化:

(3)使用方式灵活:

(4)面向集合的操作方式

(5)语言简洁

(6)具有数据定义、数据操纵、数据查询、数据控制四种功能:

4.mysql的字符集:

(1)概念:

(2)字符集的分类

(3) 如何通过mysql命令查看mysql服务器支持的字符集?

(4)如何通过mysql命令查看当前数据库的字符集?

5.MySQL的系统数据库:

二、数据定义语言(DDL)——针对数据库和数据表

1.Mysql数据库的三级模式结构

2.创建及使用数据库

(1)定义数据库

例题2-1:在MySQL中使用命令创建一个购物数据库BuyDB

(2)修改数据库

例2-2:修改buyDB数据库的字符集为gbk。

(3)删除数据库

例2-3:删除数据库BuyDB

3.创建及使用数据表

(1)数据类型

(2)定义基本表

例题3-2-1:用SQL命令建立一个客户表Customer

 (3)约束类型

(4)修改基本表

例3-4-1:在Customer表中增加一个顾客电话列。  

例3-4-2:在Customer表中增加完整性约束定义,使csex具有唯一性。

例3-4-3:把Customer 表中的Caddress 列列宽改为800。   

例3-4-4:删除Customer表中的Caddress列。     

(5)删除基本表

例3-5-1:删除S表   

三、数据操作语言(DML)

1.数据更新——增:插入数据

(1)单行数据插入

例题1-1-1:向customer表中插入一条数据:

(2)多行数据插入

例题1-1-2:向customer表中插入两条数据:

例题1-1-3:创建一张新表p_info,表结构和customer表结构一样,然后将customer表中所有所属类别为“女”的数据插入到新表p_info中

2.数据更新——删:删除数据

(1)在SQL 中使用DELETE语句进行数据的删除:

例题2-1-1:删除customer表中编号为'8'的顾客信息

(2)SQL中还可以通过truncate命令清空表中所有数据:

例题2-2-1:情况customer表中所有的数据

3.数据更新——改:修改数据

例题3-1:将customer表中id为'7'的顾客的电话号码更新为'100076',性别更新为'男'。

4.数据查询——查:单表

(1)SELECT子句

a、例4-1-1查询全体客户的客户编号,姓名,性别。

b、例4-1-2 查询客户的全部信息。

c、例4-1-3 查询下了订单的客户编号。

(2)WHERE子句

a、运算符:

b、通配符:

c、例题4-2-1:比较大小【>、<、=......】

d、例题4-2-2:多重条件【AND、OR、NOT】

e、例题4-2-3:确定范围【between...and、not between...and】

f、例题4-2-4:确定集合【IN、NOT IN】

g、例题4-2-5:部分匹配查询【LIKE】

h、例题4-2-6:空值查询【NULL】

(3)GROUP BY子句(分组查询)

a、聚合函数:

b、例题4-3-1:sum函数

c、例题4-3-2:avg函数

d、例题4-3-3:count函数

e、例题4-3-4:max函数和min函数

(4)ORDER BY子句(查询结果排序)和LIMIT子句

例题4-4-1:查询spxx(商品信息表)中所属类别为“日用品”的商品名称,价格及数量,且根据价格进行降序排序,并最终只显示前面两条价格最大的商品信息。

5.数据查询——查:多表

(1)连接查询

连接查询有三种连接类型:

a、内连接

①等值连接

例题3-5-1:查询供应空调的所有供应商的供应商编号,供应商名称,地址及电话号码。

②自连接

例题3-5-2:查询spxx(商品信息)表中价格相同的各类商品信息

b、外连接

①左外连接

②右外连接

③完全外连接

c、交叉连接

(2)子查询

a、使用IN关键字

b、返回一个值的子查询——使用比较运算符

例题:查询与“叶梓”老师职称相同的教师号、姓名

c、返回一组值的子查询——使用ANY或ALL关键字

例题:查询其他系中比计算机系所有教师工资都高的教师的姓名和工资。

d、使用exists关键字

例题:查询没有讲授课程号为C5的教师姓名。

e、集合合并——两个select查询语句通过union关键字连接起来

例题:分别查询所属类别为“文具”和“电器”的商品编号,商品名称,所属类别,再使用union语句将两条语句的查询结果进行合并。

四、数据控制语言(DCL)

1.授予权限

2.收回权限

五、视图(View)

(1)创建视图

例题5-1:创建视图v_spxx,主要查询商品信息中所属类别为“文具”的所有商品信息

(2)删除视图

例题5-2:删除视图v_spxx

六、索引

1.索引的概念

2.索引的作用

3.索引的分类

4.索引的创建(sql命令)

例题6-1:在spxx(商品信息)表中spmc字段创建名为index_spmc的索引。

5.索引的删除(sql命令)

例题6-2:删除spxx(商品信息)表中的index_spmc索引

6.索引的查看(sql命令)

例题6-3:查看spxx(商品信息)表中的索引情况。

7.使用explain命令查看执行计划 

例题6-4:查询ygxx(员工信息)表中所有的数据,并查看其执行计划,说明查询操作的访问类型且是否使用索引


一、SQL语言(Structured Query Language)

1.概念:

  • 结构化查询语言,是关系数据库的标准语言;
  • 是一个通用的、功能极强的关系数据库语言;
  • 通过sql语句可以实现数据定义、数据操纵、数据查询、数据控制。

2.什么是结构化查询语言?

其是高级的非过程化编程语言,允许用户在高层数据结构上工作,简单来说就是sql语句的书写顺序不严格要求,同时还可以嵌套写。这使其具有极大的灵活性和强大的功能。

3.SQL语言的特点:

(1)一体化:

类似于英语的自然语言。集数据定义DDL、数据操纵DML和数据控制DCL于一体,可以独立第完成数据库生命周期的全部活动,比如创建数据库、定义关系模式(相当于创一张二维表)、对表数据实行增删改查操作等等。

(2)非过程化:

简单来说就是,用户只需要提出操作要求,计算机便会执行,无需具体列出操作的步骤。

(3)使用方式灵活:

既是自含式语言(sql中有sql),以命令方式交互使用;

又是嵌入式语言(比如在idea中实现数据库与java编程语言的连接)

(4)面向集合的操作方式

(5)语言简洁

(6)具有数据定义、数据操纵、数据查询、数据控制四种功能:

功能关键字
数 据 查 询SELECT
数 据 定 义CREATE,DROP,ALTER
数 据 操 纵

INSERT(增),UPDATE(更新),DELETE(删)

数 据 控 制GRANT,REVOKE

4.mysql的字符集:

(1)概念:

字符集是一套符号和编码,校验规则(collation)是在字符集内用于比较字符的一套规则,即字符集的排序规则。同时, MySQL服务器可以支持多种字符集,在同一台服务器,同一个数据库,甚至同一个表的不同字段都可以指定使用不同的字符集

(2)字符集的分类

Unicode(Universal Code)是一种在计算机上使用的字符编码。

  • 存在不同的编码方案,包括Utf-8,Utf-16和Utf-32。
  • Utf表示Unicode Transformation Format

GBK(Chinese Internal Code Specification)是一个汉字编码标准。

(3) 如何通过mysql命令查看mysql服务器支持的字符集?

第一种:show character set;
第二种:select * from information_schema.character_sets;
第三种:select character_set_name, default_collate_name, description, maxlen from information_schema.character_sets;

图1-1 mysql5.7版本支持的字符集

(4)如何通过mysql命令查看当前数据库的字符集?

show variables like 'character%';

图1-2 mysql5.7当前数据库的字符集

5.MySQL的系统数据库:

(1)information_schema数据库——提供了访问数据库元数据的方式。(元数据是 关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。 有时用于表述该信息的其他术语包括“数据词典”和“系统目录”。)

(2)mysql数据库——是核心数据库,主要负责存储数据库的用户、权限设置、 关键字等mysql自己需要使用的控制和管理信息。比如常用的user表就 是在mysql数据库中。  

(3)performance_schema数据库——主要用于收集数据库服务器性能参数。

(4)sys数据库——其所有的数据源来自performance_schema数据库,目标是把数据库performance_schema的复杂度降低,让DBA能更好地阅读 这个数据库里的内容,更快地了解数据库的运行情况。


二、数据定义语言(DDL)——针对数据库和数据表

  • 数据定义语言(DDL)定义数据的模式、外模式和内模式三级模式结构;
  • 数据定义语言(DDL)定义模式/内模式外模式/模式二级映像;
  • 数据定义语言(DDL)定义有关的约束条件。

其主要提供create(创建)、drop(删除)、alter(修改)等语句。

1.Mysql数据库的三级模式结构

外模式对应“视图”,模式对应“基本表”,内模式对应“存储文件”

图2-1 SQL语言支持的关系数据库的三级模式结构

如图所示:

  • 一个关系模式对于一张二维表(基本表Base Table)
  • 一张基本表可以跨一个或多个存储文件
  • 一个存储文件可以存放一个或多个基本表

2.创建及使用数据库

(1)定义数据库

创建数据库语句语法: 
CREATE { DATABASE | SCHEMA } [IF NOT EXISTS] database_name
 [[DEFAULT] CHARACTER SET charset_name]
   [ [DEFAULT] COLLATE collation_name];

ps:符号[]代表里面的内容可有可无
database_name自定义数据库名
CHARACTER SET charset_name:指定数据库字符采用的默认字符集
COLLATE collation_name:指定字符集的校对规则
例题2-1:在MySQL中使用命令创建一个购物数据库BuyDB
CREATE DATABASE  BuyDB;
或CREATE DATABASE IF NOT EXISTS BuyDB;

(2)修改数据库

修改数据库语句语法: 
ALTER { DATABASE | SCHEMA } database_name
[[DEFAULT] CHARACTER SET charset_name]
   [ [DEFAULT] COLLATE collation_name;

例2-2:修改buyDB数据库的字符集为gbk。
ALTER DATABASE BuyDB CHARACTER SET gbk;

(3)删除数据库

删除数据库语句语法: 
DROP DATABASE IF EXISTS database_name;
例2-3:删除数据库BuyDB
DROP DATABASE IF EXISTS BuyDB;    

3.创建及使用数据表

(1)数据类型

整数类型bigint,int,smallint,tinyint,mediumint 
浮点数类型float和double
定点数类型

decimal

日期时间类型date,time,datetime,year和TIMESTAMP
字符串类型文本字符类型(char和varchar)、可变类型(TEXT和BLOB)和特殊类型(SET和ENUM)。

(2)定义基本表

创建基本表的语法语句格式:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
(column_definition,…)|[index_definition]
[table_option] [select_statement];

ps:符号[]代表里面的内容可有可无
(1)TEMPORARY:使用该关键字表示创建临时表。
(2)IF NOT EXISTS:在创建数据表前首先判断该名称的数据表是否存在,只有该名称的数据表不存在时才执行CREATE TABLE 操作,用此选项可以避免出现数据表已经存在而新建产生的错误。
(3)table_name:要创建的表名。
(4)column_definition:字段的定义,包括指定字段名、数据类型、是否允许为空值、主键约束、外键约束、唯一性约束、默认值、注释字段名等。
(5)index_definition:为表的相关字段指定索引。
(6)table_option:为表设置存储引擎、字符集等。
(7)select_statement:在一个已有表的基础上创建表的情况使用。
例题3-2-1:用SQL命令建立一个客户表Customer
Create  table Customer (
Cid  int primary key ,              # 主键
Cname  varchar(10) not null unique,    # 非空约束,唯一约束
Csex  char(2) DEFAULT '男' ,           # 默认约束 
Cage tinyint); 

 (3)约束类型

    在定义基本表的过程中还可以创建列的约束,以此来实现数据的完整性。

完整性约束的基本语法格式(列约束和表约束) 
  [CONSTRAINT <约束名> ] <约束类型>

常见的约束类型有:

NULL/NOT NULL约束

ps:主键列不允许出现空值

Create  table Food(

Fid  int not null,

Fname  varchar(10) );

在Food表中对Fid进行了Not Null约束,规定它的值不可以出现空值

UNIQUE约束(惟一约束)

指明表在某一列或多个列的组合上的取值必须惟一,一张表中可以有多个UNIQUE约束。

  • 用于定义列约束:
[CONSTRAINT <约束名>] UNIQUE  

  • 用于定义表约束 :
[CONSTRAINT <约束名>] UNIQUE(<列名>[{,<列名>}])

PRIMARY KEY约束(主键约束)

用于定义基本表的主键,起惟一标识作用,一张表中只能有一个PRIMARY KEY约束

  • 用于定义列约束
CONSTRAINT <约束名> PRIMARY KEY 

  • 用于定义表约束
[CONSTRAINT <约束名>] PRIMARY KEY (<列名>[{,<列名>}])
FOREIGN KEY约束(外键约束)多表的情况下,当另一个表中的主键是当前这个表的字段之一时,这个字段在当前这个表中要设置为外键约束。

AUTO_INCREMENT约束(自增约束)

向表中插入新记录时,设置自增约束的字段会自动生成唯一的ID

要注意:每张表只允许一个字段设置这个约束,同属该字段的数据类型必须是整型

(4)修改基本表

修改表的语句语法格式:
ALTER TABLE table_name
ADD [COLUMN] column_definition [first | after clo_name] #添加字段
  |  ADD INDEX [index_name] (index_col_name,...)	  	#添加索引
  |  ADD PRIMARY KEY (index_col_name,...)			#添加主键
  |  ADD UNIQUE [index_name] (index_col_name,...)		#添加唯一索引
  |  ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}  #修改字段
  |  CHANGE [COLUMN] old_col_name new_col_name column_definition	#重命名字段
  |  MODIFY [COLUMN] col_name column_definition			#修改字段
  |  DROP [COLUMN] col_name				#删除字段
  |  DROP PRIMARY KEY	   			    #删除主键
  |  DROP INDEX index_name				#删除索引
  |  RENAME [AS] new_tbl_name	  			#更改表名
例3-4-1:在Customer表中增加一个顾客电话列。  
ALTER TABLE Customer ADD  cphone varchar(11);

例3-4-2:在Customer表中增加完整性约束定义,使csex具有唯一性。
ALTER TABLE Customer ADD  cphone varchar(11);

例3-4-3:把Customer 表中的Caddress 列列宽改为800。   
 ALTER TABLE Customer modify COLUMN Caddress varchar(800);

例3-4-4:删除Customer表中的Caddress列。     
ALTER TABLE Customer DROP column Caddress;

(5)删除基本表

删除表的语句语法格式:
 DROP TABLE <表名>
例3-5-1:删除S表   
drop table s;


三、数据操作语言(DML)

1.数据更新——增:插入数据

(1)单行数据插入

INSERT INTO <表名> [(<列名>[,<列名>…])] VALUES(<常量>[,<常量>]…)
注意:VALUES子句中的各个值之间要用“,”分开,并且要与表名后面的括号中所指出的属性的排列顺序一致。
当要插入的新纪录包含表中的所有属性值时,表名后面可以省略列名。
例题1-1-1:向customer表中插入一条数据:

cid赋值‘001’,cname赋值‘小叶’,csex赋值‘女’,cage赋值18,cphone赋值‘1********4’

insert into customer(cid,cname,csex,cage,cphone) values('001','小叶','女',18,'1********4');

(2)多行数据插入

①INSERT INTO <表名>[(<字段名1>[,<字段名2>,…])]  VALUES(<表达式1>[,<表达式2>,…]), (<表达式1>[,<表达式2>,…]);.....

②INSERT INTO <表名> [(<字段名1>[,<字段名2>„])]  子查询
即把子查询的查询结果插入到<表名>指定的表中。
注意:字段一定要一一对应。
例题1-1-2:向customer表中插入两条数据:

cid赋值‘007’,cname赋值‘小h’,csex赋值‘女’,cage赋值18,cphone赋值‘1********4’

cid赋值‘008’,cname赋值‘小g’,csex赋值‘女’,cage赋值88,cphone赋值‘1********5’

insert into customer(cid,cname,csex,cage,cphone) 
values('007','小h','女',18,'1********4'),('008','小g','女',88,'1********5');

例题1-1-3:创建一张新表p_info,表结构和customer表结构一样,然后将customer表中所有所属类别为“女”的数据插入到新表p_info中
mysql> Create  table p_info (
    -> pid  int primary key ,              # 主键
    -> pname  varchar(10) not null unique,    # 非空约束,唯一约束
    -> page tinyint,
    -> phone varchar(11),
    -> psex  char(2) DEFAULT '男' );
mysql> insert into p_info select *from customer;

2.数据更新——删:删除数据

(1)在SQL 中使用DELETE语句进行数据的删除:

DELETE语句语法格式:

DELETE 
		FROM <表名>
		[WHERE <条件>]
例题2-1-1:删除customer表中编号为'8'的顾客信息
delete from customer where cid='8';

(2)SQL中还可以通过truncate命令清空表中所有数据:

其语法如下所示:
truncate table table_name;

注意:
truncate 命令是一次性删除表中的所有数据,后面不能加where条件。
数据修改和使用delete语句进行数据删除操作时,如果是对整个表的数据操作可以不写where条件,但一般情况下都需要根据where条件进行数据过滤。
例题2-2-1:情况customer表中所有的数据
truncate table customer;

3.数据更新——改:修改数据

在SQL 中使用UPDATE语句进行数据的更新:
UPDATE语句语法格式:

UPDATE <表名>
	SET <列名>=<表达式> [,<列名>=<表达式>]… 	[WHERE <条件>] 
例题3-1:将customer表中id为'7'的顾客的电话号码更新为'100076',性别更新为'男'。
 update customer set cphone='1000076',csex='男' where cid='7';

4.数据查询——查:单表

在SQL 中使用SELECT语句进行数据的查询:
SELECT语句语法格式:

	SELECT [ALL|DISTINCT]
	〈列名〉[AS 别名1] [{,〈列名〉[ AS 别名2]}]
	FROM〈表名1或视图名1〉[[AS] 表1别名] [{,〈表名2或视图名2〉[[AS] 表2别名]}]
	[WHERE〈检索条件〉]
	[GROUP BY <列名1>[HAVING <条件表达式>]]
	[ORDER BY <列名2>[ASC|DESC]]
      [limit 子句]

(1)SELECT子句:指定要查询的列名(字段),若要查询多个需要使用逗号隔开。
           其中使用*————代表要查询所查表中的所有字段;
           列名后可以添加AS关键字————别名作用;
           语句使用ALL关键字————显示表中出现的所有的行,通常系统默认使用;
           语句使用DISTINCT关键字————显示结果消除重复的行。

(2)FROM子句:指定要查询的表或者视图,可以有多张表,表间只需要用逗号隔开就好。
(3)WHERE子句:指定要查询的条件。
               可有可无,有就根据条件查找相应的结果,没有就显示所有的数据结果。
(4)GROUP BY子句:对查询结果进行分组,按照指定的列值进行相同值分组。
(5)HAVING子句:和GROUP BY配合使用,表示将查询数据分组后还需要按照其他的条件进行再次筛选分组。
(6)ORDER BY子句:对查询结果进行排序;
                  ASC——升序;DESC——降序;省略默认为升序。
(7)LIMIT子句:限制查询结果的显示行数


图3-4-1 子句的执行顺序示意图

(1)SELECT子句

a、例4-1-1查询全体客户的客户编号,姓名,性别。
SELECT cid,cname,csex FROM Customer;  

b、例4-1-2 查询客户的全部信息。
SELECT * FROM Customer; 

c、例4-1-3 查询下了订单的客户编号。
SELECT DISTINCT cid  FROM customer;

(2)WHERE子句

a、运算符:

当不确定查询条件的精确值时,可以使用LIKE或NOT LIKE 进行模糊查询
语句格式为:<属性名> LIKE <字符串常量>
b、通配符:

c、例题4-2-1:比较大小【>、<、=......】

查询spxx(商品信息表)中价格小于100的商品名称、所属类别、价格及数量。

select  spmc,sslb,jg,sl from spxx where jg<100;


d、例题4-2-2:多重条件【AND、OR、NOT】

查询spxx(商品信息表)中所属类别为“电器”,且价格大于100的商品名称、所属类别、价格及数量。

select  spmc,sslb,jg,sl from spxx where sslb='电器' and jg>100;


e、例题4-2-3:确定范围【between...and、not between...and】

查询spxx(商品信息表)中库存在500至1000之间的商品信息。

select  * from spxx where sl between 500 and 1000;


f、例题4-2-4:确定集合【IN、NOT IN】

查询ygxx(员工信息表)中权限级别在4,5的员工信息。

select * from ygxx where qxjb in('4','5');


g、例题4-2-5:部分匹配查询【LIKE】

查询ygxx(员工信息表)中姓名姓张的,且员工号不为空的员工编号、员工姓名。

select ygbh,name from ygxx where name like '张%' and ygbh  is not null;


h、例题4-2-6:空值查询【NULL】

查询ygxx(员工信息表)中身份证为空的员工信息。

select * from ygxx where sfzh is null;

(3)GROUP BY子句(分组查询)

a、聚合函数:


b、例题4-3-1:sum函数

查询spxx(商品信息表)数量之和大于12的商品所属类别每种类别所有商品的数量之和。

select sslb,sum(sl) as comdi_num from spxx group by sslb having (sum(sl)>=12);


c、例题4-3-2:avg函数

查询spxx(商品信息表)中日用品的平均价格

select avg(jg) from spxx where sslb='日用品';


d、例题4-3-3:count函数

统计spxx(商品信息表)中含有商品的数目

select count (spbh) from spxx;


e、例题4-3-4:max函数和min函数

查询spxx(商品信息表)在价格最高和价格最低的商品名称

select max(jg) as 最高价,min(jg) as 最低价 from spxx;

(4)ORDER BY子句(查询结果排序)和LIMIT子句

例题4-4-1:查询spxx(商品信息表)中所属类别为“日用品”的商品名称,价格及数量,且根据价格进行降序排序,并最终只显示前面两条价格最大的商品信息。
select spmc,jg,sl from spxx where sslb='日用品'  ORDER  BY jg desc LIMIT 2;

5.数据查询——查:多表

当查询过程中需要涉及到多张表时,此时需要考虑多表查询:连接查询和子查询

(1)连接查询

多表的连接方式有两种,通常使用第二种去实现多表的查询:

第一种:通过FROM子句指明进行连接的表明,WHERE子句指明连接的列和连接条件。
SELECT [ALL|DISTINCT]
	〈列名〉[AS 别名1] [{,〈列名〉[ AS 别名2]}]
    [INTO新表名]
	FROM〈表名1或视图名1〉[[AS] 表1别名]
	[WHERE〈检索条件〉]
	[GROUP BY <列名1>[HAVING <条件表达式>]]
	[ORDER BY <列名2>[ASC|DESC]] 
    [limit 子句]

第二种:使用关键字JOIN进行连接,JOIN后指定要连接的表以及表的连接方式,关键词ON后指定查询表间共同拥有的列。
SELECT [ALL|DISTINCT]
	〈列名〉[AS 别名1] [{,〈列名〉[ AS 别名2]}]
	FROM〈表名1或视图名1〉[[AS] 表1别名]
	[INNER |{{LEFT|RIGHT|FULL}[outer]}]
    JOIN <要连接的表名>
    ON <查询涉及表的共同列条件>
    [WHERE〈检索条件〉]
	[GROUP BY <列名1>[HAVING <条件表达式>]]
	[ORDER BY <列名2>[ASC|DESC]] 
    [limit 子句]
INNER JOIN  显示符合条件的记录,此为默认值 
LEFT(OUTER)JOIN左(外)连接,用于显示符合条件的数据行以及左边表中不符合条件的数据行,此时右边数据行会以NULL来显示 
RIGHT(OUTER)JOIN    右(外)连接,用于显示符合条件的数据行以及右边表中不符合条件的数据行。此时左边数据行会以NULL来显示 
FULL(OUTER)JOIN  显示符合条件的数据行以及左边表和右边表中不符合条件的数据行。此时缺乏数据的数据行会以NULL来显示 ,MySQL不支持完全外连接。
CROSS JOIN将一个表的每一个记录和另一表的每个记录匹配成新的数据行

表3-5-1   JOIN连接的分类

连接查询有三种连接类型:
a、内连接

连接查询默认的连接方式,一般通过关键字JOIN或INNER JOIN 去进行多表的查询操作 。内连接常用的方式有(非)等值、自连接方式:

①等值连接

在连接条件中使用运算符“=”来比较连接列的列值,满足条件即为等值连接,否则为非等值连接。同时,等值查询结果中列出被连接表中的所有列(包括重复列)

例题3-5-1:查询供应空调的所有供应商的供应商编号,供应商名称,地址及电话号码。
select supplier.gysbh,supplier.gysmc,supplier.dz,supplier.dhhm from supplier
inner join spxx 
on supplier.gysbh=spxx.spbh 
where spxx.spmc='空调';


②自连接

对同一个表进行连接的查询。使用这种方式,通常需要为该表定义一个别名(使用AS关键字),其他内容与多表的连接操作完全相似,只是在每次列出这个表时便为它命名一个别名。

例题3-5-2:查询spxx(商品信息)表中价格相同的各类商品信息
select b.spbh,b.spmc,b.jg,b.sl  
from spxx as a   #同样是spxx表 别名
join  spxx as b  #自己连接自己
on a.jg=b.jg and a.sslb<>b.sslb; #连接条件,类型不一样但价格相同的商品

b、外连接

在查询时所用的基表有主从表之分。

①左外连接

左表(FROM后的表)的数据全部保留,右表(JOIN后的表)相应行对应的列值无则填写NULL

使用左外连接的一般语法结构为:
SELECT select_list
FROM table1 LEFT OUTER JOIN table2 ON join_conditions

②右外连接

右外连接中JOIN关键字右边的表为主表,而关键字左边的表为从表。右表的数据保留,同样,左表相应行对应的列值无则填写NULL

使用右外连接的语句结构为:
SELECT select_list
FROM  table1  RIGHT  OUTER  JOIN  table2  ON  join_conditions

③完全外连接

两表数据均保留,不满足条件的填写NULL。在整个全外连接返回结果中,包含了两个完全连接表的所有数据。但MySQL不支持完全外连接。

c、交叉连接

使用关键字CROSS IN。

(2)子查询

一个SELECT...FROM....WHERE...语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句中或HAVING短语的条件中的查询称为嵌套查询也称为子查询

a、使用IN关键字
语法格式如下:
SELECT select_list
FROM table_sourcde
WHERE expression IN|NOT IN (subquery)

b、返回一个值的子查询——使用比较运算符

>ANY

大于子查询结果中的某个值

>ALL

大于子查询结果中的所有值

<ANY

小于子查询结果中的某个值

<ALL

小于子查询结果中的所有值

>=ANY

大于等于子查询结果中的某个值

>=ALL

大于等于子查询结果中的所有值

<=ANY

小于等于子查询结果中的某个值

<=ALL

小于等于子查询结果中的所有值

=ANY  IN 等效

等于子查询结果中的某个值

=ALL

等于子查询结果中的所有值

!=(或<>)ANY

不等于子查询结果中的某个值

!=(或<>) 与 NOT IN 相同

不等于子查询结果中的任何一个值

例题:查询与“叶梓”老师职称相同的教师号、姓名
SELECT TNo,TN
	FROM T
	WHERE Prof= (	SELECT Prof
	       		FROM T
	       		WHERE TN= '叶梓')  

c、返回一组值的子查询——使用ANY或ALL关键字
例题:查询其他系中比计算机系所有教师工资都高的教师的姓名和工资。
SELECT TN, Sal
	FROM T
	WHERE (Sal > ALL (  SELECT Sal	         					FROM T
         			WHERE Dept = '计算机'))
	AND (Dept <> '计算机') 

d、使用exists关键字

查询结果返回‘true’或者‘false’值。若内层子查询的结果非空,则外层的where子句返回真值,否则,返回假值。

语法格式如下:
WHERE [NOT] EXISTS (subquery)
例题:查询没有讲授课程号为C5的教师姓名。
SELECT TN FROM T WHERE
 (NOT EXISTS 
            (SELECT *  FROM TC WHERE TNo = T.TNo  AND CNo = ‘C5’)  
 )

e、集合合并——两个select查询语句通过union关键字连接起来
  • UNION ALL:返回两个输入中所有行的结果集。
  • UNION:剔除UNION ALL中重复的行。
  • Union前后的select语句所查询的列的数量必须一致且对应每列的数据类型也应该一致
例题:分别查询所属类别为“文具”和“电器”的商品编号,商品名称,所属类别,再使用union语句将两条语句的查询结果进行合并。
select spxx.spbh,spxx.spmc,spxx.sslb 
from spxx where sslb='文具' 
union  
select spxx.spbh,spxx.spmc,spxx.sslb from spxx where sslb='电器';

四、数据控制语言(DCL)

数据控制语言(DCL)是用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT、REVOKE等语句,只有拥有该权限的用户才有权利执行数据控制语言。

1.授予权限

SQL语言用GRANT语句向用户授予权限

GRANT语句的一般格式为:

GRANT<权限>[,<权限>] [ON<对象类型><对象名>] 
TO<用户>[,<用户>] [WITH GRANT OPTION]

2.收回权限

向用户授予的权限可以由DBA或者授权者用REVOKE语句收回。

REVOKE的一般语句格式为:
REVOKE <权限>[,<权限>] [ON<对象类型><对象名>]
FROM<用户>[,<用户>]

五、视图(View)

简单来说就是一张能够提高查询效率虚拟表视图只是从一个或几个基本表里导出的表,数据库中只存放视图的定义,其对应的数据不进行存储。当基本表中的数据改变时,通过视图查询出来的数据也会随之变化。因此视图,有利于数据保密,简化查询操作,保证数据的逻辑独立性。

举个例子:

(1)创建视图

 这里用SQL命令创建视图

CREATE [OR REPLACE] VIEW 视图名[(属性清单)]
   AS SELECT语句
[WITH [CASCADED|LOCAL] CHECK OPTION]; 

例题5-1:创建视图v_spxx,主要查询商品信息中所属类别为“文具”的所有商品信息

create view v_spxx as select * from spxx where spxx.sslb='文具';

(2)删除视图

DROP VIEW <视图名>

例题5-2:删除视图v_spxx

DROP VIEW v_spxx

六、索引

1.索引的概念

索引是从数据库中获取数据的最高效方式之一。

索引实际上就是记录的关键字与其相应地址的对应表。在基本表上可以建立一个或多个索引。

只有在select查询语句中当where查询条件或者排序或者查询所涉及到的字段创建了索引,才能使用该索引提高查询速度。

2.索引的作用

数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的行所在的存储位置。

作用是加快查询速度,并保证行的惟一性。

3.索引的分类

普通索引INDEX
唯一性索引UNIQUE
主键索引PRIMARY KEY
全文索引FULLTEXT
复合索引组合索引
空间索引使用参数SPATIAL

4.索引的创建(sql命令)

用CREATE INDEX命令创建索引   

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX <索引名> 
ON <表名> (<列名> [次序] [{,<列名>}] [次序]…)

(1)UNIQUE:建立惟一索引 
(2)FULLTEXT:建立全文索引
(3)SPATIAL:建立空间索引
以上三种都可以不写,代表创建普通索引
(4)次序:ASC(使用到时可省不写)或DESC(使用时必须要书写)。默认为ASC

例题6-1:在spxx(商品信息)表中spmc字段创建名为index_spmc的索引。

create index index_spmc on spxx(spmc);

5.索引的删除(sql命令)

用DROP INDEX命令删除索引   

Drop index index_name on table_name;

(1)ndex_name为需要删除的索引名称
(2)table_name为索引所在的表,
注意:不能删除系统表中的索引

例题6-2:删除spxx(商品信息)表中的index_spmc索引

drop index index_spmc on spxx;

6.索引的查看(sql命令)

SQL中查看表中所有索引的语句语法如下:
show index from table_name [from db_name];

(1)table_name是要查询索引的表名
(2)db_name是数据库名。

例题6-3:查看spxx(商品信息)表中的索引情况。

show index from spxx;

7.使用explain命令查看执行计划 

例题6-4:查询ygxx(员工信息)表中所有的数据,并查看其执行计划,说明查询操作的访问类型且是否使用索引

EXPLAIN SELECT * FROM ygxx;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值