时间:2021-07-01 10:21:17 帮助过:4人阅读
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
1+x mysql知识
标签:live 系统 执行顺序 知识 ast 过滤 激活 engine 语法