本文介绍Mac电脑brew安装MySQL环境下mysql的基本使用方法。
MySQL相关
启动数据库
brew services start mysql
登录数据库
mysql -u root -p
输入root密码
退出数据库
exit;
数据库相关
显示mysql中所有数据库
show databases;
创建数据库
create database '数据库名';
create database if not exists '数据库名';
删除数据库
drop database '数据库名';
drop database if exists '数据库名';
选择接下来要操作的数据库
use '数据库名';
表相关
显示数据库中所有表
show tables;
显示表结构
desc '表名';
创建表
create table '表名' (
字段名1 数据类型,
字段名2 数据类型
);
对于double类型需要注意,double可以设置两个参数类似于score double(5,2)
这种,代表这个字段最大可以存储总长度最大为5、保留两位小数点的数字(换算后就是范围0-100,2位小数点)。
对于字符串类型需要注意,char代表定长字符串,varchar代表变长字符串。
- char(10)代表定长10个字符的数据,不管传进来的数据是什么都是占10个字符长度,比较耗空间,但是性能高,直接开辟10个字符空间就行。
- varchar(10)代表最多存10个字符的数据,如果传进来的数据小于10个字符则占用原始数据的长度(譬如存储‘张三’只需要开辟两个字符空间就行),但是性能低。
删除表
drop table '表名';
drop table if exists '表名';
修改表
- 修改表名
alter table '表名' rename to '新表名';
- 增加列
alter table '表名' add address varchar(32);
- 修改列数据类型
alter table '表名' modify 列名 新数据类型
- 同时修改列名和数据类型
alter table 表名 change 列名 新列名 新数据类型
- 删除列
alter table 表名 drop 列名
操作数据(增、删、改)
- 增加数据
insert into 表名(字段1,字段2) values(字段1的值,字段2的值);//增加指定字段的数据
insert into 表名 values(字段1的值,....,字段n的值);//增加所有字段
insert into 表名(字段1,字段2) values(字段1的值,字段2的值),(字段1的值,字段2的值)...;//批量增加指定字段的数据
insert into 表名 values(字段1的值,字段2的值),(字段1的值,字段2的值)...;//批量增加所有字段的一条数据
- 修改数据
update 表名 set 列名=值1,列名=值2... [where 条件];
ps:where语句很重要,不然更新整张表
- 删除数据
delete from 表名 [where 条件];
ps:where语句很重要,不然删除整张表所有数据
查询数据
查询语法如下
select 字段列表,用逗号隔开(字段名 as 别名,as可省略)
distinct 去除重复数据
from 表名列表
where 条件列表
group by 分组字段
having 分组后条件(可以对聚合函数进行判断)
order by 排序条件(order by 字段1 排序方式,字段2 排序方式...(asc或desc,默认asc))
limit 分页条件(limit 起始索引索引从0开始,查询条目数)
- 不等于有
!=
和<>
两种表示方式 - null值不能使用
=
和!=
表示,可以使用is null
和is not null
in (a,b,c)
可以表示在a,b,c中查询- 模糊查询
like
中_
代表单个任意字符,%
代表任意个数字符 - 多个条件用
and(也可以是&&)
或者or(也可以是||)
连接 - 如果有多个排序条件,按语句先后顺序排
- 执行顺序:
where
>聚合函数
>having
聚合函数
count(列名或*)
,统计个数,列名不能为null,null值不参与计算max(列名)
,查询最大值min(列名)
,查询最小值sum(列名)
,求和avg(列名)
,平均值
select 列名,count(列名) from 表名 where 条件 group by 列名 having count(列名) > 2;
举个例子,现在假设有两张表:
Students表
列名 | 值 |
---|---|
id | int |
name | varchar(32) |
age | int |
Score表
列名 | 值 |
---|---|
id | int |
student_id | int |
score | double |
现在要查询年龄大于18岁且分数大于60分的所有学生数据:
select Students.id,Students.name,Students.age,Score.id,Score.score from Students,Score where Score.student_id = Students.id and Score.score >= 60 and Students.age > 18
ps:值为null的数据不参与聚合函数的所有计算
约束
约束是作用在数据库表上的规则,在创建表时可以加上这些约束,保证数据库数据的正确性、有效性和完整性。
约束名称 | 关键字 | 描述 |
---|---|---|
非空约束 | NOT NULL | 保证数据不能有null值 |
唯一约束 | UNIQUE | 保证数据各不相同 |
主键约束 | PRIMARY KEY | 一行数据的唯一标识,自增auto_increment |
默认约束 | DEFAULT | 保存数据时未指定值则用默认值,null会存储进去 |
外键约束 | FOREIGN KEY | 多表关联 |
检查约束 | CHECK | 保证列中值满足某个条件 |
create table user()
ps:MySQL不支持检查约束
外键
外键用来在创建表时设定两张表中列的关系,语法如下
create table(
constraint 外键名 foreign key(列名) REFERENCES 主表名(主表列名)
)
设置了外键后删除主表数据时会判断主表数据关联的表中的数据是否都删除了,如果还存在关联数据则不允许删除主表数据。
删除外键
alter table 表名 drop foreign key 外键名
ps:实现外键一对一时需要使用unique
关键字
多表查询
内连接
select (A.列1,A.列2,B.列1...) from A表,B表 [where 条件];//隐式内连接
select (A.列1,A.列2,B.列1...) from A表 [inner] join B表 on 条件;//显式内连接
- 如果where为空则取A、B的笛卡尔积,譬如A有4条数据、B有6条数据,则查询后的结果有24条。
- 别名可以以
from A表 别名
形式表示
外连接
左外连接用于查询A表所有数据与交集部分数据
select 字段列表 from A表 left [outer] join B表 on 条件;
右外连接用于查询B表所有数据与交集部分数据
select 字段列表 from A表 right [outer] join B表 on 条件;
子查询
把另外一个select语句作为参数传给当前select语句的条件,并且用括号括起来。
数据库事务
数据库的事务是一种机制、一个操作序列,包含一组数据库操作序列。事务中的所有命令作为一个整体向系统提交,这一组数据库命令要么同时成功,要么同时失败。事务是一个不可分割的工作逻辑单元。事务的逻辑有三步:
-- 开启事务
start transaction 或者 begin;
-- 提交事务
commit;
-- 回滚事务
rollback;
以转账(A->B)这个操作为例,共分为三步:
- 查询A用户余额
- A用户余额-500
- B用户余额+500
这三个步骤如果放在一个事务中执行,最后要么转账成功,要么两个用户余额不改变,不会存在A用户余额扣了但B用户余额不增加的情况,如果步骤1、2、3中任何一个步骤发生异常那么整个数据库会回滚到开启事务前的状态。
事务的四大特征
简称ACID,英文首字母简写连接
- 原子性:事务要么全部成功或者全部失败
- 一致性:事务完成时,必须使所有数据保持一致
- 隔离性:多个事务中,数据的可见性
- 持久性:事务一旦提交或者回滚,它对数据库的操作时永久性的
ps:mysql的数据库事务默认会自动提交,修改事务提交方式可用set @@autocommit = 0或1
语句