一、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语句可以实现数据定义、数据操纵、数据查询、数据控制。
其是高级的非过程化编程语言,允许用户在高层数据结构上工作,简单来说就是sql语句的书写顺序不严格要求,同时还可以嵌套写。这使其具有极大的灵活性和强大的功能。
(1)一体化:
类似于英语的自然语言。集数据定义DDL、数据操纵DML和数据控制DCL于一体,可以独立第完成数据库生命周期的全部活动,比如创建数据库、定义关系模式(相当于创一张二维表)、对表数据实行增删改查操作等等。
(2)非过程化:
简单来说就是,用户只需要提出操作要求,计算机便会执行,无需具体列出操作的步骤。
(3)使用方式灵活:
既是自含式语言(sql中有sql),以命令方式交互使用;
又是嵌入式语言(比如在idea中实现数据库与java编程语言的连接)
(4)面向集合的操作方式
(5)语言简洁
(6)具有数据定义、数据操纵、数据查询、数据控制四种功能:
功能 关键字 数 据 查 询 SELECT 数 据 定 义 CREATE,DROP,ALTER 数 据 操 纵 INSERT(增),UPDATE(更新),DELETE(删)
数 据 控 制 GRANT,REVOKE
字符集是一套符号和编码,校验规则(collation)是在字符集内用于比较字符的一套规则,即字符集的排序规则。同时, MySQL服务器可以支持多种字符集,在同一台服务器,同一个数据库,甚至同一个表的不同字段都可以指定使用不同的字符集
Unicode(Universal Code)是一种在计算机上使用的字符编码。
GBK(Chinese Internal Code Specification)是一个汉字编码标准。
第一种: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版本支持的字符集
show variables like 'character%';
图1-2 mysql5.7当前数据库的字符集
(1)information_schema数据库——提供了访问数据库元数据的方式。(元数据是 关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。 有时用于表述该信息的其他术语包括“数据词典”和“系统目录”。)
(2)mysql数据库——是核心数据库,主要负责存储数据库的用户、权限设置、 关键字等mysql自己需要使用的控制和管理信息。比如常用的user表就 是在mysql数据库中。
(3)performance_schema数据库——主要用于收集数据库服务器性能参数。
(4)sys数据库——其所有的数据源来自performance_schema数据库,目标是把数据库performance_schema的复杂度降低,让DBA能更好地阅读 这个数据库里的内容,更快地了解数据库的运行情况。
- 数据定义语言(DDL)定义数据的模式、外模式和内模式三级模式结构;
- 数据定义语言(DDL)定义模式/内模式和外模式/模式二级映像;
- 数据定义语言(DDL)定义有关的约束条件。
其主要提供create(创建)、drop(删除)、alter(修改)等语句。
外模式对应“视图”,模式对应“基本表”,内模式对应“存储文件”
图2-1 SQL语言支持的关系数据库的三级模式结构
如图所示:
创建数据库语句语法: 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;
修改数据库语句语法: ALTER { DATABASE | SCHEMA } database_name [[DEFAULT] CHARACTER SET charset_name] [ [DEFAULT] COLLATE collation_name;
例2-2:修改buyDB数据库的字符集为gbk。
ALTER DATABASE BuyDB CHARACTER SET gbk;
删除数据库语句语法: DROP DATABASE IF EXISTS database_name;
例2-3:删除数据库BuyDB
DROP DATABASE IF EXISTS BuyDB;
整数类型 | bigint,int,smallint,tinyint,mediumint |
浮点数类型 | float和double |
定点数类型 | decimal |
日期时间类型 | date,time,datetime,year和TIMESTAMP |
字符串类型 | 文本字符类型(char和varchar)、可变类型(TEXT和BLOB)和特殊类型(SET和ENUM)。 |
创建基本表的语法语句格式: 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);
在定义基本表的过程中还可以创建列的约束,以此来实现数据的完整性。
完整性约束的基本语法格式(列约束和表约束) [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
要注意:每张表只允许一个字段设置这个约束,同属该字段的数据类型必须是整型
修改表的语句语法格式: 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;
删除表的语句语法格式: DROP TABLE <表名>
例3-5-1:删除S表
drop table s;
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');
①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;
DELETE语句语法格式: DELETE FROM <表名> [WHERE <条件>]
例题2-1-1:删除customer表中编号为'8'的顾客信息
delete from customer where cid='8';
其语法如下所示: truncate table table_name; 注意: truncate 命令是一次性删除表中的所有数据,后面不能加where条件。 数据修改和使用delete语句进行数据删除操作时,如果是对整个表的数据操作可以不写where条件,但一般情况下都需要根据where条件进行数据过滤。
例题2-2-1:情况customer表中所有的数据
truncate table customer;
在SQL 中使用UPDATE语句进行数据的更新: UPDATE语句语法格式: UPDATE <表名> SET <列名>=<表达式> [,<列名>=<表达式>]… [WHERE <条件>]
例题3-1:将customer表中id为'7'的顾客的电话号码更新为'100076',性别更新为'男'。
update customer set cphone='1000076',csex='男' where cid='7';
在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 子句的执行顺序示意图
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;
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;
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-4-1:查询spxx(商品信息表)中所属类别为“日用品”的商品名称,价格及数量,且根据价格进行降序排序,并最终只显示前面两条价格最大的商品信息。
select spmc,jg,sl from spxx where sslb='日用品' ORDER BY jg desc LIMIT 2;
当查询过程中需要涉及到多张表时,此时需要考虑多表查询:连接查询和子查询
多表的连接方式有两种,通常使用第二种去实现多表的查询:
第一种:通过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连接的分类
连接查询默认的连接方式,一般通过关键字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; #连接条件,类型不一样但价格相同的商品
在查询时所用的基表有主从表之分。
①左外连接
左表(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不支持完全外连接。
使用关键字CROSS IN。
一个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 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)是用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT、REVOKE等语句,只有拥有该权限的用户才有权利执行数据控制语言。
SQL语言用GRANT语句向用户授予权限
GRANT语句的一般格式为:
GRANT<权限>[,<权限>] [ON<对象类型><对象名>]
TO<用户>[,<用户>] [WITH GRANT OPTION]
向用户授予的权限可以由DBA或者授权者用REVOKE语句收回。
REVOKE的一般语句格式为:
REVOKE <权限>[,<权限>] [ON<对象类型><对象名>]
FROM<用户>[,<用户>]
简单来说就是一张能够提高查询效率虚拟表。视图只是从一个或几个基本表里导出的表,数据库中只存放视图的定义,其对应的数据不进行存储。当基本表中的数据改变时,通过视图查询出来的数据也会随之变化。因此视图,有利于数据保密,简化查询操作,保证数据的逻辑独立性。
举个例子:
(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
索引是从数据库中获取数据的最高效方式之一。
索引实际上就是记录的关键字与其相应地址的对应表。在基本表上可以建立一个或多个索引。
只有在select查询语句中当where查询条件或者排序或者查询所涉及到的字段创建了索引,才能使用该索引提高查询速度。
数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的行所在的存储位置。
作用是加快查询速度,并保证行的惟一性。
普通索引 | INDEX |
唯一性索引 | UNIQUE |
主键索引 | PRIMARY KEY |
全文索引 | FULLTEXT |
复合索引 | 组合索引 |
空间索引 | 使用参数SPATIAL |
用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);
用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;
SQL中查看表中所有索引的语句语法如下: show index from table_name [from db_name]; (1)table_name是要查询索引的表名 (2)db_name是数据库名。
例题6-3:查看spxx(商品信息)表中的索引情况。
show index from spxx;
例题6-4:查询ygxx(员工信息)表中所有的数据,并查看其执行计划,说明查询操作的访问类型且是否使用索引
EXPLAIN SELECT * FROM ygxx;