MySQL是对数据库概念的实现
数据库是对数据的保存和管理
其中的保存对应的是一个文件系统,数据库对应这一个文件夹,表对应着文件,数据对应文件中的数据
而管理是通过sql语句来实现的
sql一共分为四类
- DDL用于增删改查数据库和表的
- DML用于增删改表中的数据
- DQL用于查询表中的数据
- DCL用于创建删除用户和给用户授权
DDL
- 创建语法
基本语法
create database/table 数据库名/表名(列名1 列类型1,列名2 列类型2 ...)
这种创建方式当数据库/表已经存在的时候会报错,而
create database/table if not exists 数据库名/表名(列名1 列类型1,列名2 列类型2 ...)
会向检查数据库/表名知否存在,如果不存在才会创建
上面的创建的数据库/表的字符编码默认是安装mysql时指定的字符集,通过
create database/table 数据库名/表名(列名1 列类型1,列名2 列类型2 ...) character set 字符集名
来指定具体的字符集(utf-8在mysql中会写成utf8)
同时也可以在这一句话加上if来判断是否存在已决定是否创建
create database/table if not exists 数据库名/表名(列名1 列类型1,列名2 列类型2 ...) character set 字符集名
关于创建表的深入
上面提到的列类型常用的有
int 整数类型
double(a,b) a指定浮点数一共有几位,b表示小数部分占几位
date 表示日期年月日用'yyyy-MM-dd'的写法表示
datetime 也是表示日期但是还包括时分秒,用'yyyy-MM-dd HH:mm:ss'表示
timestamp 是一个时间戳,表示形式和datetime一样,区别在于在添加数据时不给这个类型的列赋值,这个类型的列会自动取当前的时间为其的值
关于创建列表还存在着一些问题
如创建一个名单列表,那么其中的名字这一列是不可能为空的
可以在名字的类型的后面加上not null 来表示这一列不能为空
在比如有些列的数据是不能重复的可以在类型后面加上unique
比如有些列是不能为空却不能重复的就可以使用primary key来限制(一个表中有且只有一列是主键限制的)
- 删除语法
drop database/table 数据库名/表名
这个语句同样存在一个问题就是当数据库/表不存在时会报错
drop database/table if exists 数据库名/表名
使用这句话就可以避免这个问题
- 修改语法
1. 数据库和表共有的修改字符集
alter database/table 数据库名/表名 character set 字符集名
2. 表特有的
1. 增加列
alter table 表名 add 列名 列类型
2. 删除列
alter table 表名 drop 列名
3. 修改列
alter table 表名 modify 列名 新类型 -- 这个语句只是修改列的类型
alter table 表名 change 旧列名 新列名 新列类型 -- 这个语句同时修改列名和列类型
4. 修改表名
alter table 旧表名 rename to 新表名
- 查询类语法
查询所以有的数据库
show databases
查询数据数据的字符集
show create database 数据库名
表示属于数据库(文件夹)中的文件,想要查询文件就需要想进入到文件夹中
use 数据库名-- 使用这个语句可以进入到文件夹中
再来查询数据库中的所有表
show tables
查询某个表的字符集
show create table 表名
查询表的结构
desc 表名
DML
用于增删改表中的数据
增加数据的语法
insert into 表名(列名1, 列名2 ...) values(值1, 值2 ...)
注意点:
1. 各个列名/值之间使用逗号隔开,最后一个不需要使用逗号
2. 如果不写列名列表默认是给所有的列赋值
3. 除了数值型以外的所有类型都需要用''引起来
删除数据语法
delete from 表名 where 条件
这个会删除满足条件的所有数据
注意点:
如果不写条件会删除表中的所有数据,所以写这个语句的时候一定要加上条件
如果就是想清空表的就使用truncate table 表名,这个语句清空表的效率更高
修改数据
update 表名 set 列名1=值1,列名2=值2 ... where 条件
所有满足条件的行都会被修改
如果没有写条件会默认将所有的行都修改
DQL
查询语法
select [distinct] -- 去重复
列名列表-- 表示最后结果又那几列,
-- 这里除了原列表中有的列,还有计算列(将原有列通过四则计算计算得到的新列)
-- 并却可以通过as关键字来起别名,(as可以省略)
-- 如果是分组了这里一般写的是聚合函数(count,max,min,sum,avg)和分组的字段`在这里插入代码片`
from
表名列表 -- 这些表中查询数据
where
条件
-- 满足条件的才会被查出来
group by
列(按这个列进行分组)
having
条件
-- 跟where的区别在于
-- where时在分组前进行判断,having实在分组后进行判断
-- where不通过不会进入到分组中,having不通过不会被查询出来
order by
查询字段1 排序方式1,
查询字段2 排序方式2,
...
-- 排序方法又两种asc升序排序和desc降序排序
-- 当前面字段是一样的时候才会通过后面的字段来排序
limit
起始位置, 一页多少个
关于多表查询
多表查询分为
select * from table1,table2
这样查询的结果是两个表的所有可能的组合,多表的查询的作用就是消除那些多余的查询
内联查询
隐式内联查询
select * from table1,table2 where table1外键=table2主键
这件事使用where将多余的数据过滤掉
显示内联查询
select * from table1 inner join table2 by table1外键=table2主键
其中的inner可以省略,
这个写法可以理解为将满足条件的两行合并成一行
外联查询
内联查询有一个局限在于如果table1中的数据在table2中没有跟其匹配的就不会显示出来
而是用外联查询可以保证table1中的数据一定会被查询出来,然后table2中的对应的列的值都是null
语法
select * from table1 left join table2 by table1外键=table2主键
这是左外联查询,保证table1中的数据一定会被查询出来,
同样也有右外联查询,将left替换成right就行,保证table2中的数据一定会被查出来
DCL
用于管理用户
创建用户
create use '用户名' @ '用户的主机地址' identifide by '密码'
删除用户
drop use '用户名' @ '用户的主机地址'
修改密码
set password for '用户名' @ '用户的主机地址' = password('密码')
查看权限
show grants for '用户名' @ '主机名'
授予权限
grant 权限列表 on 数据库(表名) to '用户名' @ '主机名'
撤销权限
revoke 权限列表 on 数据库(表名) from '用户名' @ '主机名'