MySQL
是一个关系型数据库管理系统,属于Oracle
旗下产品。MySQL
是最流行的关系型数据库管理系统之一.MySQL
所使用的SQL
语言是用于访问数据库的最常用标准化语言.MySQL
特点: 体积小、速度快、成本低,开源免费.
mysql安装
常用数据库
DB2、Oracle、SQL Server、Mysql、Access、MangoDB
等- 常用图形化管理工具
phpmyadmin navicat SQLyog
等
结构化查询语句
数据定义语言(DDL)
用于定义数据对象,包括数据库,数据表 create drop alter数据操作语言(DML)
用于操作数据库对象中所包含的数据 insert update delete数据查询语言(DQL)
用于查询数据,进行单表,连接,嵌套查询 并将数据返回 select数据控制语言(DCL)
用来管理数据库,包含管理权限及数据更改 grant remove rollback数据事务语言(DTL)
用来保证多条”增删改”语句执行的”一致性” start transaction
启动/停止mysql服务
- 命令行模式
net start/stop nysql
- 控制面板->管理工具->服务->mysql->启动/停止
数据库操作
- 连接数据库
mysql -h 服务器主机地址 -u 用户名 -p 回车后输入密码 -P3306
- 退出数据库
exit或quit
- 查看所有数据库
show databases
- 创建数据库
create database [if not exists] stu charset utf8 [collate 排序规则]
- 删除数据库
drop database [if exists] stu(必须指定删除那个数据库)
- 显示数据库的创建语句
show create database test;
- 修改数据库 修改字符编码 修改排序规则
alter database 数据库名 charset 新的编码名 collate 新的排序规则
- 选择数据库
use stu
表的操作
操作表时, 首先得先选择要操作的数据 即 use xxx数据库名
- 创建一张表
create table stu_mess(id int,name char(20))
- 查看库下所有表
show tables
- 查看表结构
desc stu_mess
- 插入数据
insert into
- 查询数据
select * from stu_mess
- 更新数据
update stu_mess set name='lisi',age='19' where id=5
- 删除数据
delete from stu_mess where id=2
注:使用update更新数据或使用delete删除数据时,必须加条件限制(where),否则会更改或删除所有列
- 重命名表
rename table 表名1 to 表名2 同 alter table 表名 rename to 新表名
- 清空表数据
truncate books 同 delete form books (谨慎使用)
- 删除表
drop table [if exists] 表名
- 显示数据表的创建语句
show create table 表名
- 创建表时 对该表的整体设定
- charset=要使用的字符编码
- engine=要使用的存储引擎(也叫表类型) 指表中的数据以何种方式存放在文件或内存中
- auto_increment=10001 自增字段的初始值
- comment=”对该表的说明文字”
表中插入数据
- 插入单行数据
- 方式一
insert into book values(所有字段必须有值)
- 方式二
insert into book(列1,列2) values("值一","值二")
- 方式三
insert into book select * from 其他表 (两表的字段必须对应)
- 方式一
- 插入多行数据
- 方式四
insert into book values(101,'mysql',55),(102,'php',33)
- 方式五
insert into book select '103','css','77' union select '104','html','88'
注:方式二可以只给需要赋值的字段插入数据,还可以按自定义字段顺序赋值 (列与值必须严格对应) 数字可以不加引号,但字符和时间必须加单引号 方式五 最后一行不加union 每个select 之间不能写逗号 插入数据时可以使用md5()对密码进行加密后 不可逆
- 方式四
修改表字段
- 添加字段
alter table 表名 add 新字段名 字段类型
- 修改字段并改名
alter table 表名 change 旧字段名 新字段名 新字段类型
- 修改字段属性
alter table 表名 modify 字段名 新字段类型
- 删除字段
alter table 表名 drop 字段名
- 添加字段默认值
alter table 表名 alter 字段名 set default 默认值
- 删除字段默认值
alter table 表名 alter 字段名 drop default
- 修改表选项
alter table 表名 选项1=值1,选项2=值2.....
- 从已有表复制表结构
create table if not exists 新表名 like 旧表名
表的数据类型
数值型
1
2
3
4
5
6
7
8
9
10
11
12在整型数据列后面加上unsigned 禁止负数 声明时可以指定显示长度
整型 tinyint smallint mediuint int bigint
1字节 2字节 3字节 4字节 8字节
默认是有符号 tinyint -128~127 smallint -32768~32768
int -2147483648~2147483647 1字节=2^8(8位)
浮点型
float(M,D) 10^38 M<=24 4字节 否则占8字节 有精度损失 精度只有6位左右
double(M,D) 使用8字节存储 精度更高
m一共几位(总位数),d小数点后保留几位
decimal(M,D) 变长字节 也可写成 numeric fixed dec
把整数部分和小数部分,分开存储的 比float精度更高
适合存储货币等要求精确的数字字符型
1
2
3
4
5
6
7
8
9
10
11
12
13char(m) 定长字符串 长度不够右侧空格填充 (自助餐)
取出数据时,再把后面的空格去掉,如果后面有空格 将会丢失
char长度范围是0~255 默认为1
varchar(m) 可变长度 长度取决于实际存放在列中的值(内容)的长度
如果存储中文gbk 则最多存65533/2个字符
如果存储中文utf8 则最多存65533/3个字符
长度范围是0~65535 char比varchar更快
text 存大段文本 区分大小写
bolb 存大段二进制 不区分大小写 常用来存储图像,音频等二进制信息
enum('val1','val2') 枚举类型 只能选择其中的一个(最多65535个)
注:插值时可以直接写值,也可以用集合中的索引 0 代表 '' 1 '男' 2 '女'
set('val1','val2',..) 集合类型 可以选择多个(最多64个)
注:插值时也可用索引但索引是从1,2,4,8,16,....64最多(可用多个选项的索引和)日期型
1
2
3
4
5
6
7Year 年 1990
date YYYY-MM-DD 表示日期 可用分隔符多种
time (H:i:s) 表示时分秒
datetime(1990-12-10 H:i:s)
timestamp YYMMDDhhmmss 格式的时间戳 插入或更新时自动获取当前时间时间戳
now() 获取当前时间
注:在时间日期类型中 在自己给定的情况下 需使用单引号或用now()函数null
1
2
3null意味着没有值或未知值 可以插入表中 但是查询时 不能用=判断 必须用
is null 或 is not null 来判断 也不能对null进行算术运算
对null值进行运算 其结果都为null 在mysql中 0和null 被看作假其他为真数据字段属性
1
2
3
4
5
6
7
8
9
101.unsigned无符号 只能用在数值型中 且unsigned必须放在数值型后面
2.zerofill 该数字不足参数M位时,数值前面自动补0 补够M位 只能用在数值型中
XXXint(M) 如果没有zerofill属性 单独的参数M 没有任何意义
如果设置某列为zerofill 则该列自动应用unsigned 无符号类型
3.auto_increment 只能用于整数数据每增加一条会自动增加1不允许重复
自动增长为以前出现过的加1
4.null和not null 默认是否为空 查询不便,索引效果不高
5.default() 默认值
6.comment '字段说明文字' 备注 不会在表中显示
注:表数据的优化 定长与变长分离 常用与不常用分离
索引与约束
索引列表
1
2
3
4
5
6
7
8
9
10
11
12
13索引时系统内部自动维护的隐藏的数据表 作用是极大的加快的查找速度
建立索引其实是指定一个表的某个或某些字段的作为索引数据字段
索引类型(要建立的索引的字段名) 共同作用(加快查找速度)
1.普通索引 key(字段名)
email varchar(20) ,key(email)
2.唯一索引 unique key(字段名) 设定其字段的值不能重复(唯一性)
username varcahr(20),unique key(username)
3.主键索引 primary key(字段名) 区分表中的任何一行数据
id int not null auto_increment,primary key(id)
4.全文索引 fulltext(字段名)
5.外键索引 foreign [constrian 外建名] key(字段名) references 其他表(对应字段名)
外键就是指设定表student的字段classId的值必须在另一个表class中的某个classId中存在(主键),在student插入
数据时, classId字段的值,就不可以随便插入,必须在class表classId字段已存在值才可以添加,否则会报错约束
1
2
3
4
5
6
7
8约束 就是要求数据需要满足什么条件的规定
1.主键约束 primary key(字段名)
2.唯一约束 unique key(字段名)
3.外键约束 foreign key(字段名) references 其他表(对应字段名)
4.非空约束 not null 设定not null属性
5.检查约束 check(age>=0 and age<=100) 在mysql目前不支持
主键约束,唯一约束,外键约束同时也被称为主键索引,唯一索引,外键索引只是同一件
事情按不同的角度的两种说法 1.查找角度 有了索引查找快 2.数据要求,满足规定
mysql查询语句
基本查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22select [all(默认) distinct] 字段或表达式或函数 [from 表] [where子句] [group by子句]
[having子句] [order by子句] [limit子句]
a.列出要查询的字段,可以用as为字段起别名(关键字,多表查询)
b.使用distinct取消重复的数据,返回没有重复所有数据 all不取消重复行(默认)
①条件 where 表达式 true或false false取不出来结果 针对磁盘的数据(固有数据)
比较运算符 < <= = !=或<> >= >
逻辑运算符 not或! or或|| and或&& (符号的不推荐)
布尔值和null XX is true XX is false XX is null XX is not null
in(n,m)在某集合内 (常用散列值) not in不在某集合内
between and 在某个范围内 not between and 不在某个范围之内
like "" 模糊匹配 (%匹配任意字符,_匹配单个字符) 对于含% 或 _的 需要转义\
②分组 group by分组使用 一般要配合聚合函数(avg()sum()max()min()count(*)行数)
把行按某列(字段)进行分组
count(*) 每一组的数量的信息 哪怕都为null 也计算在内
select count(列名) from 表名 查询该列不为null的所有行的行数
③筛选 having 对分组之后的数据结果集进行筛选 一般与as一起使用(主要用于结果集中)
where 对原始数据进行筛选
④排序 order by 将前面取得的数据以设定的字段排序 默认升序(asc) 降序desc
把行按某列(字段)进行排序 多列排序 order by 字段1 asc,字段2 desc
⑤限制 limit order by price limit len 一般和order by一起配合使用
或limit n,m 从n开始取m个(注意n从0开始) 跳过n个
注: 顺序 where,group by,having,order by,limit 顺序不能颠倒子查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16① where子查询 内层的查询结果作为外层的查询条件
select goods_id,cat_id,goods_nmae from goods where goods_id in
(select max(goods_id) from goods group by cat_id)
使用 in(列子查询) 在某个范围内 使用 > = < 等运算符
使用 any(列子查询)(some) 当某字段对于子查询中任意一个值满足比较运算 则就算满足条件
select * from tab1 where id > any(select f1 from tab2)
使用 all(列子查询) 当某字段对于子查询中所有值满足比较运算 才能算满足条件
select * from tab2 where f1 > all(select id from tab1)
② from子查询 将内层的查询结果当成一张新表
select goods_id,cat_id,goods_name from(
select * from goods order by cat_id,goods_id desc) group by cat_id
③ exist子查询
where exists(子查询) 子查询如果有数据 则exists结果为true,否则为false
要么全部取出,要么都不取出
select * from catgory where exist(
select * from goods where goods.cat_id=catgroy.cat_id)连接查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14将两个或两个以上的表,连接起来 当作一个数据源,并从中取得所需要的字段
①交叉连接 (笛卡尔积)
没有条件只是将所有数据行连接起来的结果
表1(n1个字段,n2行) 表2(m1个字段,m2行) 交叉连接结果 有n1+m1列 有n2+m2行
select * from 表一,表二 select * from 表一 join 表二
②内连接查询 两表都有的相关数据则取出 交集
将在两表交叉连接之后的结果集中取得满足给定的连接条件的数据行,此连接条件通常是
表与表之间的外键关系.
select xx from table1 inner jion table2 on table1.xx=table2.xx
select xx from table1,table2 where table1.xx=table2.xx
③左连接查询 以左表数据为准 查询右边的相关数据,查不到的补null
select xx from table1 left jion table2 on table1.xx=table2.xx
④右连接查询 以右表数据为准 查询左边的相关数据,查不到的补null
select xx from table1 right jion table2 on table1.xx=table2.xx联合查询union
1
2
3
4
5
6
7
8
9就是把2条或多条sql的查询结果合并成一个结果集
满足条件 每条语句取出的列数(字段)必须相同
1.完全相等的行将会被合并
2.列名称未必要一致 列名称会使用第一条sql的列名称为准
3.合并比较耗时 所以一般用 union all 可以避免合并
4.union子句 写order by完全没意义 合并后的结果可以用order by
5.如果第一个select语句中有别名,则order by子句中就必须使用该别名
select 语句1 union [all|distinct(默认)] select 语句2
注:一个查询需求,可以使用连接查询,也可以使用子查询得到,通常用连接查询,效率更高