标签:live 系统 执行顺序 知识 ast 过滤 激活 engine 语法
 CHmysql数据库
#如果没有修改my.ini 配置文件的默认字符集,在创建数据库时,指定字符集
    create database db_name character set ‘utf8‘;
#特殊字符(关键字)用反引号
    create database `create`; 
MySQL\data 目录下将自动生成一个对应名称的目录,目录内部有一个db.opt文件
# 显示数据库创建信息
    show create database db_name;
# 删除数据库
    drop database db_name;
 # 进入(使用)数据库
    use database;
# 显示当前打开的数据库
    select database();
# 第二节: MySQL 表结构管理 #
创建数据表
    create tabe 表明(字段 字段类型,......)
MySQL\data目录下的数据库目录中将自动生成一个对应名称的.frm文件
删除数据表
    drop table 表明;
查看数据表
    show tables;
#查看字母是‘abc‘开头的表
    show tables like ‘abc%‘; # %是通配符
查看表创建信息
    show create table 表名;
查看数据表结构
    desc 表名;
###第三节 MySQL 用户管理
登录 
MySQL 是基于C/S架构,必须在客户端通过终端窗口,链接MySQL服务器,进行操作.
    mysql -h host -u user -pc
    Enter password: ******
用户管理
)超级用户root
)修改账号密码, 例:
    ##DOS 命令下修改,将root账号密码修改为 1234
     mysqlladmin -u root password 1234 ## 语句最后不要加分号,否则密码就是‘1234;‘
    ##mysql命令
     set password for ‘root‘@‘localhost‘=password(‘1234‘);
)创建用户
使用create语句进行创建用户,语句格式如下:
    create user ‘username‘@‘host‘identified by ‘password‘;
其中:username 表示要创建的用户名:host表示制定该用户在那个主机上可以登陆,如果是本地用户可用localhost,如果想让改用户可以从任意远程主机登陆,可以使用通配符%;password表示该用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器。例:
    create user ‘zhangsan‘@‘localhost‘ identfied by ‘123456‘;
)删除用户
删除用户使用drop语句,语句格式如下:
    drop user ‘username‘@‘host‘;
##修改配置文件my.ini
字符集
MySQL默认字符集是latin(拉丁),改变为utf8才能正确显示中文
[mysqld]下添加
character-set-server=utf8
init-connect=‘\set NAMES utf8‘;
修改默认引擎
InnoDB 优于MYISAM
default-storage-engine=MYISAM 修改为 default-storage-engine-InnoDB
个性化 mysql 提示符
MySQL默认提示符是"mysql>",可以个性化定制,例如:‘mysql(数据库)>‘
[mysql]下添加
prompt"mysql(\d)>"
#第四节 默认数据库
information_schema
提供了访问数据库元数据的方式。什么是元数据?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述改信息的其他术语包括“数据词典”和“系统目录”。
performance_schema
mysql5.5版本新增了一个性能优化的引擎
mysql
这个是MySQL的核心数据库,主要负责存储数据库的用户、权限设置、关键字等MySQL自己需要使用的控制和管理信息。不可以删除,也不要轻易修改这个数据库里面的表信息。
test
安装时候创建的一个测试用数据库,空数据库,没有任何表,可以删除(新版mysql已取消)。
# 第三章 SQL基本语法 #
##第一节 SQL语句简介
###sql语言
SQL(Stuctured Query Language)是用于访问和处理数据库的标准计算机语言。使用SQL访问和处理数据系统中的数据,这类数据库包括:Oracle,mysql,Sybase,SQLServer,DB2,Access等等。
###基本规范:
1)SQL对大小写不敏感,一般数据库名称、表名称、字段名称全部小写
2) MySQL要求在每条SQL命令的末端使用分号(MS Access 和 SQL Server 2000,则不必再每条SQL 语句之后使用分号)。
###注释
    mysql>select 1+1; #这是一个注释
    mysql>select 1+1; --这个注释直到该行结束
    mysql>select 1 /*这是一个在行中间的注释*/ +1;
    mysql>select 1+
    /*
    这是一个
    多行注释的形式
    */
##第二节 MySQL 基本数据类型
###字段类型
数据类型是指列、存储过程参数、表达式和局部变量的数据特质,它决定了数据的存储方式,代表了不同的信息类型。不同的数据库,数据类型有所不同,MySQL 数据库有一下几种数据类型:
)字符串型
类型       字节    大小                         说明
char       1      0-255字符(2^8)             定长字符串
varchar    2      0-65 535字符(2^16)         变长字符串
tinytext   1      0-255字符(2^8)             短文本(与char存储形式不同)
text       2      0-65 535字符(2^16)         文本
mediumtext 3      0-16 777 215字符(2^24)     中等长度文本
longtext   4      0-4 294 967 295字符(2^32)  极大文本
注意:char和varchar需要指定长度,例如:char(10)
) 整数型
类型           字节    范围(有符号)                                               范围(无符号)                        说明
tinyint         1     (-128,127)                                               (0,255)                            很小整数值
smallint        2     (-32 768,32 767)                                         (0, 65 535)                        小整数值
mediumint       3     (-8 388 608, 8 388 607)                                  (0,16 777 215)                     中整数值
int或integer    4      (-2 147 483 648,2 147 483 647)                          (0,4 294 967 295)                  整数值
bigint          8      (-9 233 372 036 854 775 808,9 233 372 036 854 755 807)  (0, 18 446 744 073 709 551 615)    很大的整数值
很多人喜欢在定义数据时,这样写:
    create table tbl_name(
    age int(10)
    );
int后面()中的数字不代表占用空间容量。而代表最小显示位数。这个东西基本没有意义,除非你对字段指定zerofill。mysql会自动分配长度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)、所以,建议在使用时,就用这些默认的显示长度就可以了。不用再去自己填长度(比如:int(10)、tinyint(1)之类的基本没用)。
) 浮点型
类型             字节        范围                             用途
float(M,D)    4      23bit(约6~7位10进制数字)      单精度浮点数<br/>值绝对能保证精度为6~7位有效数字
double(M,D)   8      52bit(约 15~16位10进制数字)   双精度浮点数值<br/>精度为15~16位有效数字
decimal(M,D)  M+2    依赖于M和D的值                定点型
M(精度),代表总长度(整数位和小数位)限制
D(标度),代表小数位的长度限制
M必须大于等于D
数字的修饰符          功能            说明
unsigned              无符号     非负数
zerofill            签到0      整形前加0(自动添加unsigned)
)日期型
   
类型            字节            范围                                                格式                                      用途
date         3    1000-01-01---9999-12-31                             YYYY-MM-DD                              日期值
time         3    -838:59:59---838:59:59                              HH:MM:SS                           时间值或持续时间
year         1    1901---2155                                           YYYY                                  年份值
datetime     8    1000-01-01 000:00---9999-12-31 23:59:59           YYYY-MM-DDHH:MM:SS                      混合日期和时间值
timestamp    4    1970-01-01 00:00:00/2038结束时间是第2147483647秒,  YYYYMMDDHHMMSS                     时间戳,混合日期和时间值
                  北京时间2038-1-19 11:14:07,
                  格林尼治时间2038年1月19日凌晨03:14:07
 
)列举与枚举
名称          字节          说明
set       1、2、3、4或8    列举:可以取SET列表中的一个或多个元素(多选)
enum          1或2        枚举:可以取ENUM列表中的一个元素(单选)
    create table student(
    int tinyint #微小整形
    name varchar(10), #变长字符
    sex enum (‘m‘,‘w‘), #单选
    birthday date, #日期型
    tel char(11), #定长字符
    city char(1), #城市
    hobby set(‘1‘,‘2‘,‘3‘,‘4‘), #多选
    introduce text #个人介绍
    );
)字段属性
属性                    功能            说明
not null            非空     必须有值,不允许为null
default             默认值   当插入记录没有赋值,自动赋予默认值(允许为null)
primary key         主键     唯一标识一行数据的字段(主键自动为not null)
auto_increment      自动增量  不能单独使用,必须与primary key一起定义
unique(unique key)  唯一      记录不重复(一张表可以有多个unique,允许为null)
##第三节  数据的增、删、改
增删改查(简称:CURD)
###  增
    #方法一
    insert into students(name,age) value (‘张三‘,‘20‘);
    #方法二:省略字段名,字段位要一一对应,不能跳过(auto_increment字段,可以使用null或default)
    insert into students values (null,‘张三‘,‘20‘);
    #方法三:批量增加数据
    insert into students(name,age) values (‘张三‘,‘20‘),(‘李四‘,‘21‘),(‘王五‘,‘22‘);
###删
用delete删除记录,一定要加where条件,否则表数据全部删除!!
    
    delete from 表明 where xx=xxx;
用truncate删除记录,不能加where条件,直接删除全部记录,id索引重新从1开始
    truncate table 表明;
###改
单条修改
update 表名 set xx=xx,xxx=xx where xxx=xxx and xxx=xxx;
    #多条修改
    update students
        set name = case id #id字段
            when 1 then ‘zhangsan‘
            when 2 then ‘lisi‘
            when 3 then ‘wangwu‘
            when 4 then ‘zhaoliu‘
        end,
        city = case id
            when 1 then ‘2‘
            when 2 then ‘4‘
            when 3 then ‘1‘
            when 4 then ‘2‘
        end
    where id in(1,2,3,4);
#第四章 数据的 查
SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(成为结果集)。
##第一节 查询表达式 
    #当前使用的数据库
    select database();
    #查看当前MySQL版本
    select version();
    #查看当前用户
    select user();
    #查看运算结果
    select 1+2;
##第二节 条件表达式 
from 子句 
    #字段用‘,‘隔开,至少有一个字段,最终结果集按照这个这个顺序显示
    select 字段1,字段2...from 表明;
    
    # *代表所有字段
    select * from  表名;
distinct(去重)
    #去重后的结果,distinct必须紧接着select后面
    select distinct 字段 from 表名;
    
    #统计不重复的个数
    select count(distinct 字段) from 表名;
###where 子句
where子句适用于对记录的 删 、改、查操作。
对记录进行过滤,如果没有规定where子句,则显示所有记录。
在where表达式中,可以使用函数或运算符,运算符包括:
类型            运算符
算术            + - * / %
比较            > < >= <= !==
逻辑         or || and && not!
提升优先级    ()
    # 搜索id<20的所有数据
    select * from students where id<20;
    # 搜索id编号为偶数的数据
    select * from studnets where id%2=0;
where 条件关键字
in:查询一个集合的数据
    #搜索id在(1,3,7)之中的数据
    select * from students where id=1||id=3||id=7;
    select * from students where id in(1,3,7);
    
    #一次删除多条记录
    delete from students where id=3||id=15||id=23;
    delete from students where id in(3,15,23);
between...and...:查询一个区间的数据
    #搜索id在 20-40之间的数据
    select * from students where id>20 && id<40;
    select * from students where id between 20 and 40;
    
    #删除id在20-40之间的数据
    delete from students where id between 20 and 40;
not:排除
    #搜索id除了20-40之间的数据
    select * from students where id not between 30 and 40;
###like 子句
用于模糊查询 %: 任意字符长度     _  :一个字符长度
    #搜索name名字以5结尾的数据
    select * from students where name like ‘张%‘;
    #搜索name名字包含字母s的数据
    select * from students where name like ‘%s%‘;
    #搜索id以5结尾的两位数数据
    select * from students where id like ‘_5‘;
###limit子句
控制查询记录条数,数据表中的记录,索引从0开始
    select * from students limit 2 #返回两条记录
    select * from students limit 3,4  #从索引为3的记录开始,返回4条记录
    #php中的分页功能,偏移值的计算:(当前页-1)* 每页记录数
    select name from student limit 4 offset 3
    #还可以使用offset(偏移) : 从索引为3的记录开始,返回4条
###group by (结果分组)
根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表
利用group by 分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析。
select 指定的字段要么作为分组的依据 (Group By语句的后面),要么就要被包含在聚合函数中。
    #简单分组
    select sex from students group by sex;
    #聚合函数分组
    select count(*),city from students group by city;
###order by(结果排序)
按照给定的字段进行排序, asc:升序(默认) desc:降序
如果同时选择多个字段,先按一个字段排序,如果第一个字段值相等,在尝试第二个字段,以此类推
    #默认升序
    select * from students order by birthday;
    #降序
    select * from students order by birthday desc;
###查询语句的书写顺序
select -> 字段 -> from -> 表名 -> where -> group by -> order by -> limit
别名
    select a.name as myname from students as a
    # myname是name字段的别名
    # a是students表的别名
##第三节 多表查询
    select a.name,c.name,b.score from students as a,score as b,course as c where b.user_id=6 and b.courser_id=4 and a.id=b.user_id and c.id=b.course_id;
##表连接
###内连接
JOIN:如果表中有至少一个匹配,则返回行
    select a.*,b.name from students as a [innder] join city as b on a.livecity=b.id;
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
    select a.*,b.name from students as a left join city as b on a.livecity=b.id;
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
    
    select a.*,b.name from students as a right join city as b on a.livecity=b.id;
FULL JOIN: 只要其中一个表中存在匹配,就返回行(mysql不支持)
    #带有连接的分组
    select city.name,count(*) from students,city where students.livecity=city.id group by students.livecity;
###子查询
子查询(subquery)是指出现在其他sql语句内的select子句(嵌套在查询内部,且必须始终出现在圆括号内)
    #查找城市名称是北京的
    #普通查询方式
    select * from students where livecity=1;
    #子查询方式
    select * from students where livecity=(select id from city where name=‘北京‘);
子查询可以包含多个关键字或条件,如:distinct、group by、order by、limit、函数等
子查询的外层可以是:select,insert,update
#第五章 视图与事务
##第一节
视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口。通过它可以看到感兴趣的数据。视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
##创建视图
    CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition;
    #viewname为欲创建的视图名,columnnams(s)为查询的列名,table_name为查询的表名,condition为查询条件。
##修改视图
    
    #ALTER语句:
    ALTER VIEW view_name AS SELECT colunm_name(s) FROM table_name WHERE condition;
    #CREATE OR REPLACE 语句:  
    ALTER VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition;
##删除视图
    DROP view view_name;
    
##查询视图
    SHOW TABLES;
    SHOW TABLE STATUS;
查看某个视图的定义:
    
    SHOW CREATE VIEW view_name;
##第二节 事务
####回滚 
    
    rollback;    
#第六章 索引约束分区
##第一节 索引
索引是帮助MySQL高效获取数据的数据结构
在MySQL中,对于一个Primary Key的列,MySQL已经自动对其建立了Unique和Index。
###创建索引
    create table 表名(
    id int not null,
    username varchar(16) not null,
    index(username(length))    #用username字段作为索引
    );
###显示索引
    
    show index from 表名;
### 删除索引
    alter table 表名 drop index name:
##第二节 约束(constraint)
约束保证数据的完整性和一致性,根据约束的字段数目的多少,约束又分为表级约束和列级约束
列级约束:针对某一字段来使用
表级约束:针对两个或两个以上的字段使用
约束类型包括:
not null(非空约束)
primary key(主键约束)    #为没有主键的表添加主键    alter table 表名 add primary key(字段名);
主键自动为notnull(同时作为表的索引)
unique key(唯一约束)    primary key被自动定义为unique约束。 每个表可以有多个unique,但是每个表只能有一个primary key约束
default(默认约束)  用于约束对应列中的值的默认值
foreign key(外键约束)
字表(具有外键列的表)和父表(子表所参照的表),存储引擎只能为innoDB.
外键列和参照列必须具有相似的数据类型。
    - 如果是数字类型,数字的长度、是否有符号位 必须相同
    - 字符类型的长度则可以不同
外键列和参照列必须创建索引(如果外键列不存在索引的话,MySQL将自动创建索引).
##第三节 删除约束
删除primary key
    alter table 表名 drop primary key;
删除index
    
    alter table 表名 drop index index_name;
删除外键约束
    
    alter table 表名 drop foreign key FK_ID;
##第四节 索引与约束的关系
索引是面向数据库本身的,用于查询优化等操作。约束则更多的是业务上的关系。
通常,创建唯一约束就自动获取唯一索引, 是因为数据库认为对数据库进行唯一检
查时,如果该字段上有索引会很快,所以创建唯一约束就默认创建唯 - -索引。同样,
常见的主键即是唯一性的约束, 也是个索引。但对于not nul这样的约束,数据库
是不会创建索引的。
##第五节 分区
如果一张表的数据量太大, 不仅查找数据的效率低下,而且难以找到一块集中的存储来存放。为了解决这个问题,数据库推出了分区的功能。MySQL 表分区主要有以下四种类型:
RANGE 分区:
RANGE即范围分区,根据区间来判断位于那个分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。
LIST 分区:
LIST 分区类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH分区:
HASH分区基于用户定义的表达式返回值来选择分区,该表达式对要插入到表的行中列值进行Hash计算。
KEY分区:
KEY分区类似HASH,但是HASH允许用户使用自定义表达式,而KEY分区不允许,它需要使用MySQL服务器提供的HASH函数,同时HASH分区只支持整数分区,而KEY分区支持除BLOB和TEXT类型外其他列。
#第七章 存储过程、触发器
##存储过程的创建和调用
    create procedure 存储过程名称(in|out|inout参数名称 参数类型,......)
    begin
    过程体;
    end
实例:
    CREATE PROCEDURE in_users(in in_id int,in in_name char(100),in in_phone varchar(100),in in_address varchar(100))
    begin
        set @id=in_id;
        set @name_=in_name;
        set @phone=in_phone;
        set @address=in_address;
        INSERT into users VALUES (@id,@name_,@phone,@address);
    end
    
    call in_users(1,‘李剑‘,‘15031159880‘,‘石家庄‘);
    
##查询、修改与删除
查询:
查看所有存储过程状态:
    
    SHOW PROCEDURE STATUS;
    SHOW PROCEDURE STATUS WHERE DB=‘数据库名‘;
    SHOW PROCEDURE STATUS WHERE name LIKE ‘%Student%‘; 
查询存储过程详细代码:
    
    SHOW CREATE PROCEDURE 过程名;
修改:
    
    ALTER PROCEDURE 过程名([过程参数[,...]])过程体;
删除:
    DROP PROCEDURE 过程名;
注意:不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。
##调用存储过程
    CALL 存储过程名([过程参数[,...]]);
##第二节 触发器
###创建触发器
    CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name 标识触发器名称,由用户自行制定。
trigger_time 标识触发时机,取值为BEFORE 或 AFTER;
trigger_event 标识触发事件,取值为INSERT、UPDATE DELETE;
tb_name 标识建立触发器的表名,即在哪张表上建立触发器。
FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器。
trigger_stmt 触发器程序体,可以是一句sql语句,<br/>或者用BEGIN和END包含的多条语句,与存储过程类似。
触发事件类型介绍如下:
INSERT型触发 插入某一行时激活触发器,可能通过INSERT、LOAD、DATA、REPLACE 语句触发
UPDATE型触 更改某一行时激活触发器,可能通过UPDATE语句触发
DELETE型触 删除某一行时激活触发器,可能通过DELETE、REPLACE语句触发
实例:
    CREATE trigger tir_stuinsert after insert
    on student for each row
    BEGIN
        declare c int;
        set c=(select stuCount from class where classID=new.classID);
        update class set stuCount=c+1 where calssID = new.classID;
    END
从需求我们可以得知,版内学生数的变化是在插入学生记录之后发生的,所以创建的触发器类型为after insert类型。
##查看触发器
SHOW TRIGGERS;
##删除触发器
DROP TRIGGER [IF EXISTS] trigger_name
##触发器执行顺序
日常开发中创建的数据库通常都是InnoDB数据库,在数据库上建立的表大都是事务性表,也就是事务安全的,这时触发器的执行顺序主要是:
1:如果BEFORE类型的触发器执行失败,SQL无法正确执行。
2:如果SQL执行失败时,AFTER类型的触发器不会触发。
3:如果AFTER类型的触发器执行失败,数据会回滚。
如果是对数据库的非事务表进行操作,当触发器执行顺序中的任何一步执行出错,那么久无法回滚了,数据可能会出错。
#第八章 MYSQL函数
##第一节 运算函数
abs(x):返回x的绝对值
floor(x):返回小于x的最大整数值
round(x,y):返回参数x的四舍五入的有y位小数的值
mod(x,y):返回x/y的模(余数)
greatest(x1,x2,...,xn):返回集合中最大的值
least(x1,x2,...,xn):返回集合中最小的值
##第二节 字符串函数
trim(str):去除字符串首尾两端的空格
upper(str):字符串转大写
concat(s1,s2,...,sn):将s1,s2,...,sn连接成字符串
    #concat
    insert into tb_name value(concat(‘abc‘,‘def‘));
##第三节 日期函数
year(date):返回日期date的年份(1000-9999)
month(date): 返回date的月份值(1~12)
dat(date):返回date的日(1~31)
curdate():返回当前的日期
week(date):返回日期date为一年中第几周(0~53)
now():返回当前的日期和事件
curtime():返回当前的时间
hour(time):返回time的小时值(0~23)
minute(time):返回time的分钟值(0~59)
##第四节 聚合函数
count(col):统计记录的条数
sum(col):求和
avg(col):求平均值
max(col):求最大值
min(col):求最小值
FOUND_ROWS()与count()的区别:
1、当SQL限制条件太多时,count()的执行效率不是很高,最好使用FOUND_ROWS()
2、当SQL查询语句没有where等条件限制时,使用count()函数的执行效率较高。
#第九章 数据库备份
使用Navicat可视化工具导入 导出数据,备份 恢复数据
##第一节 备份数据
mysqldump -u[用户名]-p[密码][数据库名]>[path]/[名称].sql
##第二节 恢复数据
mysql>source c:\system.sql
标签:live 系统 执行顺序 知识 ast 过滤 激活 engine 语法
原文地址:https://www.cnblogs.com/lijian-cn/p/11941201.html