MySQL(Mariadb)总结2 - SQL知识点汇总
- 开发DBA:
数据库设计(E-R关系图)、SQL开发、内置函数、存储例程(存储过程和存储函数)、触发器、事件调度器(event scheduler) - 管理DBA:
安装、升级,备份、恢复,用户管理、权限管理,监控、分析、基准测试,语句优化(SQL语句),数据字典,按需要配置服务器(服务器变量:MyISAM, InnoDB, 缓存, 日志)
SQL语言组成部分
DDL:
DML:
完整性定义语言:DDL的一部分功能
主键、外键、惟一键、条件、非空、事务
视图定义:虚表,存储下来的SELECT语句
事务控制:
嵌入式SQL和动态SQL:
DCL:授权
数据类型的功能:
- 存储的值类型
- 占住的存储空间大小
- 定长和变长
- 如何被索引及排序
- 是否能够被索引
数据字典:
系统编目(system catalog)
保存数据库服务器上的元数据(表名,表的属性等)
元数据:
- 关系的名字
- 每个关系的各字段的名字
- 各字段的数据类型和长度
- 约束
- 每个关系上的视图的名字及视图的定义
- 授权用户的名字
- 用户的授权和账号信息
- 统计类数据
- 每个关系字段的个数
- 每个关系中的行数
- 每个关系的存储方法
保存元数据的数据库:
- mysql
- information_schema
- performance_schema(虚库)
Developing With MySQL
数据类型
- 字符型
- char
- varchar
- binary
- varbinary
- text
- blob
- 数值型
- 精确数值型
- 整型
- 十进制数据:decimal
- 近似数据型
- 单精度浮点型
- 双精度浮点型
- 精确数值型
- 日期时间型
- 日期型
- 时间型
- 日期时间型
- 时间戳
- 布尔型
- 内建类型
- Enum
- Set
数值类型
-
TINYINT
-
SMALLINT
-
MEDIUMINT
-
INT
-
BIGINT
-
DECIMAL
-
FLOAT
-
DOUBAL
-
BIT
字符型:
-
CHAR
-
VARCHAR
-
TINYTEXT
-
TEXT
-
MEDIUMTEXT
-
LONGTEXT
-
BINARY
-
VARBINARY
-
TINYBLOB
-
BLOB
-
MEDIUMBLOB
-
LONGBLOB
-
ENUM
-
SET
日期时间型:
- DATE
- TIME
- DATETIME
- TIMESTAMP
- YEAR
字符型常用字段修饰符
NOT NUll
NULL
DEFAULT [string]
不适用于TEXT类型
CHARACTER SET [字符集]
- 查询当前使用的字符集 show VARIABLES LIKE '%char%'
- 查询支持的字符集 shwo CHARACTER SET
COLLATION '规则'
排序规则
- 查看排序规则 show COLLATION
AUTO_INCREMENT
自动增长,非空,且唯一,支持索引,非负
UNSIGNED
无符号
SQL模式SQL_MODE
mysql模式有TRADITIONAL,STRICT_TRANS_TABLES,STRICT_ALL_TABLES
设定服务器变量值:(仅用于支持动态的变量)
支持修改的服务器变量:
- 动态变量: 可以MySQL运行时修改
- 静态变量: 于配置文件中修改其值,并重启后方能生效
服务器变量从其作用范围来讲,有两类:
- 全局变量:服务器级别,修改之后仅对新建的会话生效
- 会话级别: 会话级别, 仅对当前会话有效
查看服务器变量:
show [{GLOBAL|SESSION}] VARIABLES [LIKE ''];
select @@{GLOBAL|SESSION}.VARIABLE_NAME;
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';
SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';
修改服务器变量
前提:仅管理员有权限修改全局变量
SET {GLOBAL|SESSION} VARIABLE_NAME=VALUE;
注意:无论是全局还是会话级别的动态变量修改,在从其mysqld后都会失效;想永久生效,只能在配置文件[mysqld]中定义。
Mysql中的大小写区分
- SQL关键字及函数名不区分大小写
- 数据库、表及数据名称的大小写区分与否取决于底层的OS及FS
- 存储过程、存储函数及事件调度器的名字不区分大小写,但是触发器区分
- 表别名区分大小写
- 对字段中的数据,如果字段数据类型为Binary类型,则区分大小写,非Binary不区分大小写
DDL语句
数据库操作(mysql里database和schema没有区别)
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE='']
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
ALTER {DATABASE|SCHEMA} db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE='']
表操作
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
(create_definition,...):
字段的定义:字段名、类型和类型修饰符
键、约束或索引:
PRIMARY KEY, UNIQUE KEY, FOREIGN KEY, CHECK
{INDEX|KEY}
[table_options]
ENGINE [=] engine_name
mysql> SHOW ENGINES;
AUTO_INCREMENT [=] value
[DEFAULT] CHARACTER SET [=] charset_name
[DEFAULT] COLLATE [=] collation_name
COMMENT [=] 'string'
DELAY_KEY_WRITE [=] {0 | 1}
ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name # 复制表数据,这种方式的表的属性将会丢失
[(create_definition,...)]
[table_options]
select_statement
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name # 复制表结构
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
RENAME [TO|AS] new_tbl_name #改表名
CONVERT TO CHARACTER SET charset_name [COLLATE collation_name] #修改字符集或者排序
MyISAM表,每表有三个文件,都位于数据库目录中:
- tb_name.frm: 表结构定义
- tb_name.MYD: 数据文件
- tb_name.MYI: 索引文件
InnoDB表,有两种存储方式
- 默认:每表有一个独立文件和一个多表共享的文件
- tb_name.frm: 表结构的定义,位于数据库目录中;
- ibdata#: 共享的表空间文件,默认位于数据目录(datadir指向的目录)中;
- 独立的表空间:
- tb_name.frm: 每表有一个表结构文件
- tb_name.ibd: 一个独有的表空间文件
练习题:
新建如下表(包括结构和内容):
ID Name Age Gender Course
1 Ling Huchong 24 Male Hamogong
2 Huang Rong 19 Female Chilian Shenzhang
3 Lu Wushaung 18 Female Jiuyang Shenggong
4 Zhu Ziliu 52 Male Pixie Jianfa
5 Chen Jialuo 22 Male Xianglong Shiba Zhang
6 Ou Yangfeng 70 Male Shenxiang Bannuo Gong
1、新增字段:
Class 字段定义自行选择;放置于Name字段后;
2、将ID字段名称修改为TID;
3、将Age字段放置最后;
DML语句
SELECT语句的执行流程:
FROM clause --> WHERE clause --> GROUP BY --> HAVING clause --> ORDER BY ... --> SELECT --> LIMIT
SELECT语句:
DISTINCT:指定的结果相同的只显示一次;
SQL_CACHE:缓存于查询缓存中;
SQL_NO_CACHE:不缓存查询结果;
MySQL的查询操作:
- 单表查询:简单查询
- 多表查询: 连续查询
- 联合查询:
选择和投影:
- 投影: 挑选要显示的字段
select 字段1,字段2,... FROM tb_name;
- 选择:挑选符合条件的行
SELECT 字段1,... FROM tb_name WHERE 子句;
布尔条件表达式操作符:
=
<=>
<>
<
<=
>
>=
IS NULL
IS NOT NULL
LIKE: 支持的通配符: %(任意长度的任意字符), _(任意单个字符)
RLIKE, REGEXP: 支持使用正则表达式
IN: 判断指定字段的值是否在给定在列表中;
BETWEEN ... AND ...: 位于指定的范围之间
组合条件测试:
NOT, !
AND, &&
OR, ||
聚合函数:
SUM(), AVG(), MAX(), MIN(), COUNT()
练习:导入hellodb.sql,以下操作在students表上执行
1、以ClassID分组,显示每班的同学的人数;
2、以Gender分组,显示其年龄之和;
3、以ClassID分组,显示其平均年龄大于25的班级;
4、以Gender分组,显示各组中年龄大于25的学员的年龄之和;
多表查询及子句查询
联接查询:事先将两张或多张表join,根据join的结果进行查询;
cross join: 交叉联结
(a+b)(c+d+e)=
自然联结:
等值联结
条件比较
外联结:
左外联结:只保留出现在左外连接运算之前(左边)的关系中的元组;
left_tb LEFT JOIN right_tb ON 连接条件
右外联结:只保留出现在右外连接运算之后(右边)的关系中的元组;
left_tb RIGHT JOIN right_tb ON 连接条件
全外联结
自联结:
别名:
表别名
字段别名
练习:导入hellodb.sql,完成以下题目:
1、显示前5位同学的姓名、课程及成绩;
2、显示其成绩高于80的同学的名称及课程;
3、求前8位同学每位同学自己两门课的平均成绩,并按降序排列;
4、显示每门课程课程名称及学习了这门课的同学的个数;
思考:
1、如何显示其年龄大于平均年龄的同学的名字?
2、如何显示其学习的课程为第1、2,4或第7门课的同学的名字?
3、如何显示其成员数最少为3个的班级的同学中年龄大于同班同学平均年龄的同学?
4、统计各班级中年龄大于全校同学平均年龄的同学。
子查询
在查询中嵌套的查询
用于WHERE中的子查询
1、用于比较表达式中的子查询
子查询的返回值只能有一个;
2、用于EXISTS中的子查询
判断存在与否
3、用于IN中的子查询;
判断存在于指定列表中
用于FROM中子查询:
SELECT alias.col,... FROM (SELECT clause) AS alias WHERE condition
MySQL不擅长于子查询:应该避免使用子查询;
总结:MySQL的联结查询及子查询
联结:
交叉联结
内联结
外联结
左外
右外
自联结
子查询:
用于WHERE中的子查询
用于条件比较:子查询只能一个值
用于IN:子查询可以返回多个值
EXISTS:子查询可以返回多个值
用于FROM子句的子查询
MYSQL视图(虚表)
存储下来的select语句
创建:
create view 视图名 as select语句
删除:
drop view 视图名