修改数据库密码:
alter user root@"localhost" identified by '密码';
登录 mysql:
mysql -uroot -p;
查看所有数据库:
show databases;
使用某数据库:
use 数据库名称
查看数据库版本:
mysql - V;
创建数据库:
create database 库名[default charset ="utf8mb4"];
删除数据库:
drop database 库名;
创建表:
create table 表名(
列名 数据类型 约束条件,
列名 数据类型 约束条件,
列名 数据类型 约束条件
..... ..... ....
);
约束条件:
主键约束: primary key:不能重复,不能为空,目的是为了做唯一标识符
主键自增:auto_increment
外键约束: foreign key:主要目的是为了描述不同表之间的关联关系(多表关联查询的时候再说)
唯一约束: unique:该字段的值不能重复
默认约束: default:如果插入时,值为空,则可以使用默认值填充
检查约束: check:在SQL标准中,检查约束是存在的,但是注意: MySQL在8.0之前是默认不支持检查约束的!!! 8.0之前,定义是添加检查约束,不报错,也不生效 8.0之后,开始支持检查约束 非空约束: 必须要有值,不能为空
约束示例:
8.0检查约束:
gender char(2) check( gender in("F", "M"))
8.0之前的检查约束:
gender enum("F", "M")
删除表:
drop table 表名;
授权:
grant 语句:
在8.0之前,grant集授权、创建用户、修改密码、修改用户远程登录等等功能与一体的命令
在8.0之后,grant主要用来授权,其他功能弱化了
8.0之前:grant [all|select, create……] on 数据库.* to 用户名称@'localhost' identified by '密码';
grant 后为 所受权利 ,所有权利则用 all ,也可以是单个或者多个权利 如(查找、创建、删除...) on 后为在哪个数据库
例如:grant all on db_web.* to xxx@"localhost" identified by "xxxx";
意为:给xxx用户了数据库db_web.* 的所有权力,密码为“xxxx”
grant select, update, insert, delete, create,drop on db_web.* to xxx@"localhost" identified by "xxxx";
意为:给xxx用户了数据库db_web.* 的select, update, insert, delete, create,drop 权利,密码为“xxxx”
8.0 之后:必须先创建用户,再授权
create user xxxx@"localhost" identified by "xxxxx";
# 赋权
grant all on db_web.* to xxxx@"localhost" ;
权利回收:revoke
revoke 权利 on 数据库.* to 用户名称@'localhost'
添加数据:
insert into 表名称[(field1,……fieldn)] value/values(val1,……valn);
给表中所有列添加:
insert into 表名称 values(" 对应值","对应值 ","对应值 ", ......);
给表中某几列添加:
insert into 表名称(“列名”,“列名”,“列名”)values("对应值","对应值","对应值")
删除数据:
delete from table_name [where 条件];
truncate 清空表 ,非常危险,该操作不经过数据字典,
更新、修改(update):
update 表名称 set 字段1=新值 [,……fieldn] [where 条件];
替换(replace):
replace into 表名称[(field1,……fieldn)] value/values(val1,……valn);
替换的时候,会判断数据是不是已经存在了(看主键是否相等or唯一约束是否相等),
如果已经存在了,则更新数据(delete,insert)
如果不存在,则插入数据(insert)
查询(select):
select *(全部)/列名 from 表名称;
select 字段 from 表 [where 条件 ];
关系运算符:
>, < ,=, >=, <= ,!= 或者( <> ),
<=> :
1、可以当做 = 来使用
2、这个符号还可以判断null值
多条件同时使用使用(逻辑运算符):
and
or
not
范围:
between and (等同于 >= and <= )
列举
in 语法 in(值1, 值2……)
not in(值1, 值2……)
注意:SQL中null值不能使用等于判断
要使用is判断null
is null
is not null
模糊查询:
select * from tt where name like "z%"; # %类似于正则中的.*,表示匹配任意
表示以z开头;
select * from tt where name like "_h%"; # _该符号表示占据一个位置
表示第二个字符是h
select * from tt where name like "%h%"; # 包含h符号
表示含有h;
注意:模糊查询,效率非常低,大概率会全表扫描,请慎用!!!
在全文检索的时候,一般使用专门的技术进行全文检索
(solr|Solr、es|Elasticsearch)
聚合函数:
count(*)|count(列名)|count(1) 统计数量;
count(*):不会忽略为null的值
count(1):不会忽略为null的值
区别:
若列名为主键,count(列名)会比count(1)快
若列名不为主键,count(1)会比count(列名)快
若表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
若表有主键,则 select count(主键)的执行效率是最优的
若表只有一个字段,则 select count(*)最优。
count(列名):不统计为null的值
sum(列名) # 求和
max(列名) # 求最大值
min(列名) # 求最小值
avg(列名) # 求平均值
分组查询:
是一种统计的操作:将结果中值相同的默认是一个组,也允许聚合函数参与统计,
注意,如果要查询普通(不是聚合函数),该字段必须参与分组
select gender, count(*) from tt group by gender;
# 多字段参与分组,则需要逗号写上
select age, gender, count(*) from tt group by gender , age;
分组后筛选:
第一种方式(子查询):
select *
from
(select age, gender, count(*) as count
from tt
group by gender , age
) as t1
where count > 3;
第二种方式:
having子句必须配合分组
表示的分组后的筛选!!
SELECT age, gender, count(*) as count
FROM tt
WHERE age > 10
GROUP BY gender , age
HAVING count(*) > 3;
排序:
order by 字段 asc(升序) desc (降序)
注意(默认为升序,所以升序可以不写);
分页:
前端分页:
数据流非常小的情况下,可以使用;
将数据一次全部取出,在通过JavaScript等技术,实现分页效果
后端分页:
在查询时候,只查询当前页面需要的数据出来
limit 关键字完成
limit 数字 # 截取对应的数量数据
limit 数字1, 数字2 # 表示从数字1开始查询,每次查询数字2个数据的量
分页时的四个变量:
每页展示的数量(pageSize): # 一般是程序员定
当前页(pageNow) # 用户来决定,通过用户点击对应的a链接来决定
总数量(allCount) # 查询出来 count(*)
总页数(pageCount) # 算出来的
limit offset , pageSize;
limit (pageNow - 1) * pageSize, pageSize;
别名:
字段 as 别名
字段 别名 # 省略as关键字
查询的顺序:
where子句是第一个执行:第一层条件的筛选,执行在分组之前
select 查找字段……from 表…
[where 条件]
[group by ……]
[having ……]
[order by ……
][limit 分页]