MySQL有内置的SQL模型SQL_MODE:用来定义字符超出的操作和模仿别的数据库的类型,通过修改全局变量 常用的模式有: TRADITIONAL 使用传统模式 STRICT_TRANS_TABLES 仅对支持事务的表的严格模式 STRICT_ALL_TABLES 对所有表使用严格模式 设定服务器变量的值:通常仅用于支持动态的变量 支持修改的服务器变量 动态变量:可以在MySQL运行时修改 静态变量:与配置文件中修改其值,并重启后方能生效 服务器变量从其生效范围来讲,分两类 全局变量:服务器级别,修改之后仅对新建立的会话生效 回话变量:会话级别,仅对当前会话有效 会话建立时,从全局继承各变量 查看服务器变量 mysql> show [{global|session}] variables [like '']; mysql> select @@{globa|session}.variable_name mysql> mysql> select * from information_schema.GLOBAL_VARIABLES where VARIABLE_NAME='SOME_VARIABLE_NAME'; 查看全局变量 mysql> mysql> select * from information_schema.SESSION_VARIABLES where VARIABLE_NAME='SOME_VARIABLE_NAME'; 查看会话变量 修改变量: 前提:默认仅管理员有权限修改全局变量 mysql> set {global|session} variable_name='value'; 注意:无论是全局还是会话级别的动态变量修改,在重启mysql后都会失效,想永久有效,可以定义在配置文件中的响应段中[mysqld] 数据库: 创建数据库 create database CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET [=] charset_name 字符集 | [DEFAULT] COLLATE [=] collation_name 排序方式] 删除数据库 DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 修改数据库的字符集和排序字符以及数据字典 ALTER {DATABASE | SCHEMA} [db_name] [[DEFAULT] CHARACTER SET [=] charset_name 字符集 | [DEFAULT] COLLATE [=] collation_name 排序方式] ALTER {DATABASE | SCHEMA} db_name UPGRADE DATA DIRECTORY NAME 表: 创建表:第一种方式 CREATE [TEMPORARY(临时表,保存在内存中)] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options] (create_definition,...) 字段的定义:字段名、类型和类型修饰符 键、索引和约束 primary key,unique key,foreign key,check {index|key} [table_options] engine [=] engine_name AUTO_INCREMENT [=] value 指定AUTO_INCREMENT的起始值 [DEFAULT] CHARACTER SET [=] charset_name 指定默认字符集 CHECKSUM [=] {0 | 1} 是否使用校验值 [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}] 表空间 myISAM引擎,每表有三个文件,都位于数据库目录 tb_name.frm:表结构定义 tb_name.MYD:数据文件 tb_name.MYI:索引文件 InnoDB表,有两种存储方式 1、默认,每表有一个独立文件和一个多表共享的文件 tb_name.frm:表结构的定义,位于数据库目录中 ibdata#:共享的表空间文件,默认位于数据目录(datadir指向的目录中) 2、独立的表空间 tb_name.frm每表有一个表结构文件 tb_name.ibd:一个独有的表空间文件 应该修改innodb_file_per_table为ON 表创建:第二种方式(复制表数据) 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) } 查看表的状态信息 show table status like ‘table_name’ 删除表 DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] 修改表: ALTER TABLE tbl_name [alter_specification [, alter_specification] ...] 修改字段定义: 插入新字段: ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ] 删除字段 DROP [COLUMN] col_name 修改字段 修改字段名称 CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name] 修改字段类型及属性等 MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name] 表改名: rename to|as new tb_name 修改存储引擎 engine = 指定排序标准的字段 ORDER BY col_name [, col_name] ... MySQL的查询操作 单表查询:简单查询 多表查询:连续查询 联合查询 选择和投影 投影:挑选要符合的字段 选择:挑选符合条件的行 投影:select 字段1,字段2,... from tb_name selcet * from tb_name 选择:select 字段1,字段2,.... from tb_name where 子句 布尔条件表达式 布尔条件表达式操作符 = 等值比较 <=>:跟空值比较不会产生额外信息 <>:不等值 <: <= > >= IS NULL:是否为空 IS NOT NULL:是否不空 LIKE:支持的通配符%(任意长度的任意字符) _(任意单个字符) RLIKE,REGEXP:支持使用正则表达式作为条件 IN:判断某行的某一字段的值是否在给定的列表中 BETWEEN...AND....:判断指定的值是否位于指定的范围之间 组合条件测试 NOT | AND && OR || 排序 order by ‘排序字段’ 默认为升序:ASC 降序:DESC 内置的聚合函数 sum():和 AVG():平均值 MAX():最大值 MIN():最小值 COUNT():个数统计 分组 group by 对分组的条件过滤 having 只返回有用的行 LIMIT 一个数为显示的行数 两个数字为偏移第一个数字行,显示第二个数字 select语句的执行流程 from clause --> where clause --> group by --> having clause -->order by --> select -->limit select语句 distinct 重复的只显示一次 SQL_CACHE 缓存查询结果 SQL_NO_CACHE 不缓存查询结果 MySQL多表查询和子查询 联结查询:事先将两张或者多张表join,根据join的结果进行查询 cross join:交叉联结 自然联结 等值联结:把相同的字段进行等值连接 外联结: 左外联接:只保留出现在左外连接元算之前(左边)的关系中的元组(以左表为准,) left_tb LEFT JOIN right_tb ON 条件 右外联接:只保留出现在右外连接元算之后(右边)的关系中的元组(以右表为准) left_tb RIGHT JOIN right_tb ON 条件 全外联接: 自联结: 别名:AS 表别名: 字段别名 子查询:在查询中嵌套的查询 用于WHERE中的子查询 1.用于比较表达式中的子查询 子查询的返回值只能有一个 2.用于EXISTS中的子查询 判断存在与否 3.用于IN中的子查询 判断存在于指定列表中 用于FROM中子查询 select alias.col,....FROM(SELECT CLUSE) alias WHERE condition MYSQL不擅长于子查询,应该避免使用子查询 总结:mysql的连接查询与子查询 联结: 交叉联结: 内联结: 外联结: 左外 右外 自联结 子查询: 用于where中的子查询 用于条件比较: 用于exists 用于IN中 用于FROM MYSQL的联合查询: 把两个或多个查询语句的结果合并成一个结果进行输出 select clauase union select clause union..... 索引 show indexs from tb_name 查看索引 alter table tb_name add index(字段) 创建索引 explain 解释命令,查看命令的执行过程 MYSQL视图(虚表) 存储下来的select语句 创建: create view 视图名 as select语句 删除: drop view 视图名