学习 MySQL

Mysql:

mysql 指令末尾需要带 分号,否则无法执行指令

登录:

# 在 cmd 中
# USER 为用户名称
mysql -u USER -p
# 输入密码完成登录

修改密码

alter user user() identified by 新密码
# 或
# 类型有 localhost、% 
set password for '用户名'@'类型' = '密码'

数据库操作

查看数据库

show databases;

查看当前数据库下的数据表

show tables;

变更当前数据库

# DATABASENAME 需要变更的数据库名
use DATABASENAME

创建数据库

# DATABASENAME 需要创建的数据库名称
create database DATABASENAME

删除数据库

# DATABASENAME 需要删除的数据库名称
drop database DATABASENAME

表操作

创建表

# TABLENAME 需要创建的数据表名称
create table TABLENAME

表格式

# 创建 表 TABLENAME
# TABLENAME 表名称 
# 括号内为 表的格式操作
create table TABLENAME (
    # COLNAME 字段名称
    # CLASS() 类型 括号内为数据长度
    # 可选的 NOT NULL 表示为 数据不为空
    # 可选的 DEFAULT '默认值' 为设置默认值
    COLNAME CLASS() 

    # 设置表的主键
    # 括号内 为 需要设置为 主键的 COLNAME
    PRIMARY KEY()
);

查看表格结构

# TABLENAME 为需要查看的表名称
desc TABLENAME

删除表

# 删除 表 TABLENAME
# TABLENAME 为 需要删除的表名称
drop table TABLENAME

重命名表

# TABLENAME 需要重命名的表名称
# NEW_TABLENAME 新表名称
alter table TABLENAME, RENAME() NEW_TABLENAME

选取表数据

# 选取 COLNAME 的数据 它们来自于表 TABLENAME

# 可以使用 * 表示选取表中的所有 字段
# COLNAME 表示 需要选取的 字段名称
# TABLENAME 表示 需要选取数据的 表
select COLNAME from TABLENAME

插入表数据

# 插入数据 VALUENAME 到 TABLENAME 中的 KEYNAME
# KEY_VALUE 为 需要插入的数据
# KEYNAME 为 需要插入的数据的字段名称
# TABLENAME 为 需要插入数据的表名称
insert into TABLENAME (KEYNAME) value (KEY_VALUE)

更新表数据

# 更新 表 TABLENAME 设置字段 COLNAME 的值变更为 NEW_VALUE 条件为 当 COLNAME 的值为 COL_VALUE 时执行
# TABLENAME 为 需要更新的表名称
# COLNAME 为 需要变更数据的字段名称
# NEW_VALUE 为 需要更新的值
# COLNAME 为 条件字段名称
# COL_VALUE 为 条件值

# where 为 条件
update TABLENAME set COLNAME='NEW_VALUE' where COLNAME=COL_VALUE

删除表数据

# 删除 来自 TABLENAME 的 COLNAME=COL_VALUE 的数据
# TABLENAME 为 需要删除数据的表名
# COLNAME 为 需要删除数据的字段名称
# COL_VALUE 为 需要删除数据的条件值
delete from TABLENAME where COLNAME=COL_VALUE

添加表结构

# 对 表 TABLENAME 添加 COLNAME 字段 数据类型为 CLASS
# TABLENAME 为 需要添加表结构的表名称
# COLNAME 为 需要添加的字段名称
# CLASS 为 需要添加的字段的数据类型
alter table TABLENAME add COLNAME CLASS

修改表字段类型

# 对 表 TABLENAME 的 COLNAME 的数据类型 修改为 CLASS
# TABLENAME 为 需要修改的表名称
# COLNAME 为 需要修改数据类型的字段名称
# CLASS 为 新的 字段数据类型
alter table TABLENAME modify COLNAME CLASS

修改表字段名称

# 修改 表 TABLENAME 变更 COLNAME 为 NEW_COLNAME 类型为 CLASS
# COLNAME 为修改的字段名
# NEW_COLNAME 为修改的新字段名
alter table TABLENAME change COLNAME NEW_COLNAME CLASS

操作符

去重

distinct
# 选取所有不重复的 COLNAME
# 如果 distinct 后还有字段,则会一同去重
# distinct 后的字段一,字段二... 同时相同才会去重
select distinct COLNAME from TABLENAME

排序

order by
# COLNAME1, COLNAME2, COLNAME3 为 需要查询的字段
# TABLENAME 为需要查询的表
# SORTCOLNAME 为需要排序的字段名
# SORTHANDLE 为排序方式
# DESC 为降序
# ASC 为升序
# mysql 中 默认升序
select COLNAME1, COLNAME2, COLNAME3 from TABLENAME where order by SORTCOLNAME SORTHANDLE
# 选取来自表 TABLENAME 的 COLNAME1, COLNAME2 的数据
# 以 COLNAME1 为主键进行降序排序
select COLNAME1, COLNAME2 from TABLENAME where order by COLNAME1 desc

别名

as
# 选取所有来自表 TABLENAME 的 COLNAME 数据,并为其赋予别名 NEW_COLNAME
select COLNAME as NEW_COLNAME from TABLENAME
# 选取所有来自表 TABLENAME 的 COLNAME 数据,并为其赋予别名 NEW_COLNAME
# 并在条件中使用 赋予的别名 NEW_COLNAME 进行筛选
select COLNAME as NEW_COLNAME from TABLENAME where NEW_COLNAME=VALUE_NAME

约束

对表的字段添加约束

# 对 表 TABLENAME 添加 约束 键 KEYNAME1 和 主键 KEYNAME2
# TABLENAME 为 需要添加约束的表名称
# KEYNAME1 为 需要添加的约束的名称 便于删除
# KEYNAME2 为 需要设置为主键的 字段
alter table TABLENAME add constraint KEYNAME1 primary key(KEYNAME2)

常用字段约束

# KEYNAME 为 需要设置的字段名

# 非空约束 字段不允许为空
not null
# 默认约束 赋予某字段默认值
default
# 唯一约束 设置该字段值唯一,允许为空,但只能有一个空值
unique key(KEYNAME)
# 主键约束 可唯一标识该表记录
primary key(KEYNAME)
# 外键约束 用于在两表之间建立关系 需指定引用主表哪一字段
foreign key(KEYNAME)
# 自动增长 设置该字段为自增字段,默认每条自增1
auto_increment
# 检查约束 example 表达式,在添加值时检查
# 如 check <id > 0 and id < 1000>
# 即 id 值 必须大于 0 且 小于 1000
check <example>

创建表时设置约束

create table TABLENAME (
    id int(4) auto_increment comment '唯一id',
    NAME char(10) not null default '昵称' comment '注释'
    degree decimal(4, 1) comment '成绩',

    # CONSTRAINTNAME 为 设置的约束名
    # 可通过 CONSTRAINTNAME 修改约束

    # 设置主键
    constraint CONSTRAINTNAME primary key(id), 
    # 设置范围为 0 到 100
    constraint CONSTRAINTNAME check(degree >= 0 and degree <= 100)
    # 设置 外键为 TABLENAME 表的 主键
    # 外键与主键的数据类型必须相同
    # TABLENAME 必须设置主键
    constraint CONSTRAINTNAME foreign key (id) references TABLENAME(primaryKEYNAME)
)

外键约束

# CONSTRAINTNAME 约束名
# KEYNAME1 指定的外键字段名
# TABLENAME 主表名
# KEYNAME2 主表的主键名

# 外键与主键的类型必须一致
# 主表必须拥有主键
# 主键不允许含空值
constraint CONSTRAINTNAME foreign key(KEYNAME1) references TABLENAME(KEYNAME2)

条件查询

与或非

# 与
# 选择所有来自表 TABLENAME 的 COLNAME=COL_VALUE 和 COLNAME=COL_VALUE 的数据
select * from TABLENAME where COLNAME=COL_VALUE and COLNAME=COL__VALUE

# 或
# 选择所有来自表 TABLENAME 的 COLNAME=COL_VALUE 或 COLNAME=COL_VALUE
select * from TABLENAME where COLNAME=COL_VALUE or COLNAME=COL_VALUE

# 非
# 选择所有来自表 TABLENAME 的 COLNAME 不为 COL_VALUE
select * from TABLENAME where NOT COLNAME=COL_VALUE

选取范围

# 选取所有来自表 TABLENNAME 的 COLNAME 在 MIN_VALUE 和 MAX_VALUE 范围内的数据
select * from TABLENAME where COLNAME between MIN_VALUE and MAX_VALUE

模糊查询

# 选取所有来自表 TABLENAME 的 COLNAME 的值包含 value,以 value 开头 的数据
# 通配符 % 表示任意多个字符
# 通配符 _ 表示任意一个字符
select * from TABLENAME where COLNAME like 'value%'

# 选取所有来自表 TABLENAME 的 COLNAME 的值不包含 value,以 value 开头 的数据
select * from TABLENAME where COLNAME not like 'value%'

正则表达式

# 选取所有来自表 TABLENAME 的 COLNAME 符合正则 regexp 的数据
select * from TABLENAME where COLNAME regexp 'REGEXP'

列表查询

# 选取所有来自表 TABLENAME 的 COLNAME 值被 item1, item2,item3 任意一项所匹配的数据
select * from TABLENAME where COLNAME in(item1, item2, item3)
# 选取所有来自表 TABLENAME 的 COLNAME 值不被 item1, item2,item3 任意一项所匹配的数据
select * from TABLENAME where COLNAME not in(item1, item2, item3)

空值查询

# 选取所有来自表 TABLENAME 的 COLNAME 值是空的数据
select * from TABLENAME where COLNAME is null
# 选取所有来自表 TABLENAME 的 COLNAME 值不是空的数据
select * from TABLENAME where COLNAME is not null

限制行数

# 选取所有来自表 TABLENAME 的所有数据
# 限制返回的行数为 ROWNUMBER
# 偏移 OFFSETNUMBER 即 从 第 OFFSETNUMBER 条数据 开始获取
select * from TABLENAME limit OFFSETNUMBER ROWNUMBER

条件运算

  • = 等于 不能用于过滤 null
  • <=> 安全等于 可以过滤 null
  • > 大于
  • < 小于
  • >= 大于等于
  • <= 小于等于
  • <> 或 != 都表示不等于

统计函数

分组:

# 选择所有来自 TABLENAME 的数据
# 以 COLNAME 为分组依据
select * from TABLENAME group by COLNAME

过滤

# 选择来自 TABLENAME 的所有 COLNAME 列数据
# 以 COLNAME 为分组依据进行分组
# 过滤掉 COLNAME < 100 的数据
# 只显示 COLNAME > 100 的数据
select COLNAME from TABLENAME group by COLNAME having COLNAME > 100

聚合函数

要求获取最大值,平均值,最小值等聚合数据时使用

求平均值

# 选取所有来自表 TABLENAME 的 COLNAME 数据
# 将其平均值显示在 SHOWCOLNAME 下面
# 忽略 null 值
# 可以使用 distinct 进行去重操作 avg(distinct COLNAME)
select avg(COLNAME) SHOWCOLNAME from TABLENAME

# 选取所有来自表 TABLENAME 的 GROUPNAME 的数据 和 COLNAME 的平均值
# 并以 GROUPNAME 为分组依据进行分组
select GROUPNAME, avg(COLNAME) SHOWCOLNAME from TABLENAME group by GROUPNAME

# 选取所有来自表 TABLENAME 的 GROUPNAME 的数据 和 COLNAME 的平均值
# 并以 GROUPNAME 为分组依据进行分组
# 过滤掉 平均值大于 50 的数据
select GROUPNAME, avg(COLNAME) SHOWCOLNAME from TABLENAME 
group by GROUPNAME having avg(COLNAME) > 50

计数

# 选取所有来自表 TABLENAME 的数据
# 将其条目数量显示在 SHOWCOLNAME 下
# as 和 SHOWCOLNAME 为可选的
# 若不加则条目数量显示在 count(*) 列下
# count(*) 为选择所有 包含 空值
# count(all COLNAME) 选取所有值非空的 COLNAME
# count(distinct COLNAME) 选取所有唯一非空值的 COLNAME
select count(*) as SHOWCOLNAME from TABLENAME

求和

# 选取所有来自表 TABLENAME 的 COLNAME 和 COLNAME1与COLNAME2 的和
# 以 COLNAME 为分组依据进行分组
# 将 COLNAME1 和 COLNAME2 的和 显示在 总和 列下
# sum(distinct COLNAME) 去重求和
# sun 自动忽略空值
# 如果没有匹配的行 则 sum 返回 null 而非 0
select COLNAME sum(COLNAME1, COLNAME2) as 总和 from TABLENAME group by COLNAME

最大值

# 选取 TABLENAME 中 COLNAME 的最大值
# 并显示在 最大值 列下
select max(COLNAME) as 最大值 from TABLENAME

最小值

# 选取 TABLENAME 中 COLNAME 的最小值
# 并显示在 最小值 列下
select min(COLNAME) as 最小值 from TABLENAME

字符串函数

MySQL 支持各种字符集,可使用 `show character set` 获取 MySQL数据库服务器所支持的所有字符集*

拼接字符串

# concat 需要至少一个字符串参数
# concat 会将传入字符串拼接成字符串
# concat 会在连接之前将所有参数转为字符串类型,如果任意参数为 null, 则返回 null

# 选取字符串,默认显示在 concat('a', '1') 列下
select concat('a', '1');
# 选取字符串, 显示在赋予的别名 COLNAME 列下
select concat('a', '1') as COLNAME;
# 选取表 TABLENAME 的 NAME, AGE 两列数据 并拼接输出
select concat('名叫:', NAME, '今年', AGE, '岁') from TABLENAME

使用分隔符拼接字符串

# 使用 concat_ws 可以使用分隔符拼接字符串
# concat_ws 第一个参数为 后续参数的分隔符
# concat_ws 会忽略第一个参数以外的 其它 null 参数
# 如果 concat_ws 的第一个参数为 null 则 返回 null
# 选取表 TABLENAME 的 YEAR_VALUE MONTH_VALUE DAY_VALUE 三列数据以 - 为分割符
# 显示在 日期 列下
select concat_ws('-', YEAR_VALUE, MONTH_VALUE, DAY_VALUE) as 日期 from TABLENAME;

获取字符串长度

获取以字节为单位的字符串长度
length(str)
获取以字符为单位的字符串长度
char_length(str)
```mysql
# 将 字符串 转换为 ucs2 字符集
# ucs-2 Unicode 指定一个字符存储为 2 个字节
# 分别使用 char_length 和 length 获取 @s 的长度
set @s = convert('字符串', using ucs2);
# @s 以 2 个字节存储每个字符,因此
# char_length(@s) 获取的值为 3
# length(@s) 获取的值为 6
select char_length(@s), length(@s);

获取字符串左侧指定位置

# left(str, length)
# str 为 需要提取出子字符串的父字符串
# length 为指定返回字符数
# 如果 两个参数任意一个为 null 则 返回 null
# 如果 length 为 0 或 为负 则返回空字符串
# 如果 length 大于 str 的长度 则 返回整个 str
select left('123456789', 5) # 12345

替换字符串

# replace(str, old_string, new_string)
# replace 允许用新的字符串代替列中的字符串
# str 为 父字符串
# old_string 为 被替换的字符串
# new_string 为 替换的字符串

# 有一个 replace 的语句用于 插入或更新数据,需要注意

# 选取表 TABLENAME 的 NAME 如果 值为 null 则使用 查无此人 代替
select replace(NAME,'null', '查无此人') from TABLENAME

从指定位置返回指定长度字符串

# substring(str, position)
# str 为 提取子字符串的父字符串
# position 为整数 指定子串的开始字符的位置 可以使正负整数
# 如果 position 为 0 则返回空字符串
# 如果要指定获取的子字符串长度 则 可以添加第三个参数 length
# substring(str, position, length)
select substring('__MySQL-SERVER__', 3, 12);# MySQL-SERVER

删除不必要字符

# trim({botn | leading | trailing} [remove_str] from str)
# leading 为前导字符, trailing  为尾随字符, botn 为前导和尾随字符
# 如果未指定 则默认使用 botn 即 删除前导和尾随字符
# remove_str 是删除的字符串,默认情况下,是空格,即 如不指定,仅删除空格
# str 为是删除子字符串 remove_str 的父字符串
# trim 返回字符串, 删除不需要字符
select trim('-' from '--awdawd--') # awd

# 如果数据已存在, 且要清理空格或其它字符,可在 update 语句使用 trim() 函数
update COLNAME set COLNAME=trim(COLNAME)

# 如果仅删除前导或尾随空格,可使用 ltrim 和 rtrim 函数

查找列表中的指定字符串

# find_in_set(needle, haystack)
# needle 为查找字符串
# haystack 为需要搜索的字符串列表
# 如果 任意参数为 null 则返回 null
# 如果 needle 不在 haystack 或 haystack 为空 返回 0
# 如果 needle 在 haystack 中 返回正整数

# 如果 needle 包含逗号则无法正常工作
# 如果 needle 为常量字符串,且 haystack 是类型为 set 的列
# mysql 将使用位算术优化

# 'x, y, z' 返回 0
# 'x,y,z' 返回 2
# 原因是 第一个包含了空格
select find_in_set('y', 'x,y,z') # 2
# 可使用 not 否定 返回的结果值, not 0 = true, not [1 ~ ...] = false

格式化字符串

# fomrat(number, double, locale)
# number 为需要格式化数字
# double 为保留小数位数
# locale 是可选的,用于确定 千个分隔符和分隔符之间的分组
# 如省略,则默认使用 en_US
# 有些地区是以 . 进行分割的
select format(123456.789, 2, 'zh_cn') # 123456.78
```mysql
CREATE TABLE `user_xly` (
  `phoneno` char(12) NOT NULL COMMENT '手机号码',
  `balance` int DEFAULT '0' COMMENT '余额',
  `cid` char(20) NOT NULL COMMENT '身份证',
  `name` char(10) NOT NULL COMMENT '姓名',
  `status` char(2) NOT NULL DEFAULT '2' COMMENT '手机状态',
  PRIMARY KEY (`phoneno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


select 
avg(stuscore) as '平均分', 
cno as '选课门数' 
from stumarks 
where order by avg(stuscore) 
having cno >= 1; 

控制语句

#   if 语句
##  search_condition 表示条件判断语句
##  statement_list 可包括多个语句
IF search_condition THEN satement_list
ELSEIF search_condition THEN satement_list
ELSE statement_list
END IF


#   case 语句
##  search_condition 条件判断语句
##  when_value 条件判断变量 与 case_value 配合使用
CASE [case_value]
    WHEN search_condition THEN statement_list
    WHEN when_value THEN statement_list
    [WHEN search_condition THEN statement_list]
    [WHEN when_value THEN statement_list]
    ELSE statement_list
END CASE


#   loop 语句
##  同一层下 begin_label 和 end_label 必须相同
##  loop 没有停止循环语句
##  需通过 LEAVE 语句停止
[begin_label] LOOP
    statement_list
END LOOP [end_label]

#   leave 语句 break
##  离开 label 标志的循环
LEAVE label

#   iterate 语句 coutinue
##  再次循环
ITERATE label

#   repeat 语句
##  将重复执行 statement_list
##  知道 search_condition 返回 true
[begin_label] REPEAT
    statement_list
    UNTIL search_condition
END REPEAT [end_label]

#   while 语句
##  重复执行 statement_list
##  直到 search_condition 为 true
[begin_label] WHILE search_condition DO
    statement_list
END WHILE [end_label]

存储过程

CREATE
    [DEFINER] = { user | current_user }
    PROCEDURE NAME ([proc_parameter][,...])
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

characteristic:
        COMMENT 'string'
    |   LANGUAGE SQL
    |   { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}
    |   SQL SECURITY { DEFINER | INVOKER }

routine_body:
    Valid SQL routine statement

[begin_label] BEGIN
    [statement_list]
END [end_label]

#   语法
##  修改语句结束符
##  将语句结束符变更为 $$ 而非 ;
DELIMITER $$

#   声明存储过程
##  创建存储过程 NAME
##  接受参数 params 类型为 int
##  可以是字面量或变量
CREATE PROCEDURE NAME ( IN params int )
##  输出参数 params 类型为 int
##  可返回多个值,传出值只能是变量
##  传入变量参数,返回时将自动变更传入变量值
CREATE PROCEDURE NAME ( OUT params int )
##  输入输出参数 params 类型为 int
##  传出值只能是变量
##  传入变量参数,返回时将自动变更传入变量值
##  尽量少用
CREATE PROCEDURE NAME ( INOUT params int )
##  如果过程无参数
##  也需要在过程名后写上小括号
CREATE PROCEDURE NAME ()

#   开始和结束符
##  BEGIN_LABEL 和 END_LABEL 为可自定义的
##  开始和结束标签
##  可以嵌套
##  嵌套中的每条语句必须以 ; 结尾
BEGIN_LABEL BEGIN
    ...
END END_LABEL

#   变量赋值和定义
##  赋值
### 设置 @var 变量值为 1
SET @var=1
##  定义
### 声明 num 为 无符号整数 类型 值为 40000
DECLARE num int unsigned default 40000

#   创建函数
##  创建函数 NAME 接受参数 params
CREATE FUNCTION NAME(params)

#   调用存储过程
##  NAME 为存储过程名
##  PARAMS 为需要的参数
CALL NAME(PARAMS)

#   查看存储过程的详细
##  显示在 DATABASE 中 创建的存储过程时的详细
SHOW CREATE PROCEDURE DATABASE.PROCEDURENAME

#   修改存储过程
ALTER PROCEDURE

学习 MySQL
http://localhost:8080/archives/87ff57ca-533b-400a-8333-884c4cc4dd58
作者
inksha
发布于
2024年09月14日
许可协议