2:MySQL-SQL语句

- SQL变量
基于会话的变量,全局的变量
设置变量值
set variable_name = value
set global variable_name = value
访问变量值
@@session.variable_name
@@global.variable_name
- 标识符
variable_name
'variable_name'
- Unix上
数据库名,表名一般区分大小写
触发器名字区分大小写
一般对其采取统一大大写/小写,
来避免产生
在Unix下用字符相同大小写不同表示的不同对象,
而在window下,这些又代表同一对象的情况.
- 字符集
1.支持多种字符集
2.一个给定的字符集可有一种或多种排序规则
3.可分别在
服务器,数据库,表,列,字符串常量层次指定字符集
create database时,可设置数据库的字符集
alter database可更改数据库的字符集
create table/alter table可设置表和列的字符集
字符串常量的字符集可用上下文或显式指定
charset()返回某个给定值的字符集
- 字符集和排序规则要匹配
character set charset_name
collate collation_name

- 数据库的选择,创建,删除,更改
use db_name;
create database [if not exists] db_name
[charset set charset_name] [collate collataionname]

show create database xxx;

drop database db_name;

alter database [db_name] [charset set charset_name] [collate collataionname]
一个数据库就是MySQL数据目录里的一个目录,
这个目录主要用于存放对象.

- 表的创建,删除,索引和更改
Innodb		支持外键,支持事务
MyISAM		一般用于非事务

每次创建表时,
MySQL会创建一个磁盘文件[xxx.frm],
用于保存该表的格式[表的定义].
文件放于表所属数据库对应的目录下.
对innodb还在该目录下放与表关联的xxx.idb文件,
以存储表的数据,索引
对myisam还在该目录下方xxx.myd和xxx.myi文件,
以分别存储表的数据,索引
默认下,innodb会把表的数据,索引存在它的系统表空间里.
[共享存储区域].
设置为表创建单独表空间时[innodb_file_per_table],
才会创建和表关联的xxx.ibd文件.

innodb
支持事务[提交,回滚,保存点创建,回滚到保存点]
崩溃后恢复
外键支持,级联删除和更新
基于行级别的锁定和多版本化
全文搜索,FULLTEXT索引
	
myisam
支持全文检索和FULLTEXT索引
支持空间数据类型和SPATIAL索引

- 创建表
create table [if not exist] xxx
(
	1
	...
) ...2;

show create table xxx;
alter table xxx;
drop table [is exists]
1.指定表的存储引擎
在2部分
engine = xxx
2.临时表
创建一个表,在会话正常/异常结束时自动删除该表
临时表会隐藏数据库下同名的永久表.
多个客户会话下同名临时表,不会有名字冲突.
使用连接池/永久连接,若客户与服务器会话结束,
但连接仍未关闭,temporary表可能保持存在
显式删除临时表用drop temporary table
create temporary table tbl_name xxx;
3.基于已经存在表创建新表
create table xxx like yyy;
基于yyy表的属性建立xxx的属性
创建出的是空表

此后基于yyy内容填充xxx内容可用
insert into xxx select * from yyy.
[新表的列名依据select给出的项的文本表达得到,
一些特殊列表显示指出时可能要用'xxx_name'形式,
也可通过对select中项用as设置一个合适的别名]

cast用于类型转换,as用于别名
4.分区表
举例
create table log_partition
(
	dt datetime not null,
	info varchar(100) not null,
	index (dt)
)
partition by range(year(dt))
(
	partition p0 values less than (2010),
	partition p1 values less than (2011),
	partition p2 values less than (2012),
	partition pmax values less than (maxvalue),
);
- 删除表
drop [temporary] table [if exists] tbl_name;
- 索引
1.可对单列,多列建立索引
2.一个表可有多个关联索引
对除enum,set外的字符串类型,可对列的前缀创建索引

索引类型
1.唯一索引,非唯一索引
2.FULLTEXT索引
创建表时指定索引
用alter修改表,增加,删除,更新索引
alter table tbl_name add index index_name(index_columns);
alter table tbl_name add unique index_name(index_columns);
alter table tbl_name add primary key(index_columns);
alter table tbl_name add fulltext index_name(index_columns);
alter table tbl_name add spatial index_name(index_columns);
primary key或spatial指定的索引列必须not null
一个表只能有一个指定为primary key的索引
可有多个unique修饰的索引
unique索引中可包含多个null值
[null被认为和非null及null本身比较时均不相等]

除primary key,其余索引基本也可用create index添加
create index index_name on tbl_name(index_columns)
create unique index index_name on tbl_name(index_columns)
create fulltext index index_name on tbl_name(index_columns)
create spatial index index_name on tbl_name(index_columns)

在create table时指定索引
create table tbl_name
(
	...
	index index_name (index_columns),
	unique index_name (index_columns),
	primary key (index_columns),
	fulltext index_name (index_columns),
	spatial index_name (index_columns),
	...
);

前缀索引举例
create table addresslist
(
	name char(30) not null,
	address binary(60) not null,
	index (name(10)),
	index (address(15))
);
对二进制串,针对前n个字节
对非二进制类型,针对前n个字符

对BLOB或TEXT列,只能创建前缀型索引
索引行长度为构建此索引的各列的索引部分长度和
FULLTEXT不支持前缀索引
- 删除索引
drop index index_name on tbl_name;
drop index 'primary' on tbl_name // 删除primary key索引
- 更改表的结构
1.更改列的数据类型
change/modify
alter table mytbl modify i mediumint unsigned;
alter table mytbl change i new_i mediumint unsigned;
修改的数据类型后,还可指定列的字符集等属性
2.修改表的存储引擎
alter table tbl_name engine = engine_name;
3.重命名表
alter table tbl_name rename to new_tbl_name;
借助重命名还可完成表在数据库间的转移
alter table sampdb.t rename to test.t; // 将表t从sampdb转移到t

- 获取数据库元数据
1.show
show databases/tables
show create database/table xxx_name;
show index from tbl_name
show columns from tbl_name;
show table status from db_name
2.information_schema
- 表的连接
1.JOIN
A JOIN B
A INNER JOIN B
A CROSS JOIN B
A , B
效果等价
FROM 表的连接
[ON 过滤条件1]
[where 过滤条件2]

A LEFT JOIN B
对A中每个元组分解和B中元组结合产生一个新的元组,如新的元组满足过滤条件则加入过滤后结果元组.若A中某个元组,与B中所有元组结合产生的元组都不符合过滤条件,产生一个左边为A中此元组,右边B中各个列均取NULL值结合而产生的元组.放入过滤后的结果元组.
NATURAL [LEFT/RIGHT] JOIN NATURAL会附加一个两个表中同名列取值相等的过滤条件
2.可使用子查询产生多表连接+过滤的效果
标量子查询返回一个值
列子查询返回一个或多个值构成的列
行子查询返回一个或多个值构成的行
表子查询返回由一个或多个行构成的表.行由一个或多个列构成

子查询结果测试
对标量子查询,可用=或<之类的关系比较运算符
对返回结果集的子查询,可用IN和NOT IN测试包含,也可用ALL, ANY, SOME把给定值与结果集比较,可用EXISTS和NOT EXISTS来测试结果集是否为空.
子查询中可以引用和依赖外层查询里的值.

行构造和比较举例:
SELECT last_name
FROM persident
WHERE (city,state) = 
(
SELECT city, state
FROM president
WHERE last_name='Adams' AND first_name='John'
);

对返回结果集的子查询,可综合使用 关系比较运算符+ ALL/ANY/SOME
SELECT last_name
FROM president
WHERE birth <= ALL (SELECT birth FROM president)

对返回结果集的子查询,
可用EXISTS和NOT EXISTS来判断结果集是否为有值,空集.
多个层次的查询下,先执行外层.
针对外层的每个元组执行一次子查询.可能会导致较低的执行效率.
对SELECT选出的多个结果集,
若结果集中每行的列数及其类型相互兼容,
可对结果集用UNION进行集合的两两合并.

- 多表删除和更新
DELETE FROM t WHERE id > 100;

对表t1执行删除,但删除条件需要其他表的参与
DELETE t1 
FROM t1 INNER JOIN t2 ON t1.id = t2.id;
等价于
DELETE FROM t1
USING  t1 INNER JOIN t2 ON t1.id = t2.id;
对t1每个元组进行测试,若此元组在t1中有一个元组与其结合满足ON中过滤条件,则在t1中删除此元组.

DELETE t1, t2 
FROM t1 INNER JOIN t2 ON t1.id = t2.id;
等价于
DELETE FROM t1, t2
USING t1 INNER JOIN t2 ON t1.id = t2.id;
FROM得到的是一个结果集.

UPDATE举例
UPDATE score 
SET score = score+1
WHERE event_id IN [1,2,3];

UPDATE score, grade_event 
SET score.score = score.score+1
WHERE score.event_id = grade_event.event_id;

- 事务处理
提交
回滚/部分回滚
保存点

事务的特性
1.原子性
要么全部执行,要么不执行
2.一致性
数据库在事务执行前,执行后都必须一致
3.独立性
并发执行多个事务时,可得到和串行执行一样的效果
4.持久性
提交后,影响写入数据库,不丢失.

默认下,MYSQL运行模式为自动提交.
每条语句的更改会立刻提交到数据库,永久保留.
START TRANSACTION/BEGIN;   // 关闭自动提交特性
xxx
xxx
xxx
COMMIT/ROLLBACK; // 恢复提交特性为START TRANSACTION执行前

也可通过
SET autocommit = 0/1; 来开启事务.自动提交被禁用时,
被禁用时,到后面开启自动提交或显式COMMIT/ROLLBACK中间的语句序列构成一个事务序列.

用来创建,更改,删除数据库或其中的对象的数据定义语言语句,
及与锁定有关的语句不能成为事务的一部分.
如,
在事务处理过程中调了以下语句的任何一条,
则服务器在执行这条语句前将先提交当前事务
ALTER TABLE
CREATE INDEX
DROP DATABASE
DROP INDEX
DROP TABLE
LOCK TABLES
RENAME TABLE
SET autocommit = 1 (if not already set to 1)
TRUNCATE TABLE
UNLOCK TABLE (if tables currently are locked)
如事务被提交前,意外中断,会导致事务结束.
服务器会自动回滚该客户尚未完成的事务.
	
SAVAPOINT xxx;
ROLLBACK TO SAVEPOINT xxx;
- 事务隔离
1.脏读
事务A修改了数据X尚未提交
事务B此时访问X,访问的是A已经修改,尚未提交的版本
2.不可重复读
事务A执行表T上的SELECT
事务B修改表T且提交
事务A对表T再次执行同样的SELECT,但此次结果和上次不同
3.幻影行
事务A执行表T上的SELECT
事务B修改表T且提交
事务A对表T再次执行同样的SELECT,
但此次结果和上次不同.且此次结果中出现了上次未出现的新项.

MYSQL的多种隔离级别
1.READ UNCOMMITTED
事务A修改了X但尚未提交
事务B访问X,事务B访问的是A已经修改尚未提交的版本
2.READ COMMITTED
事务A修改了X
事务B访问X,
若A已经提交事务B看到A已经提交的版本.
若A未提交,事务B看到A修改前版本
3.REPEATABLE READ
事务A执行SELECT
其他事务执行
事务A再次执行同样的SELECT
事务A两次SELECT得到同样结果
4.SERIALIZABLE
若事务A在进行,
则事务A访问或更新的所有数据项,
其他事务都无权访问.
只能等待A结束后,再访问.

默认的隔离级别为REPEATABLE READ
显式设置:
SET GLOBAL TRANSACTION ISOLATION LEVEL level;
SET SESSION TRANSACTION ISOLATION LEVEL level;
SET TRANSACTION ISOLATION LEVEL level;// 只对下一事务有效

- 外键
提供参照完整性
用于实现级联删除,级联更新
[CONSTRAINT constraint_name]
FOREIGN KEY [fk_name] (index_columns)
REFERENCES tbl_name (index_columns)
[ON DELETE action]
[ON UPDATE action]

ON DELETE子句
1.未定义时,默认行为为 拒绝从父表中删除仍被子表行所引用的行
2.ON DELETE CASCADE,删除父表中行时,自动删除参照此行的子表中的行.
3.ON DELETE SET NULL,删除父表中行时,参照此行子表中对应行的对应列设为NULL.
子表该列也需要允许设为NULL
ON UPDATE子句
对子表,若对子表中某行某个外部引用列修改或插入新的行,外部引用列的新值也要满足参照完整性.对父表中某个被引用的值的更新不被允许/允许但同步更新引用此值的表的相应行相应列的值为新值./允许但同步更新引用此值的表的相应行相应列的值为NULL

对被引用列应该定义此列的索引
对外部参考的列,应该定义此列或包含此列的索引
外键索引不应为前缀索引

- UNICODE索引
对UNICODE索引的列,出现多个NULL值的列是允许的

- FULLTEXT搜索
类型
1.自然语言搜索
把搜索字符串解析成一系列单词,再搜索
2.布尔模式搜索
搜索字符串可包含修饰符
3.查询扩展搜索

全文搜索基于FULLTEXT索引,
FULLTEXT索引只针对CHAR, VARCHAR, TEXT几种类型的列
至少一半行都出现的词被忽略
内建的常用单词,如the, after,...被称为停用词,
在进行全文搜索时会被忽略掉
太短的单词也会被忽略
单词定义为由字母,数字,撇号,下划线构成的字符序列
通常只要在某个行里找到了搜索字符串里的某个单词,
则FULLTEXT引擎便会认为这个行与搜索字符串匹配.
可为单个列或多个列建立FULLTEXT索引.
全文搜索时给出的列列表必须和某个FULLTEXT索引所匹配的那些列精确匹配

举例:
CREATE TABLE apothegm 
(
	attribution VARCHAR(40),
	phrase TEXT
)
ENGINE = MyISAM;
LOAD DATA LOCAL INFILE 'apothegm.txt' INTO TABLE apothegm;
ALTER TABLE apothegm
	ADD FULLTEXT (phrase),
	ADD FULLTEXT (attribution),
	ADD FULLTEXT (phrase, attribution);

SELECT * 
FROM apothegm 
WHERE MATCH(attribution) AGAINST('roosevelt');
对表中每个元组执行MATCH(attribution) AGAINST('roosevelt'),
返回的结果是一个float类型的值
默认的搜索模式是自然语言模式.
也可显式指定
SELECT *
FROM apothegm 
WHERE MATCH(phrase) AGAINST('hard soft' IN NATURAL LANGUAGE MODE);
- 布尔模式的全文搜索
布尔模式的全文搜索,可获得对多单词搜索的更多控制
要完成此类型搜索,需在AGAINST()搜索字符串后添加IN BOOLEAN MODE
1.50%规则不再适用
2.查询结果不再按相关程度排序
3.搜索可要求短语里的所有单词都必须按某种特定的顺序出现.
'"xxxx"'可将xxx部分作为短语而非拆分后的多个单词进行匹配
4.可对未包含在FULLTEXT索引里的列执行布尔模式的全文搜索
5.停用词仍然保持被忽略
布尔模式搜索下,可为搜索字符串里的单词加一些修饰符.
单词前加+,表该单词必须出现在匹配行.
单词前加-,表该单词不能出现在匹配行.
单词尾加*,表以此单词为前缀的所有单词均能匹配
- 扩展全文搜索
1.第一阶段按自然语言搜索搜索
2.相关程度高的行里的单词会与原来的搜索单词一起,
完成第二阶段的搜索
WITH QUERY EXPANSION

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/110846201
今日推荐