一.SQL-DDL(数据定义语言)
1.数据库操作
1.查询
SHOW DATABASES;
SELECT DATABASE();
创建
CREATE DATABASE[IF NOT EXISTS] 数据库名 [DEFAULT CHARSET字符集] [COLLATE排序规则];
eg:
CREATE DATEBASE[IF NOT EXISTS] IT DEFAULT CHARSET UTF8MB4;
删除
DROP[IF EXISTS] 数据库名;
eg:
DORP [IF EXISTS] IT;
使用
USE 数据库名;
eg:
USE IT;
2.表操作
1创建&查询(操作对象为表自身的信息)
创建
CREATE TABLE 表名 (
字段1 字段1类型[COMMENT 字段1注释];
字段2 字段2类型[COMMENT 字段2注释];
字段3 字段3类型[COMMENT 字段3注释];
.....
字段n 字段n类型[COMMENT 字段n注释]
)[COMMENT 表注释];
eg:
CREATE TABLE user(
id int comment'编号';
name varchar(50) comment'姓名';
age int comment'年龄';
gender varchar(1) comment'性别'
) comment'用户表';
查询
SHOW TABLES;
DESC 表名;
eg:
DESC user;
SHOW CREATE TABLE 表名;
eg:
SHOW CREATE TABLE user;
修改&删除
ALTER TABLE 表名 ADD 字段 字段类型(长度) [COMMENT 注释][约束];
eg:
ALTER TABLE emp ADD nickname varchar(50) COMMENT 注释'昵称'[约束];
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)[COMMENT 注释][约束];
eg:
ALTER TABLE emp CHANGE nickname username varchar(30)COMMENT '用户名';
ALTER TABLE 表名 DROP 字段名;
eg:
ALTER TABLE emp DROP nickname;
ALTER TABLE 表名 RENAME TO 新表名;
eg:
ALTER TABLE emp RENAME TO employ;
DROP TABLE [IF EXISTS] 表名;
eg:
DROP TABLE [IF EXISTS] employ;
TRUNCATE TABLE表名;
eg:
TRUNCATE TABLE employ;
二.SQL-DML(数据操作语言)
1.插入(操作对象为表中的数据)
INSERT INTO 表名 (字段1,字段2,....) VALUES (值1,值2,....);
eg:
INSERT INTO 表名 (id,workno,name) VALUES (3,3,"张三");
INSERT INTO 表名 VALUES (值1,值2,....);
INSERT INTO 表名 (字段1,字段2,....) VALUES (值1,值2,....),(值1,值2,....),(值1,值2,....);
eg:
INSERT INTO 表名 (id,workno,....) VALUES (3,3,....),(4,4,....);
INSERT INTO 表名 VALUES (值1,值2,....),(值1,值2,....),(值1,值2,....);
2.更新&删除(操作对象为表中的数据)
1.修改数据
UPDATE 表名 SET 字段名1=值1,字段名2=值2....[WHERE 条件];
无条件则表内相关数据都被修改
2.删除数据
DELETE FROM 表名 [WHERE 条件];
无条件则表内相关数据都被删除
三.SQL-DQL(数据查询语言)
1.基本查询
1.查询多个字段
SELECT 字段1,字段2,.....FROM 表名;
SELECT * FROM 表名;
2.设置别名
SELECT 字段1[AS别名1],字段2[AS别名2],.....FROM 表名;
SELECT 字段1[' '(空格)别名1],字段2[' '(空格)别名2],.....FROM 表名;
3.去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
2.条件查询
1.语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
2.条件
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<>或= 不等于
BETWEEN...AND... 在某个范围之间
IN(...) 在in之后的列表中的值
LIKE 占位符 模糊匹配
IS NULL NULL
AND 或 && 并
OR 或 || 或
NOT 或 ! 非
3.模糊查询
-
一个’_'表示有一个字符
-
'%'表示不管有几个字符,该例表示不管前面有几个字符,只要最后一个字符是X即可
3.聚合函数
1.介绍
将一列数据作为一个整体,进行纵向计算
2.常见聚合函数
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和
3.语法
SELECT 聚合函数(字段列表) FROM 表名;
4.分组查询
SELECT 字段列表 FROM 表名[WHERE 条件]GROUP BY 分组字段名 [HAVING 分组后过滤条件]
where与having区别:
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
- 执行顺序: where >聚合函数>having
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
5.排序查询
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
如果是多字段排序,当第一个字段相同时才会根据第二个字段进行排序
6.分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
注意:
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数,分页查询
- 是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT如果
- 查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
四.SQL-DCL (数据控制语言)
1.用户管理
1.查询用户
USE mysql;
SELECT * FROM user;
2.创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '新密码';
3.修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
%通识符,表全部
4.删除用户
DROP USER '用户名'@'主机名';
2.权限控制
1.查询权限
SHOW GRANTS FOR '用户名'@'主机名';
2.授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
3.撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意:
- 多个权限之间,使用逗号分隔
- 授权时,数据库名和表名可以使用*进行通配,代表所有。
五.函数
SELECT 函数(参数);
1.字符串函数
CONCAT(S1,S2)
LOWER(str)
UPPER(str)
LPAD(str,n,pad)
用字符串pad对str左边进行填充,使长度达到n
RPAD(str,n,pad)
用字符串pad对str右边进行填充,使长度达到n
TRIM(str去除字符串str头部和尾部的空格
SUBSTRING(str,start,len)
返回从字符串str从start位置起始的len个长度的字符串
2.数值函数
CEIL(x)
eg:
select ceil(1.1);
2
FLOOR(x)
eg:
select ceil(1.9);
1
MOD(x,y)
eg:
select mod(7,4);
3
RAND()
eg:
select RAND();
0.3747741034019497
ROUND(x,y)
eg:
select ROUND(2.345,2);
2.35
3.日期函数
CURDATE()
eg:
select curdate();
2024-3-22
CURTIME()
eg:
select curtime();
10:17:01
NOW()
eg:
select now();
2024-3-22 10:17:01
YEAR(date)
eg:
select YEAR(now());
2024
MONTH(date)
eg:
select MONTH();
3
DAY(date)
eg:
select DAY();
22
DATE_ADD(date,INTERVAL expr type)
返回一个日期date加上日期间隔expr后的日期
eg:
select date_add(now(),INTERVAL 70 MONTH);
2094-3-22 10:17:01
DATEDIFF(date1,date2)
返回起始date1和终止date2之间的天数
eg:
select datediff(2024-4-1,2024-3-1);
31
4.流程函数
IF(value,t,f)
如果value值为true则返回t,为false则返回f
eg:
select if(true,'ok','error');
ok
select if(false,'ok','error');
error
IFNULL(value1,value2)
如果value1不为空,则返回value1,否则返回value2
eg:
select ifnull(null,'ok','no');
no
select ifnull(123,'ok','no');
ok
select ifnull(' '(空格),'ok','no');
ok
CASE WHEN [val1] THEN [res1]... ELSE [default] END (when then可写多个)
如果val1值为true,返回res1,...否则返回默认值default
CASE [expr] WHEN [val1] THEN [res1]... ELSE [default] END
如果expr值为val1,返回res1,...否则返回默认值default
eg:
需求:查询emp表的员工姓名和工作地址,北京/上海返回1线城市,其他返回二线城市
select name,( case workadress when '北京' then '1线城市' when '上海' then '1线城市' else '2线城市' end )as'工作地址' from emp;
六.约束
1.约束
NOT NULL
限制该字段的数据不能为null
UNIQUE
保证该字段的所有数据都是唯一的不重复的
PRIMARY KEY
主键是一行数据的唯一标识,要求非空且唯一
DEFAULT
保存数据时,如果未指定该字段的值,则采用默认值
CHECK
保证字段值满足某一条件
FOREING KEY
用来让两张表的数据之间建立联系,保证数据的完整性和一致性
2.外键约束
CREATE TABLE 表名 (
字段1 字段1类型[COMMENT 字段1注释];
.....
字段n 字段n类型[COMMENT 字段n注释]
[CONSTRAINT] [外键名称] FOREING KEY (外键字段名) REFERENCES 主表(主表列名)
);
ALTER TABEL 表名 ADD CONSTRAINT 外键名称 FOREING KEY (外键字段名) REFERENCES 主表(主表列名);
eg:
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREING KEY (dept_id) REFERENCE dept(id);
3.外键删除更新行为
no action 当在父表中删除/更新对应记录时,
首先检查该记录是否有对应外键,如果有则不允许删除/更新
restrict 当在父表中删除/更新对应记录时,
首先检查该记录是否有对应外键。如果有则不允许删除/更新
cascade 当在父表中删除/更新对应记录时,
首先检查该记录是否有对应外镜,如果有,则也删除/更新外键
在子表中的记录。
set null 当在父表中国际对应记录时,
首先检查该记录是否有对应外键,如果有则设置子表中该外健
值为null
set default 父表有变更时,子表将外键列设置成一个默认的值
七.多表查询
1.内连接
1.隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件...;
2.显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件...;(INNER可省略)
2.外连接
1.左外连接
SELECT 字段列表 FORM 表1 LEFT [OUTER] JOIN 表2 ON 条件...;(OUTER可省)
2.右外连接
SELECT 字段列表 FORM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;(OUTER可省)
3.自连接
SELECT 列表字段 FROM 表A 别名A JION 表A 别名B ON 条件...;
自连接查询,可以是内连接查询,也可以是外连接查询
4.联合查询
SELECT 字段列表 FROM 表A 条件...
UNION[ALL] 有all查询结果去除重复项
SELECT 字段列表 FROM 表B 条件...
列数和字段类型必须保持一致
5.子查询
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个
1.标量子查询(子查询结果为单个值)
2.列子查询(子查询结果为一列)
IN 在脂定的集合范围之内,多选一
NOT IN 不在指定的集合范围之内
ANY 子查询返回列表中,有任意一个满足即可
SOME 与ANY等同,使用SOME的地方都可以使用ANY
ALL 子查询返回列表的所有值都必须满足
3.行子查询(子查询结果为一行)
常用操作符
= 、 <> 、 IN 、 NOT IN
4.表子查询(子查询结果为多行多列)
常用操作符
IN
八.事务
事务操作
SELECT @@autocommit;
SET @@autocommit=0/1;
COMMIT;
ROLLBACK;
事务四大特性
-
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
-
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
-
隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
-
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
并发事务问题
1.赃读
一个事务读到另一个事务未提交的数据
2.不可重复读
一个事务先后读取同一记录,但两次读取数据不同,称之为不可重复读
不可重复读
修改事务隔离级别后可重复读
3.幻读
一个事务按照条件查询数据时,没有对应的数据,但插入数据时,又发现该数据已经存在了
事务隔离级别
1.查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
2.设置事务隔离级别
SET [SESSION/GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE};
九.索引
1.结构
mysql索引数据结构对经典的b+tree进行了优化。在原b+tree的基础上,增加一个指向相邻叶子书点的转表指针,就形成了带有原序
指针的b+tree,提高区间访问的性能。
1.Hash索引
hash索引特点
- hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<,…)
- 无法利用索引完成排序操作
- 查询效率高,通常只需要一次检索就可以了,效率通常要高于b+tree索引
2.索引结构
主键索引 针对于表中主键创建的索引 默认自动创建,只能有一个
唯一索引 避免同一个表中某数据列中的值重复 可以有多个
常规索引 快速定位特定数据 可以有多个
全文索引 全文索引查找的是文本中的关键词,而不是比较索引中的值 可
以有多个
聚集索引 将数据存储与索引放到了一块,索引结构的叶子节点保存了
数据 必须有,而且只有一个
二级索引 将数据与索引分开存储,索引结构的叶子节点关联的是对应的
主键 可以存在多个
聚集索引选取规则:
- 如果存在主键,主键索引就是聚集索引
- 如果不存在主键,将使用第一个唯一(unique)索引作为聚集索引
3.语法
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_col_name,...);
SHOW INDEX FROM index_name;
DROP INDEX index_name ON table_name;
标签:填满,索引,数据库,查询,差点,字段,表名,eg,SELECT
From: https://blog.csdn.net/2301_82341091/article/details/141218146