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

2017-11-10  本文已影响38人  drfung

SQL语言组成部分

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

数据类型的功能:

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

数据字典:

系统编目(system catalog)
保存数据库服务器上的元数据(表名,表的属性等)

元数据:

保存元数据的数据库:

Developing With MySQL

数据类型

数值类型

字符型:

日期时间型:

字符型常用字段修饰符

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

设定服务器变量值:(仅用于支持动态的变量)

支持修改的服务器变量:

服务器变量从其作用范围来讲,有两类:

查看服务器变量:

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表,每表有三个文件,都位于数据库目录中:

InnoDB表,有两种存储方式

  1. 默认:每表有一个独立文件和一个多表共享的文件
  1. 独立的表空间:
练习题:

新建如下表(包括结构和内容):

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的查询操作:

选择和投影:

布尔条件表达式操作符:

=
<=>
<>
<
<=
>
>=

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 视图名

上一篇下一篇

猜你喜欢

热点阅读