MySQL 入门


文章目录

  • `MySQL 入门`
    • `1. 查询语句`
      • `1.1 SQL的分类`
      • `1.2 单表select语句`
      • `1.3 多表select语句`
      • `1.4 单行函数`
      • `1.5 聚合函数`
      • `1.6 子查询`
    • `2. 数据库与表操作`
      • `2.1 数据库操作`
      • `2.2 表操作`
      • `2.3 数据操作`
      • `2.4 视图`
    • `3. 存储过程`
      • `3.1 入门`
      • `3.2 变量`
      • `3.3 参数传递`
      • `3.4 条件`
      • `3.5 循环`
      • `3.6 游标`
      • `3.7 句柄`
      • `3.8 存储函数`
    • `4. 触发器`
      • `4.1 概述`
      • `4.2 操作`
      • `4.3 new,old`
    • `5. 索引`
      • `5.1 普通索引`
      • `5.2 唯一索引`
      • `5.3 主键索引`
      • `5.4 组合索引`
      • `5.5 全文索引`
      • `5.6 空间索引`

1. 查询语句

1.1 SQL的分类

# DDL: 数据定义语言  create \ alter \ drop \ rename \ truncate
# DML: 数据操作语言  insert \ delete \ update \ select
# DCL: 数据控制语言  commit \ rollback \ savepoint \ grant \ revoke
1.2 单表select语句

  1. select...from...
select * from employees;
select employee_id, salary from employees;
  1. 列的别名
select employee_id emp_id from employees;
select employe_id as emp_id from employees;     # as 可省略, 别名可用"" eg "部门id"
  1. 去除重复行
select distinct department_id from employees;  # 字段前 + distinct
select salary, distinct department_id from employees;  # 错误
select distinct department_id, salary, from employees;  # 整体去重, 没实际意义
  1. 空值参与运算
# null 不等同于0, '', 'null'
# 空值参与运算 结果一定为空
select employee_id, salary "月工资", salary * (1 + commision_pct) * 12 "年工资"
from employees;     # commision_pct为null的 年工资全为nullselect employee_id, salary "月工资", salary * (1 + ifnull(commision_pct, 0)) * 12 "年工资"
from employees;     # 使用ifnull()
  1. 着重号
select * from order;  # 错误 order为关键字
select * from `order`;
  1. 查询常数
select "Mysql", employee_id, last_name from employees; # 三列, 匹配常数Mysql
  1. 显示表结构
describe employees;  # 显示表中相关字段的详细信息
desc employees;
  1. 过滤数据
# 查询90号部门的员工信息
select * from employees where department_id = 90;
  1. 运算符
# 算术运算符 +, -, *, /, div, %, mod
# 比较运算符 =, <=> 安全等于, <>(!=) 不等于, <, <=, >, >=# is null, is not null, isnull
select last_name, salary, commision_pct from employees where commision_pct is null;# least(), greatest()
select least('g', 'b', 'r'), greatest('g', 'T', 'c') from dual;# between..and...    闭区间, between前可加not
select employee_id, last_name, salary from employees where salary between 6000 and 8000;# in, not in
select last_name, salary, department_id from employees where department_id in (10, 20, 30);# like, % 代表不确定个数的字符, _代表一个不确定字符
# 查询第二个字符是'_' 且 第三个字符为 'a'的员工信息  --> 使用转义字符
select last_name from employees where last_name like '_\_a%';# regexp, rlike 正则表达式# 逻辑运算符: or, ||, and, &&, not, !, XOR(逻辑异或, 一真一假)
select last_name, salary, department_id
from employees
where department_id = 50 and salary >= 10000;# 位运算符: &, |, ^, ~, >
  1. 排序
select employee_id, last_name, salary from employees order by salary desc;  # desc asc
  1. 分页
# limit 分页
select employee_id, last_name, salary from employees limit 0, 20;   # START_INDEX, PAGESIZE

1.3 多表select语句

  1. 笛卡尔积
# 1 -> x, 每个员工都与每个部门匹配了一遍, 笛卡尔积(交叉连接), 缺少了多表的连接条件
select employee_id, department_name from employees, department;
  1. 等值连接
select e.employee_id, d.department_name
from employees e, departments d
wheree.department_id = d.department_id;
  1. 非等值连接
selecte.last_name, e.salary, j.grade_level
fromemployees e, job_grades j
wheree.salary between j.lowest_sal and j.highest_salary;
  1. 自连接
selecte.employee_id, e.last_name, m.employee_id, m.last_name
fromemployees e, employees m
wheree.manage_id = m.employee_id;
  1. 非自连接
# 以上几个case均为非自连接
  1. 内连接
# 以上几个case均为内连接
  1. 外连接
# 查询所有的员工的employee_id, department_name 信息
# SQL92语法实现外连接 使用 (+), MySQL 不支持
selecte.employee_id, d.department_name
fromemployees e, departments d
wheree.department_id = d.department_id(+);# SQL99 语法使用join..on.. 实现多表查询
selecte.employee_id, d.department_name
fromemployees e
left outer joindepartments d
one.department_id = d.department_id;   # 左外连接selecte.employee_id, d.department_name
fromdepartments d
right outer joinemployees e
ond.department_id = e.department_id;   # 右外连接selecte.employee_id, d.department_name
fromdepartments d
full outer joinemployees e
ond.department_id = e.department_id;   # 满外连接, MySQL不支持
  1. union
# union union all, 结果集连接
# union: 会执行去重
# union all: 不会执行去重
  1. SQL99 7种join操作

# 内连接, 中图
selecte.employee_id, d.department_id
fromemployees e
inner joindepartments d
one.department_id = d.department_id;
# 左外连接, 左上图
selecte.employee_id, d.department_id
fromemployeesd e
left joindepartments d
one.department_id = d.department_id;
# 右外连接, 右上图
selecte.employee_id, d.department_id
fromemployeesd e
right joindepartments d
one.department_id = d.department_id;
# 左外连接, 左中图
selecte.employee_id, d.department_id
fromemployeesd e
left joindepartments d
one.department_id = d.department_id
whered.department_id is null;
# 右外连接, 右中图
selecte.employee_id, d.department_id
fromemployeesd e
right joindepartments d
one.department_id = d.department_id
wheree.department_id is null;
# 满外连接, 左下图
# 左上图 + 右中图 或 右上图 + 左中图
selecte.employee_id, d.department_id
fromemployeesd e
left joindepartments d
one.department_id = d.department_id
union all
selecte.employee_id, d.department_id
fromemployeesd e
right joindepartments d
one.department_id = d.department_id
wheree.department_id is null;
# 右下图, 左中图 + 右中图
selecte.employee_id, d.department_id
fromemployeesd e
left joindepartments d
one.department_id = d.department_id
whered.department_id is null
union all
selecte.employee_id, d.department_id
fromemployeesd e
right joindepartments d
one.department_id = d.department_id
wheree.department_id is null;
1.4 单行函数

  1. 数值函数
- ABS(x) 返回x的绝对值
- avg(expression) 返回一个表达式的平均值,expression 是一个字段
- CEIL(x)/CEILING(x) 返回大于或等于 x 的最小整数
- FLOOR(x) 返回小于或等于 x 的最大整数
- EXP(x) 返回 e 的 x 次方
- greatest(expr1, expr2, expr3, …) 返回列表中的最大值
- least(expr1, expr2, expr3, …) 返回列表中的最小值
- LN 返回数字的自然对数
- LOG(x) 返回自然对数(以 e 为底的对数)
- max(expression)返回字段 expression 中的最大值
- min(expression)返回字段 expression 中的最大值
- POW(x,y)/POWER(x,y)返回 x 的 y 次方
- RAND()返回 0 到 1 的随机数
- ROUND(x)返回离 x 最近的整数
- SIGN(x)返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1
- SQRT(x)返回x的平方根
- sum(expression)返回指定字段的总和
- truncate(x,y)返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)
  1. 字符串函数
- ANSII(s) 返回字符串 s 的第一个字符的 ASCII 码
- LENGTH/CHAR_LENGTH(s)/CHARACTER_LENGTH(s)返回字符串 s 的字符数
- concat(s1,s2…sn)字符串 s1,s2 等多个字符串合并为一个字符串
- FIND_IN_SET(s1,s2)返回在字符串s2中与s1匹配的字符串的位置
- FORMAT(x,n)函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入
- insert(s1,x,len,s2)字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
- LOCATE(s1,s)从字符串 s 中获取 s1 的开始位置
- LCASE(s)/LOWER(s)将字符串 s 的所有字母变成小写字母
- UCASE(s)/UPPER(s)将字符串 s 的所有字母变成大写字母
- TRIM(s)去掉字符串 s 开始和结尾处的空格
- LTRIM(s)去掉字符串 s 开始处的空格
- RTRIM(s)去掉字符串 s 结尾处的空格
- SUBSTR(s, start, length)从字符串 s 的 start 位置截取长度为 length 的子字符串
- SUBSTR/SUBSTRING(s, start, length)从字符串 s 的 start 位置截取长度为 length 的子字符串
- POSITION(s1 in s)从字符串 s 中获取 s1 的开始位置
- REPEAT(s,n)将字符串 s 重复 n 次
- REVERSE(s)将字符串s的顺序反过来
- STRCMP(s1,s2)比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1
  1. 日期时间函数
- CURDATE()/CURRENT_DATE()返回当前日期
- CURRENT_TIME()/CURTIME()返回当前时间
- CURRENT_TIMESTAMP()返回当前日期和时间
- ADDDATE(d,n)计算起始日期 d 加上 n 天的日期
- ADDTIME(t,n)时间 t 加上 n 秒的时间
- date()从日期或日期时间表达式中提取日期值
- DAY(d)返回日期值 d 的日期部分
- DATEDIFF(d1,d2)计算日期 d1->d2 之间相隔的天数
- DATE_FORMAT按表达式 f的要求显示日期 d
- DAYNAME(d)返回日期 d 是星期几,如 Monday,Tuesday
- DAYOFMONTH(d)计算日期 d 是本月的第几天
- DAYOFWEEK(d)日期 d 今天是星期几,1 星期日,2 星期一,以此类推
- DAYOFYEAR(d)计算日期 d 是本年的第几天
- EXTRACT(type from d)从日期 d 中获取指定的值,type 指定返回的值
- DAYOFWEEK(d)日期 d 今天是星期几,1 星期日,2 星期一,以此类推
- UNIX_TIMESTAMP()得到时间戳
- FROM_UNIXTIME()时间戳转日期
  1. 流程控制函数
- if(value,value1,value2)  如果value的值为TRUE,返回value1,否则返回value2
- ifnull(value1,value2)  如果value1不为null,返回value1,否则返回value2
- case when 条件1 then 结果1 when 条件2 then 结果2 …[ELSE result] end 相当于Java中的if … else if … else …
- case expr when 常量值1 then 值1 when 常量值2 then 值2… [ELSE 值n] end 相当于Java中的switch… case…
  1. 加密解密函数
- PASSWORD(str) 返回字符串str的加密版本,41位长的字符串。加密结果 不可逆 ,常用于用户的密码加密
- MD5(str) 返回字符串str的md5加密后的值,也是一种加密方式。若参数为null,则会返回null
- SHA(str) 从原明文密码str计算并返回加密后的密码字符串,当参数为null时,返回null。 SHA加密算法比MD5更加安全
- ENCODE(value,password_seed) 返回使用password_seed作为加密密码加密value
- DECODE(value,password_seed) 返回使用password_seed作为加密密码解密value
  1. MySQL信息函数
- VERSION() 返回当前MySQL的版本号
- CONNECTION_ID() 返回当前MySQL服务器的连接数
- database(),SCHEMA() 返回MySQL命令行当前所在的数据库
- USER(),CURRENT_USER()、SYSTEM_USER(),SESSION_USER() 返回当前连接MySQL的用户名,返回结果格式为“主机名@用户名”
- CHARSET(value) 返回字符串value自变量的字符集
- COLLATION(value) 返回字符串value的比较规则
  1. 其它函数
- FORMAT(value,n)返回对数字value进行格式化后的结果数据。n表示 四舍五入 后保留到小数点后n位
- CONV(value,from,to) 将value的值进行不同进制之间的转换
- INET_ATON(ipvalue) 将以点分隔的IP地址转化为一个数字
- INET_NTOA(value) 将数字形式的IP地址转化为以点分隔的IP地址
- BENCHMARK(n,expr)将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间
- CONVERT(value USING char_code) 将value所使用的字符编码修改为char_code
1.5 聚合函数

  1. Math
# avg, sum
select avg(salary), sum(salary) from employees;# max, min
select max(salary), min(salary) from employees;# count
select count(employee_id) from employees;   # 不包含null值
select count(1) from employees;
select count(*) from employees;
  1. group by
# select 中出现的非组函数的字段一定要出现在group by中# 查询各个部门的平均工资
select department_id, avg(salary) from employees group by department_id;# 查询各个department_id, job_id 的平均工资
select department_id, job_id, avg(salary) from employees group by department_id, job_id;# 查询各个部门的平均工资, 且平均工资大于5000
select department_id, avg(salary) avg from employees group by department_id having avg > 5000;
1.6 子查询

  1. 单行子查询
selectlast_name, salary
fromemployees
wheresalary > (selectsalaryfromemployeeswherelast_name = 'Abel');
  1. 多行子查询
# in, any, all, some
selectlast_name, salary
fromemployees
wheresalary in (selectmin(salary)fromemployeesgroup bydepartment_id);selectmin(avg_sal)
from(selectavg(salary) avg_salfromemployeesgroup bydepartment_id) tb_avg_dept_sal;
  1. 相关子查询
selectlast_name, department_id, salary
fromemployees e1
wheresalary > (selectavg(salary)from employees e2wheredepartment_id = e1.department_id);

2. 数据库与表操作

2.1 数据库操作

  1. 创建数据库
create database db_name;
create database db_name character set 'utf8mb4';  # 指定字符集
create database if not exists db_name;  # 如果已存在 创建不成功
  1. 管理数据库
# 查看当前连接中的数据库
show databases;
# 切换数据库
use db_name;
# 查看当前使用的数据库
select database() from dual;
  1. 修改数据库
alter database db_name character set 'utf8';
  1. 删除数据库
drop database db_name;
drop database if exists db_name;
2.2 表操作

  1. 创建表
use db_name;
create table if not exists tb_name(id int,name, varchar(15),birthday, date
);
# 基于现有的表
create table if not exists tb_name as select field1, field2 from XXX;
  1. 查看表结构
show create table tb_name;
  1. 修改表
# 添加一个字段
alter table tb_name add new_field field_type;
alter table tb_name add new_field field_type FIRST;  # 添加到第一个位置
alter table tb_name add new_field field_type after field_name;  # 添加到XXX后面# 修改一个字段
alter table tb_name modify field_name field_type;# 重命名一个字段
alter table tb_name change field_name new_field_name field_type;# 删除一个字段
alter table tb_name drop column field_name;
  1. 重命名表
# 方式1
rename table tb_name to new_table_name;# 方式2
alter table tb_name rename to new_table_name;
  1. 删除表
drop table if exists tb_name;
  1. 清空表
truncate table tb_name;
2.3 数据操作

  1. 添加数据
# 一条一条地添加
insert into tb_name values (1, "Tom");    # 按照声明字段的先后顺序
insert into tb_name(id, name) values (2, "Jack"); # 指定添加的字段# 同时插入多条记录
insert into tb_name(id, name) values (3, "Lucy"), (4, "Jenny");# 将查询结果集插入到表中
insert into tb_name(id, name) select e_id, e_name from E;  # 查询的字段与添加字段一一对应 (有风险)
  1. 更新删除数据
# 更新数据
update tb_name set field_name = new_value where condition;
  1. 计算列
# MySQL8.0 新特性
create table db_name(a int,b int,C int generated always as (a+b) virtual       # c的值为a+b的和
);
2.4 视图

  1. 创建视图
create or replace view view_name as select employee_id, last_name from employees;
  1. 查看表和视图
show full tables;
  1. 修改视图
alter view view_name as select employee_id, last_name,department_id from employees;
  1. 重命名视图
rename table view_name to new_view_name;
  1. 删除视图
drop view if exists view_name;

3. 存储过程

3.1 入门

  1. 概述
# 存储过程就是一组SQL语句集, 相当于Java中的方法
# 存储过程就是数据库SQL语言层面的代码封装与重用
  1. 定义
# 定义存储过程
dilimiter $$    # 自定义结束符, $$
create procedure proc()
beginselect employee_id, last_name from employees;
end $$
dilimiter;
  1. 调用
# 调用存储过程
call proc01;
3.2 变量

  1. 局部变量
# 局部变量, 在begin,end 代码块有效
dilimiter $$    # 自定义结束符, $$
create procedure proc()
begindeclare var_name varchar(20) default 'aaa';      # 声明类型, 变量名set var_name = 'ZhangSan';select var_name;
end $$
dilimiter ;call proc()# select..into 赋值
dilimiter $$
create procedure proc()
begindeclare var_name varchar(20);select last_name into var_name from employees where employee_id = 1;select var_name;
end $$
dilimiter ;call proc();
  1. 用户变量
# 用户变量, 当前会话(连接)有效, 相当于Java的成员变量
# 不需要提前声明 使用即声明 加@
dilimiter $$
create procedure proc()
beginset @var_name = 'LiSi';select @var_name;
end $$
dilimiter ;call proc();
select @var_name;  # 也可以使用
  1. 系统变量
# 系统变量又分为全局变量, 会话变量# 查看全局变量
show global variables;
# 查看某全局变量
select @@global.auto_increment_increment;
# 修改全局变量的值
set @@global.short_buffer_size = 4000;# 查看会话变量
show session variables;
# 查看某会话变量
select @@session.auto_increment_increment;
# 修改会话变量的值
set @@session.short_buffer_size = 4000;
3.3 参数传递

  1. in
# 封装有参数的存储过程, 传入员工编号, 查找员工信息
dilimiter $$
create procedure proc(in param_empno int)
beginselect * from employees where employee_id = param_empno;
end $$
dilimiter ;call proc(1001);
  1. out
# 封装有参数的存储过程, 传入员工编号, 返回员工名字
dilimiter $$
create procedure proc(in in_empno int, out out_last_name varchar(25))
beginselect last_name into out_last_name from employees where employee_id = in_empno;
end $$
dilimiter ;call proc(1001, @o_ename);
select @o_ename;
  1. inout
# 传入一个数字, 传出这个数字的十倍值
dilimiter $$
create procedure proc(inout num int)
beginset num = num * 10;
end $$
dilimiter ;set @input_num = 2;
call proc(@input_num);select @input_num;
3.4 条件

  1. if
# 输入员工的姓名, 判断工资的情况
dilimiter $$
create procedure proc4(in in_ename varchar(25))
begindeclare result varchar(20);declare var_salary decimal(8, 2);select salary into var_salary from employees where last_name = in_ename;if var_salary > 10000 then set result = '大佬薪资';elseif var_salary > 5000 then set result = "转正薪资";else set result = '试用期工资'; end if;select result;
end $$dilimiter ;call proc4('Abel');
  1. case
dilimiter $$
create procedure proc(in pay_type int)
begincase pay_type when 1 then select '微信支付' when 2 then select '支付宝支付'when 3 then select '银行卡支付'else select '其它方式支付'end case;
end $$dilimiter ;call proc(1);
3.5 循环

  1. while
# leave-break;  iterate-continue;
# 向表中添加指定条数据
dilimiter $$
create procedure proc(in insert_count int)
begindeclare i int default 1;while i <= insert_count DOinsert into user(uid,username, password) values (i, concat('user-', i), '123456');set i = i + 1;end while;
end $$dilimiter ;call proc(10);
  1. repeat
dilimiter $$
create procedure proc(in insert_count int)
begindeclare i int default 1;repeatinsert into user(uid,username, password) values (i, concat('user-', i), '123456');set i = i + 1;until  i > insert_countend repeat;
end $$dilimiter ;call proc(10);
  1. loop
dilimiter $$
create procedure proc(in insert_count int)
begindeclare i int default 1;loopinsert into user(uid,username, password) values (i, concat('user-', i), '123456');set i = i + 1;if  i > insert_count then leave; end if;end loop;
end $$dilimiter ;call proc(10);
3.6 游标

# 游标用来存储查询结果集的数据类型, 在存储过程和函数中可以使用光标对结果集进行循环的处理
  1. 声明
declare cursor_name cursor for select_statement;
  1. 打开
open cursor_name;
  1. 取值
fetch cursor_name into var_name [, var_name]...
  1. 关闭
close cursor_name;
3.7 句柄

declare handler_action handlerfor condition_value [, condition_value] ...statementhandler_action: {continue| exit| undo
}condition_value: {mysql_error_code| condition_name| sqlwarning| not found| sqlexception
}

https://blog.csdn.net/weixin_47723732/article/details/123612770

3.8 存储函数

create function func_name ([param_name, type[, ...]]) returns type [characteristic ...]
beginrou
end;
  1. 无参函数
dilimiter $$
drop function if exists myfun;
create function myfun() returns int
begindeclare emp_num int default 0;select count(1) into emp_num from employees;return emp_num;
end $$dilimiter ;# 调用存储函数
select myfun();
  1. 有参函数
dilimiter $$
drop function if exists myfun;
create function myfun(in_empno int) returns varchar(25)
begindeclare out_ename varchar(25);select last_name into out_ename from employees where employee_id = in_empno;return out_ename;
end $$dilimiter ;# 调用存储函数
select myfun(133);

4. 触发器

4.1 概述

# 触发器, 是一种特殊的存储过程, 触发器无需自动调用, 当对数据库执行DML操作时, 自动触发
# 在MySQL中, 只有执行 insert, update, delete 才能触发
# 触发器可以确保数据的完整性, 日志记录, 数据校验等操作# 特性
# 什么条件会触发: I, D, U
# 什么时候触发: 增删改前或后
# 触发频率: 针对每一行执行
# 触发器定义在表上还是附着在表上
4.2 操作

  1. 创建
# 创建触发器
# create trigger 触发器名 before|after 触发事件 on 表名 for each now 执行语句 [begin..end];create trigger trigger_test after insert on t_user
for each now insert into t_user_logs values (null, now(), '有新用户添加');delimiter $$
create trigger trigger_test2 after update on t_user for each now
begininsert into t_user_logs values (null, now(), '有用户信息被修改');
end $$
delimiter ;# 查看触发器
show triggers;
4.3 new,old

# insert型触发器: new 表示将要或者已经新增的数据
# update型触发器: old 表示修改之前的触发器, new 表示将要或已经修改后的数据
# delete型触发器: old 表示将要或者已经删除的数据
# 使用方法: new.columnName (columnName为相应数据表某一列名)
drop trigger if exists trigger_test;
delimiter $$
create trigger trigger_test after update on t_user for each now
begininsert into t_user_logs values (null, now(), concat('用户信息被修改, 修改人: ', new.username));
end $$
delimiter ;

5. 索引

5.1 普通索引

  1. 创建
# 1. 创建表的时候指定create table t_user(uid int primary key,username varchar(25),password varchar(25),gender char(1),age tinyint(3),index index_name(username)  # index_name: 索引名称, username: 给username添加索引
)# 2. 直接创建
create index index_gender on t_user(gender);# 3. 修改表结构的时候指定
alter table t_user add index index_age(age);
  1. 查看
# 查看数据库所有索引
select * from mysql.innodb_index_stats a where a.database_name = '';# 查看表中所有索引
select * from mysql.innodb_index_stats a where a.database_name = '' and a.table_name like '';# 查看表中所有索引
show index from tb_name;
  1. 删除
drop index index_name on tb_name;
alter table tb_name drop index index_name;
5.2 唯一索引

# 1. 创建表的时候指定create table t_user(uid int primary key,phone varchar(25),username varchar(25),password varchar(25),gender char(1),age tinyint(3),unique index_name(phone)
)# 2. 直接创建
create unique index index_gender on t_user(phone);# 3. 修改表结构的时候指定
alter table t_user add unique index index_age(phone);
5.3 主键索引

# 每张表一般都会有自己的主键, MySQL会自动在主键列上建立一个索引, 主键列具有唯一性且不为null, 具有唯一性
5.4 组合索引

# 创建
create index index_name on tb_name(a, b);
5.5 全文索引

# 全文索引的关键字是fulltext
# 只有字段类型为char, varchar, text及其系列才能建全文索引
# 创建
create table t_article(id int primary key,title varchar(255),content varchar(1000),writting_date date -- ,-- fulltext(content) -- 创建全文索引, 效率低
)# insert...alter table t_article add fulltext index_content(content);  # 有数据后添加, 效率高
create fulltext index index_content on t_article;
# 操作 match, against
select * from t_article where match(content) against('yo'); # 小于最小搜索长度, 没有结果
select * from t_article where match(content) against('you');
5.6 空间索引

# MySQL5.7 后支持空间索引, 支持OpenGIS 几何数据类型
# 支持四种类型: GEOMETRY-空间数据, POINT-点, LINESTRING-线, POLYGON-多边形
# 创建
create table shop_info(id int primary key auto_increment comment 'id',shop_name varchar(25) not null comment '门店名称',geom_point geometry not null comment '经纬度',spatial key geom_index(geom_point) # 创建空间索引
);

MySQL从删库到跑路: 入门篇相关推荐

  1. MySQL从删库到跑路(5):in and not

     "哈哈哈哈,看你这几天没来上课,我还以为你去拜什么高人为师了?原来就是这个烂番薯.臭鸟蛋的小卖部大爷学装逼,你逗我玩呢?哈哈哈哈哈"  "哈哈哈哈,一个老屌丝,一个小屌 ...

  2. MySQL从删库到跑路(2):大爷的SQL私房菜

    大爷的SQL私房菜 夜色如墨,月凉如水,一轮皎洁的圆月高高地挂在夜空之上,平日里鼾声如雷的室友今夜也停止了打鼾,如此静谧的夜晚,李有为却辗转难眠. 时间悄然来到凌晨一点半,他已经在窗边站了53分钟23 ...

  3. MySQL从删库到跑路(三)——SQL语言

    作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.SQL语言简介 1.SQL语言简介 SQL是结构化查询语言(Structured Query Language) ...

  4. MySQL从删库到跑路

    MySQL数据库指令集 增(insert) 不指定字段 insert into <表名> values(值1,值2,值3...); 指定字段(没给到值的字段为默认值或null) inser ...

  5. MySQL从删库到跑路(7):连接查询,用联系的观点看女神与渣男

     "有为,能陪我说说话么?"  望着梨花带雨的女神,一时间李有为陷入了恍惚之中,尽管心里已经千万次告诫自己要远离面前的女人,可是当她真的出现在面前时,李有为的大脑早已一片空白.   ...

  6. mysql从删库到跑路 亚马逊_Amazon RDS 上的 MySQL 的已知问题和限制 - Amazon Relational Database Service...

    Amazon RDS 上的 MySQL 的已知问题和限制 下面给出了有关对 Amazon RDS 使用 MySQL 的已知问题和限制. 不一致的 InnoDB 缓冲池大小 对于 MySQL 5.7,管 ...

  7. Mysql从删库到跑路(1)

    文章目录 前言 初识Mysql mysql是啥呢 什么是数据库 DBMS 操作数据库 基本操作 数据库中的数据类型 操作数据表 列的一些其他属性 数据表的引擎 基本操作 总结 前言 终于放假了,前段时 ...

  8. MySQL从删库到跑路(8):聚合函数——让我们来统计一下漂亮妹子的信息

     "李有为,我且问你,human_base_info表面,颜值最高的妹子能有多高?"  听完大爷的话,李有为的嘴角情不自禁地绽开了一抹不易察觉的潇洒而自信的笑容,"大爷, ...

  9. MySQL从删库到跑路(9):group by——给漂亮小姐姐分个组

     上回说到,李有为学会了五个聚合函数,自那以后,谁是这个世界上最漂亮的人,谁是这世界上最高的人,谁是这个世界上最重的人,都逃不过她的火眼金睛,然后大爷的一个问题又让李有为陷入了难题的泥沼当中,在这个花 ...

  10. MySQL从删库到跑路(10):case when——国色天香、倾国倾城,给漂亮小姐姐分个类

     一生一代一篇文,争教两处销魂.上回说到,李有为跟着小卖部大爷,装逼界的传奇人物逼神阿六敦学了一招group by分组后自以为可以纵横天下,然而很快,他便发现人外有人.天外有天,强中还有强中手,一山还 ...

最新文章

  1. python 函数参数注解_python-如何使用函数注释来验证函数调用类...
  2. 女大学生两块钱成功进外企
  3. java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this a
  4. 我发现了25个影响力达20多年的 Windows 0day,微软刚修完11个
  5. 将JavaScript函数作为参数传递
  6. mingw-w64-i686-toolchain
  7. php 判断客户端类型,怎么使用php判断客户端的类型
  8. (轉貼) 人人有功練!! 有功夫,沒懦夫 (News)
  9. 一文带你了解Windows操作系统安全,保护自己的电脑不受侵害
  10. 书籍《Python股票量化交易从入门到实践》学习进阶路线
  11. oss图片无法在网站中显示
  12. 求qq微信快捷回复软件-微快聊聊天助手小程序
  13. vue常用的时间、手机号等的格式化方法
  14. 2012年奇虎360校园招聘实习生笔试编程题
  15. 谈谈大数据架构下的存储系统
  16. centos7分区挂载大容量数据盘
  17. 周期循环图像边界算法
  18. PAZU WEB打印控件
  19. 通过python分析微信好友数据
  20. 电子发票的报销归档问题——电子会计凭证入账三个特别需要注意的地方

热门文章

  1. Google Authenticator(谷歌身份验证器)
  2. redis 通道 java_【java】netty4,服务端向客户端主动发消息怎么把channel存储到redis缓存中?...
  3. blender弯曲物体
  4. CVPR 2019 论文汇总(按方向进行论文划分)
  5. 苹果账号打包发布APP流程详解
  6. 【前端】jQuery上传图片插件 : uploadifive
  7. jvm最大堆内存和最小堆内存保持什么样的关系 系统性能最好
  8. 视频教程-uni-app实战仿微信app开发-Webapp
  9. centos6系统下载--国内镜像站点
  10. 一个程序员未来5年的规划