My Little World

MySQL的基本知识

五个基本单位

数据库服务器:指用来运行数据库服务的一台电脑
数据库:一个数据库服务器里面有可以有多个数据库。主要用来分类使用。
数据表:专门用来区分一个数据库中的不同数据
数据字段:也叫数据列,日常所见表格里面的列
数据行:真正的数据存在每一个表的行里面

语句类别

1.数据定义语言(DDL ,Data Defintion Language)语句:数据定义语句,用于定义不同的数据段、数据库、表、列、索引等。常用的语句关键字包括create、drop、alter等。
2.数据操作语言(DML , Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据的完整性。常用的语句关键字主要包括insert、delete、update和select等。
3.数据控制语言(DCL, Data Control Language)
语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。
这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。

操作语句

create database 数据库名; 创建数据库
show databases; 查看当前服务器有哪些数据库,显示所有数据库名
use 数据库名; 选中数据库,进入到相应的数据库中
show tables; 显示当前数据库下的所有表
drop database 数据库名; 删除数据库
create table 表名(字段名1 字段类型,….字段名n 字段类型n); 建表
desc 表名; 查看表结构,显示表中属性

show create table 表名 \G;
查看表的创建语句,“\G”选项的含义是使得记录能够按照字段竖着排列,对于内 容比较长的记录更易于显示。
可以看到表的 engine(存储引擎) 和 charset(字符集)等信息
在创建表的时候能够制定引擎

CREATE TABLE emp (
useraname varchar(10) DEFAULT NULL,
password date DEFAULT NULL,
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

drop table 表名; 删除表
alter table 表名 modify 字段名 类型字段; 修改表字段类型
alter table 表名 add column 字段名 类型; 增加表字段
alter table 表名 add 字段名2 字段类型 after 字段名1; 在字段名1后面增加字段名1
alter table 表名 add 字段名2 字段类型 first; 在最开始的位置增加字段
alter table 表名 drop column 字段名; 删除表字段
alter table 表名 change 字段原名 字段新名 字段类型; 表字段改名

alter table 旧表名 rename 新的表名; 修改表名

修改表字段排列顺序
在前的字段增加和修改语句(add/change/modify)中,最后都可以加一个可选项 first|after。

数据类型

整型

MySQL数据类型 所占字节 值范围
tinyint 1字节 -128~127
smallint 2字节 -32768~32767
mediumint 3字节 -8388608~8388607
int 4字节 范围-2147483648~2147483647
bigint 8字节 +-9.22*10的18次方
1.在创建表字段时,性别我们可以使用无符号的微小整型(tinyint)来表示。用0表示女、用1表示男。用2表示未知。
2.同样人类年龄也是,在创建表字段时可用用无符号的整型。因为人类的年龄还没有负数
3.在实际使用过程中。我们业务中最大需要存储多大的数值。我们创建表时,就选择什么样的类型来存储这样的值。

浮点类型

MySQL数据类型 所占字节 值范围
float(m, d) 4字节 单精度浮点型,m总个数,d小数位
double(m, d) 8字节 双精度浮点型,m总个数,d小数位
decimal(m, d) decimal是存储为字符串的浮点数
浮点是非精确值,会存在不太准确的情况,而decimal叫做定点数。
在MySQL内部,本质上是用字符串存储的。实际使用过程中如果存在金额、钱精度要求比较高的浮点数存储,建议使用decimal(定点数)这个类型

字符类型

MySQL数据类型 所占字节 值范围
CHAR 0-255字节 定长字符串
VARCHAR 0-255字节 变长字符串
TINYBLOB 0-255字节 不超过255个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65535字节 二进制形式的长文本数据
TEXT 0-65535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LOGNGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据
VARBINARY(M) 允许长度0-M个字节的定长字节符串 值的长度+1个字节
BINARY(M) M 允许长度0-M个字节的定长字节符串

时间类型

MySQL数据类型 所占字节 值范围
date 3字节 日期,格式:2014-09-18
time 3字节 时间,格式:08:42:30
datetime 8字节 日期时间,格式:2014-09-18 08:42:30
timestamp 4字节 自动存储记录修改的时间
year 1字节 年份

复合类型

MySQL数据类型 说明 举例
set 集合类型 set(“member”, “member2″, … “member64″)
enum 枚举类型 enum(“member1″, “member2″, … “member65535″)
一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。

常用中文字符集

gbk_chinese_ci 简体中文, 不区分大小写
utf8_general_ci Unicode (多语言), 不区分大小写
mysql在写utf-8的时候写的是utf8。不加中间的中横线

存储引擎

使用show engines命令可显示当前服务器支持的所有引擎
引擎名称
MyISAM 常用。读取效率很高的引擎
InnoDB 常用。写入,支持事处等都支持
Archive 不常用。归档引擎,压缩比高达1:10,用于数据归档
NDB 不常用。主要在MySQL 集群服务器中使用,

行锁:写入、更新操作的时候将这一行锁起来,不让其他人再操作了。
表锁:写入、更新操作时,将表给锁起来不让其他人再操作了。
事务:同时操作多个数据,若其中的一个数据操作失败。可回滚到操作之前。常用于银行、电商、金融等系统中

MyISAM
不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,操作速度快。常用于读取多的业务。
myisam存储引擎表由myd和myi组成。.myd用来存放数据文件,.myi用来存放索引文件。
对于myisam存储引擎表,mysql数据库只缓存其索引文件,数据文件的缓存由操作系统本身来完成。

InnoDB
支持事务,主要面向在线事务处理(OLTP)方面的应用。
行锁设计,支持外键,即默认情况下读取操作不加锁。

索引

1.普通索引 最基本的索引,它没有任何限制
alter table 表 add index(字段)

2.唯一索引 某一行企用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的
alter table 表 add UNIQUE(字段)

3.主键索引 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码
alter table 表 add PRIMARY KEY(字段)

4.全文索引 对于需要全局搜索的数据,进行全文索引
alter table 表 add FULLTEXT(字段)

创建表时可在创建表语句后加上对应的类型即可声明索引:
CREATE TABLE test (
id INT NOT NULL ,
username VARCHAR(20) NOT NULL ,
password INT NOT NULL ,
content INT NOT NULL ,
PRIMARY KEY (id),
INDEX pw (password),
UNIQUE (username),
FULLTEXT (content)
) ENGINE = InnoDB;

插入记录

方法一:
insert into 表 values(值1,值2,值n);
表中有多少个字段就必须要插入多少个值。一个不能多,一个也不能少。若有默认值,不想传,可以写上null。
顺序应该和表字段的排序一致。
方法二:
insert into 表(字段1,字段2,字段n) values(值1,值2,值n);
除非有必填字段必须要写入值外。如果有默认值的不想写可以忽略不写。mysql会自动补主默认值。
以表(字段1,字段2,字段n)字段顺序为值的顺序。
基本语法变形:一次插入多条记录
INSERT INTO user(username,password,sex)
values(‘ll’, ‘abcdef’, 1),
( ‘loe’, ‘bcdeef’, 0),
( ‘key’, ‘123456’, 1),
(‘tom’, ‘987654’, 1);

查询

select from 表; 查询表中所有字段中的所有结果,”“ 是一种正则表达式的写法,表示匹配所有
select 字段1[,字段2,字段n] from 表; 指定字段查询
select distinct 字段 from 表; 查询单个字段不重复记录 distinct
select 字段 from 表 where 条件; 条件查询 where,条件可以是逻辑比较运算符的比较式

select 字段 from 表 order by 字段 排序关键词; 查询结果按照字段排序关键词排序
排序关键词:
asc 升序排列,从小到大(默认)
desc 降序排列,从大到小

select 字段 from 表 order by 字段1 排序关键词,… …字段n desc|asc;
order by 后面可以跟多个不同的字段排序,并且排序字段的不同结果集的顺序也不同,
如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序。

select 字段 from 表 limit 数量; 对于查询或者排序后的结果集,如果希望只显示一部分而不是全部,使用 limit 关键字结果集数量限制。
select 字段 from 表 order by 字段 关键词 limit 数量; 限制结果集并排序
select 字段 from 表 limit 偏移量,数量; 结果集区间选择,偏移量从0开始,0是第一条数据
select 函数(字段) from 表; 从表中将按字段查询的结果进行函数处理
函数
sum 求和
count 统计总数
max 最大值
min 最小值
avg 平均值

select from 表 group by 字段; 将表中数据按字段分组
select
from 表 group by 字段 having 条件; 分组结果再过滤。having 是筛选组 而where是筛选记录
例:统计省份数量后再进行分组显示: select count(province),province from money group by province;

整体的SQL语句配合使用的语法结构如下:
SELECT
[字段1 [as 别名1],[函数(字段2) ,]……字段n]
FROM 表名
[WHERE where条件]
[GROUP BY 字段]
[HAVING where_contition]
[order 条件]
[limit 条件]

查询money表字段:id,username,balance,province 要求id>1 余额大于50,使用地区进行分组。我们使用用户id进行降序,要求只准显示3条。
select id,username,balance,province from money where id > 1 and balance > 50 group by province order by id desc limit 3;

多表联合查询

内连接

将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
基本语法1:
select 表1.字段 [as 别名],表n.字段 from 表1 [别名],表n where 条件;
取满足条件的数据的在各表中的各字段

select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user,order_goods where user.uid = order_goods.uid;
若表user中某条数据x的uid与表order_goods中的某条数据y的uid相同,则取出user表中数据x的 uid、username,取出order_goods中数据y的uid,name,其中order_goods的name的值以shopname的值显示
基本语法2:
select 表1.字段 [as 别名],表n.字段 from 表1 INNER JOIN 表n on 条件;

select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user inner join order_goods on user.uid = order_goods.uid;
效果同基本语法1

## 外连接
会选出其他不匹配的记录,分为外左联结和外右联结。
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
select 表1.字段 [as 别名],表n.字段 from 表1 LEFT JOIN 表n on 条件;

select * from user left join order_goods on user.uid = order_goods.uid;
以左边user为主,查询哪些用户未购买过商品,并将用户信息显示出来,user表全部显示

右连接:包含所有的右边表中的记录甚至是右边表中没有和它匹配的记录
select 表1.字段 [as 别名],表n.字段 from 表1 right JOIN 表n on 条件;

select * from user right join order_goods on user.uid = order_goods.uid;
查询商品表中哪些用户购买过商品,并将用户信息显示出来,order_goods全部显示

子查询

需要的条件是另外一个select语句的结果,即使用子查询
用于子查询的关键字包括in、not in、=、!=、exists、not exists等。
select 字段 from 表 where 字段 in(条件)

select * from user where uid in (select uid from order_goods);
从order_goods取出uid这一列,将uid在user中对应的数据取出来

记录联合

使用 union 和 union all 关键字,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示。
union all 把结果直接合并在一起
union 是将 union all 后的结果进行一次distinct,去除重复记录后的结果。

修改

使用update
update 表名 set 字段1=值1,字段2=值2,字段n=值n where 条件;

update emp set balance=balance-500 where userid = 15;
将emp表中userid为15的数据的balance减15
同时对两个表进行更新
update 表1,表2 set 字段1=值1,字段2=值2,字段n=值n where 条件

update money m,user u m.balance=m.balanceu.age where m.userid=u.id;
修改money,将money表的别名设置为m;user表的别名设置为u;将m表的余额改为m表的balance
用户表的age。执行条件是:m.userid = u.id

删除

用delete
DELETE FROM 表 [where 条件];
删除时如果不加where条件,会清空掉整个表的记录,返回被删除的记录数

清空表 如果使用,
truncate table 表名;
表中若有自增字段,这个自增字段会将起始值恢复成1

权限

添加权限

grant 权限 on 库.表 to ‘用户‘@’主机’ identified by ‘密码’;
grant select, insert on test.* to ‘liwenkai‘@’localhost’ identified by ‘4311’;
给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限

删除权限

revoke 权限 on 库.表 from ‘用户‘@’主机’;
revoke select, insert on test.* to ‘liwenkai‘@’localhost’ identified by ‘4311’;
给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限

参数说明

grant all 在grant后接all说明给予所有权限
revoke all 在revoke后接all说明删除所有权限
权限 on . . 所明给予所有库所有表的操作权限
‘用户‘@’主机’ 主机里面若为%。任意来源的主机均可以使用这个用户来访问