MySQL(Mariadb)总结2 - SQL知识点汇总

  • 开发DBA:
    数据库设计(E-R关系图)、SQL开发、内置函数、存储例程(存储过程和存储函数)、触发器、事件调度器(event scheduler)
  • 管理DBA:
    安装、升级,备份、恢复,用户管理、权限管理,监控、分析、基准测试,语句优化(SQL语句),数据字典,按需要配置服务器(服务器变量:MyISAM, InnoDB, 缓存, 日志)

SQL语言组成部分

DDL:
DML:
完整性定义语言:DDL的一部分功能
主键、外键、惟一键、条件、非空、事务
视图定义:虚表,存储下来的SELECT语句
事务控制:
嵌入式SQL和动态SQL:
DCL:授权

数据类型的功能:

  1. 存储的值类型
  2. 占住的存储空间大小
  3. 定长和变长
  4. 如何被索引及排序
  5. 是否能够被索引

数据字典:

系统编目(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中的大小写区分

  1. SQL关键字及函数名不区分大小写
  2. 数据库、表及数据名称的大小写区分与否取决于底层的OS及FS
  3. 存储过程、存储函数及事件调度器的名字不区分大小写,但是触发器区分
  4. 表别名区分大小写
  5. 对字段中的数据,如果字段数据类型为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表,有两种存储方式

  1. 默认:每表有一个独立文件和一个多表共享的文件
  • tb_name.frm: 表结构的定义,位于数据库目录中;
  • ibdata#: 共享的表空间文件,默认位于数据目录(datadir指向的目录)中;
  1. 独立的表空间:
  • 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 视图名

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容