一、SQL
- sql分类
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
-
DQL-执行顺序
编写顺序 执行顺序 select 字段列表-------⑤ from 表名列表-------① where 条件列表-------② group by 分组字段列表----③ having 分组后条件列表--④ order by 排序字段列表----⑥ limit 分页参数-------⑦
-
DCL-权限控制
权限 说明 all,all privileges 所有权限 select 查询数据 insert 插入数据 update 修改数据 delete 删除数据 alter 修改表 drop 删除数据库/表/视图 create 创建数据库/表
二、常见的数据类型
- 整形:tinyint、smallint、mediumint、int、bigint
- 浮点型:float、double、decimal
- 日期时间型:year、time、date、datetime
- 字符型:char、varchar(数据长度)、text、enum('数据')
三、常用命令
操作表格 | 语法 |
---|---|
添加数据 | insert into 表名(字段1,字段2,…) values (值1,值2,…),(值1,值2,…),(值1,值2,…); |
修改数据 | update 表名 set 字段1=值1,字段2 = 值2,… [where 条件]; |
删除数据 | delete from 表名 [where 条件]; |
聚合函数 | select 聚合函数(字段列表) from 表名 [where 条件]; |
分组查询 | select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]; |
排序查询 | select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2,…; |
分页查询 | select 字段列表 from 表名 limit 起始索引 查询记录数; |
查询用户 | use mysql; select * from user; |
创建用户 | create user ‘用户名’@‘主机名’ identified by ‘密码’; |
修改用户密码 | alter user ‘用户名’@‘主机名’ identified with mysql_native_password by ‘新密码’; |
删除用户 | drop user ‘用户名’@‘主机名’; |
查询权限 | show grants for ‘用户名’@‘主机名’; |
授予权限 | grant 权限列表 on 数据库名.表名 to ‘用户名’@‘主机名’; |
撤销权限 | grant 权限列表 on 数据库名.表名 from ‘用户名’@‘主机名’; |
条件查询
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<>或!= | 不等于 |
between…and… | 在某个范围之内(含最小、最大值) |
in(…) | 在in之后的列表中的值,多选一 |
like占位符 | 模糊匹配(_匹配单个字符,%匹配任意个字符) |
is null | 是null |
逻辑运算符 | 功能 |
---|---|
and 或 && | 并且(多个条件同时成立) |
or 或 || | 或者(多个条件任意一个成立) |
not 或 ! | 非,不是 |
针对表内数据的操作
建
-
创建数据库:create database 库名;
-
创建并判断数据库是否存在:create database if not exists 库名;
-
使用数据库:use 库名;
-
建表:create table 表名(字段名+空格+数据类型);
-
创建字段为非空约束:在表中:字段名 数据类型 not null;
-
创建数据库并指定字符集
- create database 库名 character set 字符集名字;
- create database 名字 default character set=字符集名字;
-
创建主键约束
- 创建设置单个
- create table 表名 字段名 数据类型 主键约束;
- create table 表名 字段名 数据类型 constraint 约束名 主键约束(字段名);
- 创建设置复合
- create table 表名 字段名 数据类型,【constraint 约束名】 primary key(字段名,字段名);
- 创建设置单个
-
创建外键约束:create table 表名 字段名 数据类型 constraint 约束名 foreign key(从表字段名) references 主表名(主表字段名);
-
创建唯一约束
- create table 表名 字段名 数据类型 unique;
- create table 表名 字段名 数据类型 ,constraint 约束名 unqiue(字段名,字段名);
-
创建默认约束:create table 表名 字段名 数据类型 default 默认值;
-
设置自动增长(只能设置主键):create table 表名 字段名 数据类型 auto_increment【auto_increment=n】;
插
- 插入所有字段数据:insert into 表名 values(值1,值2,…);
- 插入指定字段数据:insert into 表名(字段名1,字段名2,…) values(值1,值2,…);
- 批量插入多条数据
- insert into 表名(字段名1,字段名2,…) values(值1,值2,…),(值1,值2,…),(值1,值2,…);
- insert into 表名 values (值1,值2,…),(值1,值2,…),(值1,值2,…);
- 将另一个表的数据全部使用:insert into 使用数据表名 select * from 被使用表名【where 限制】;
增
-
添值:insert into 表名 (列名)values(值);
-
添加主键约束
- alter table 表名 add primary key (字段名);
- alter table 表名 modify 字段名 数据类型 primary key;
- alter table 表名 add constraint 约束名称 primary key(字段名,字段名);
-
添加外键约束:alter table 从表 add foreign key (外键) references 主表(主键);
-
增加唯一约束
- alter table 表名 modify 字段名 数据类型 unique;
- alter table 表名 add unique(字段名,字段名);
- alter table 表名 add constraint 约束名 unique(字段名,字段名);
-
增加默认约束
- alter table 表名 modify 字段名 数据类型 default 默认值;
- alter table 表名 alter column 字段名 set default 默认值;
-
增加非空约束:alter able 表名 modify 字段名 数据类型 not null;
-
增加自动增长:alter table 表名 modify 字段名 数据类型 auto_increment;
-
在表中增加字段
- alter table 表名 add 新字段名 新字段名的数据类型[first(首列,后面不接字段名)或者after(在字段之后,需要在后面接字段名)];
- 增加多个字段
- alter table 表名 add 字段名 数据类型,add 字段名 数据类型;
- alter table 表名 add(字段名 数据类型,字段名 数据类型);
删
-
删除
- 删除部分数据:
delete from 表名 where 条件;
- (效率慢)删除全部数据:delete from 表名;
- (效率快)删除表并且新建相同表:truncate table 表名;
- 删除部分数据:
-
删除主键约束:alter table 表名 drop primary key;
-
删除外键约束:alter table 表名 drop foreign key 外键;
-
删除非空约束:alter table 表名 modify 字段名 数据类型;
-
删除唯一约束:alter table 表名 drop key/index 约束名;
-
删除默认约束
- alter table 表名 modify 字段名 数据类型;
- alter table 表名 alter column 字段名 drop default 默认值;
-
删除自动增长:alter table 表名 modify 字段名 数据类型;
-
删除字段中的值:delete from 表名 where 条件;
-
删除库:drop database [if exists]库名;
-
删除表
- drop table 表名;
- drop table 【if exists】表名,表名;
-
删除表中的字段
- alter table 表名 drop 字段名;
- 删除多个字段:alter table 表名 drop 字段名,drop 字段名;
查
- 查询:select * from 表名 where 条件;
- 查看表:show tables;
- 查询建表时的结构
- show create table 表名;
- show columns from 表名;
- desc 表名;(describe)
- 查询当前使用数据库:select 库名();
- 查看表中所有数据:select * from 表名;
- 限制查询数据:select * from 表名 limit 0,n;(显示从第一行开始,0也可以省略)
- limit 0,n = limit n offest 0
- 查看当前系统下的数据库:show databases;
- 查看创建数据库的方法:show create database 库名;
- 查看数据库变量:show variables like 'character(可以更改)%';
- 查询时过滤重复数据:select distinct 字段名 from 表名;
- 查询另一个库中的表
- select * from 库名.表名;
- show tables from 库名;
改
- 更新数据:
update 表名 set 字段名1=值1,字段名2 = 值2,… [where 条件];
- 修改字段名:alter table 表名 change 旧字段名 新字段名 新字段名的数据类型;
- 修改数据类型:alter table 表名 modify 字段名 新数据类型;
- 修改表名
- alter table 旧表名 rename 新表名;
- rename table 旧表名 to 新表名;
- 修改数据库字符集:alter database 名字 [default] character set[=]字符集名字;
- 在设置了默认自动增长之后,更改自动增长最小值:alter table 表名 auto_increment=n;
移
- 移动字段:alter table 表名 modify 需要移动的字段名 需要移动的字段数据类型 after 字段名;
排
-
排序:order by 字段名;(asc 升序、desc降序)
- 单字段排序:select 字段名 from 表名 order by 字段名 asc(默认)/desc;
- 多字段排序:select * from 表名 order by 字段名,字段名;(先满足前面字段排序,若最后字段后接顺序,则顺序优先按照最后字段)
- 自定义排序:select * from 表名 order by 字段名 顺序,字段名 顺序;
分
-
分组查询
-
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
-
group by 字段 :将查询结果按一列/多列的值分组,值相等为一列
-
having 字段:二次判断,用到聚合函数后,又需筛选条件时,having和group by组合用
-
例:select 列名1 ,count(列名2) 别名 from 表名 group by 列名1 having 别名 >2;
-
执行顺序:
where>聚合函数>having
-
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段五任何意义
-
-
where与having区别
- 执行时机不同:
where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
- 判断条件不同:where不能对聚合函数进行判断,而having可以
- 执行时机不同:
算
- 统计所有数据:select count(*) from 表名;
- 分组统计相同的数据数量:select 字段名,count(*) from 表名 group by 字段名;
- 分组统计并且筛选数量:select 字段名 from 表名 group by 字段名 having count(字段名)需要筛选的条件;
函数
语法:select 函数(参数);
字符串函数 | 功能 |
---|---|
concat(s1,s2,…sn) | 字符串拼接 |
concat(‘-’,s1,s2,…sn) | 以连接符进行字符串拼接 |
lower(str) | 全部小写 |
upper(str) | 全部大写 |
lpad(str,n,pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 |
rpad(str,n,pad) | 右填充 |
trim(str) | 去掉字符串头部和尾部的空格 |
ltrim(str) | 去掉字符串头部空格 |
rtrim(str) | 去掉字符串尾部空格 |
substring(str,start,len) | 返回从字符串str从start位置起的len个长度的字符串 |
left(s,n) | 返回字符串s开始的最左边n个字符 |
right(s,n) | 返回字符串s的最右边n个字符 |
replace(s,from_s,to_s) | 把字符串s中的from_s字符串替换为to_s |
数值函数 | 功能 |
---|---|
ceil(x) | 向上取整 |
floor(x) | 向下取整 |
mod(x,y) | 取余 |
rand() | 返回0~1的随机数 |
round(x,y) | 求参数x的四舍五入的值,保留y位小数 |
truncate(x,y) | 返回截取至y位并让后面的数变为0的x的参数 |
format(x,y) | 返回参数x的四舍五入的值,保留y位小数 |
- format、round和truncate的区别
- round可以进行四舍五入,返回类型是float浮点型
- truncate直接截取,不进行四舍五入
- format会四舍五入,返回类型是str字符串
日期函数 | 功能 |
---|---|
curdate() | 返回当前日期 |
curtime() | 返回当前时间 |
now() 或 sysdate() | 返回当前日期和时间 |
year(date) | 获取指定date的年份 |
month(date) | 获取指定date的月份 |
day(date) | 获取指定date的日份 |
date_add(date,interval expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
datediff(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
date_format(date,format) | 根据format指定的格式显示date值 |
-
format格式 描述 %b 月份的缩写名称(Jan…Dec) %c 月份,数字形式(0…12) %m 月份,数字形式(00…12) %M 月份名称(January..December) %d 该月日期,数字形式(00…31) %e 该月日期,数字形式(0…31) %Y 4位数形式表示年份 %y 2位数形式表示年份
流程函数 | 功能 |
---|---|
if(value,t,f) | 如果value为true,则返回t,否则返回f |
ifnull(value1,value2) | 如果value1不为空,返回value1,否则返回value2 |
case when [val1] then [res1] … else [default] end | 如果val1为true,返回res1,… 否则返回default默认值 |
case [expr] when [val1] then [res1] … else [default] end | 如果expr的值等于val1,返回res1,…否则返回default默认值 |
聚合函数 | 描述 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值的和 |
信息函数 | 描述 |
---|---|
version() | 返回当前MySQL服务器版本号 |
connection_id() | 返回MySQL服务器当前连接的次数,每个连接都各自唯一的id |
database()和schema() | 返回当前的数据库名 |
user() | 获取用户名的函数,返回当前登录的用户名称 |
自定义函数 | 语法 |
---|---|
创建函数1 | create function 函数名(参数名 参数数据类型) returns 返回值数据类型 return 构造函数; |
创建函数2 | delimiter// create function 函数名(参数名 参数数据类型) returns 返回值数据类型 begin return 构造函数; end// delimiter; |
无参函数 | create function 函数名() returns 返回值数据类型 return 构造函数; |
调用函数 | select 函数名(字段名) from 表名; |
删除函数 | drop function [if exits] 函数名; |
- 加密函数
- MD5() 信息摘要算法加密
- select MD5(str); 对数据进行加密和界面处理,以32位十六进制数字的二进制字符串形式返回,若参数位null,则返回null
- password() 密码算法加密
- set password=password(‘新密码’); --在MySQL中修改密码
- mysqladmin -u用户名 -p旧密码 password 新密码 --在DOS中修改密码
- 区别
- 不同点:MD5返回数字加小写字母,password返回数字加大写字母加特殊符号
- 相同点:①都是加密的函数 ②都可以输入null
表
多表关系 | 描述 |
---|---|
一对多 | 在多的一方设置外键,关联一的一方的主键 |
多对多 | 建立中间表,中间表包含两个外键,关联两张表的主键 |
一对一 | 用于表结构拆分,在其中任何一方设置外键(unique),关联另一方的主键 |
多表查询 | 语法 |
---|---|
隐式内连接 | select 字段列表 from 表1,表2 where 条件 …; |
显式内连接 | select 字段列表 from 表1 [inner] join 表2 on 连接条件…; |
左外连接 | select 字段列表 from 表1 left [outer] join 表2 on 条件…; |
右外连接 | select 字段列表 from 表1 right [outer] join 表2 on 条件…; |
自连接 | select 字段列表 from 表1 别名1 join 表1 别名2 on 条件…; |
联合查询 | select 字段列表 from 表1 … union[all] select 字段列表 from 表2 …; |
嵌套查询(子查询) | select 字段列表 from 表1 where 字段1=(select 字段1 from 表2); |
- 内连接查询的是两张表交集的部分
- select * from 表1 as t1 [inner] join 表2 as t2 on t1.id=t2.id [inner] join 表3 as t3 on t1.id=t3.id;
- 外连接相当于查询表1(左表)的所有数据包含表1和表2交集部分的数据(右表同理)
- 自连接查询,可以是内连接查询,也可以是外连接查询
- 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
- union all会将全部的数据直接合并在一起,union会对合并之后的数据去重
- 子查询外部的语句可以是insert/update/delete/select的任意一个
- distinct注意事项
- distinct [查询字段],必须放在要查询字段的开头,即放在第一个参数;
- 只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用;
- DISTINCT 表示对后面的所有参数的拼接取不重复的记录,即查出的参数拼接每行记录都是唯一的
- 不能与all同时使用,默认情况下,查询时返回的就是所有的结果
子查询
子查询 | 常用操作符 | 返回结果 |
---|---|---|
标量子查询 | =、<>、>、>=、<、<= | 单个值 |
列子查询 | in、not in、any、some、all | 一列或多行 |
行子查询 | =、<>、in、not in | 一行或多列 |
表子查询 | in | 多行多列 |
-
用any、all、some关键字修饰子查询
-
例:select * from 表1 where 字段1 >any (select 字段2 from 表2);
-
any、all、some关键字放在比较运算符的后面
-
any和some是同义词,表示满足内层子查询的任何一个条件
-
all需要满足所有条件
-
-
使用[not] in 或exists的子查询
- 例:select * from 表1 where 字段1 in (select 字段2 from 表2);
- [not] in 与 in 的作用相反,exists同理
-
插入记录时使用子查询
- insert into 表1(字段1) select 字段1 from 表2 where 条件;
-
多表更新
update 表1 join 表2 on 表1.id = 表2.id set 旧值=新值 where 条件;
-
多表删除
//创建并复制表2的数据到 create table 表1 as select * from 表2; //删除 delete from 表1 left|right[outer] join 表2 on 表1.id=表2.id where 条件;
事务
事务操作 | 语法 |
---|---|
查看/设置事务提交方式 | select @@autocommit;//自动提交,默认为1 set @@autocommit=0;//手动设置提交 |
开启事务 | start transaction或begin; |
提交事务 | commit; |
回滚事务 | rollback; |
查看事务隔离级别 | select @@transaction_isolation; |
设置事务隔离级别 | set [session|global] transaction isolation level |
事务特性 | 描述 |
---|---|
原子性 | 事务是不可分割的最小操作单元,要么全部成功,要么全部失败 |
一致性 | 事务完成时,必须使所有的数据都保持一致状态 |
隔离性 | 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 |
持久性 | 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的 |
并发事务问题 | 描述 |
---|---|
脏读 | 一个事务读到另外一个事务还没有提交的数据 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影” |
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read(默认) | × | × | √ |
serializable | × | × | × |
事务隔离级别越高,数据越安全,但是性能越低
四、约束
- MySQL中常用的几种约束类型:
约束 | 描述 | 关键字 |
---|---|---|
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | primary key |
外键约束 | 用来让两张表的而数据之间建立连接,保证数据的一致性和完整性 | foreign key |
非空约束 | 限制该字段的数据不能为null | not null |
唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | unique |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | default |
检查约束(8.0.16版本之后) | 保证字段值满足某一个条件 | check |
MySQL相关问题
-
mysql默认端口号为3306,更改端口号之后cmd进入方式由
mysql -u root -p
变为mysql -u root -p -Pxxx
(xxx是更改之后的端口号)mysql -u root -p -P3308
-
查看端口号
mysql> show global variables like 'port';
-
sqlyog报错1251
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; Query OK, 0 rows affected (0.01 sec) mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';#更新用户密码 Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
-
sqlyog报错1418(无法创建函数)
//1.在客户端上执行 SET GLOBAL log_bin_trust_function_creators = 1; //2.MySQL启动时,加上 –log-bin-trust-function-creators选贤,参数设置为1 //3.在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加 log-bin-trust-function-creators=1
-
如何修改MySQL的登录密码?
mysqladmin -uroot -proot password mysql