MySQL从删库到跑路: 入门篇
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语句
select...from...
select * from employees;
select employee_id, salary from employees;
列的别名
select employee_id emp_id from employees;
select employe_id as emp_id from employees; # as 可省略, 别名可用"" eg "部门id"
去除重复行
select distinct department_id from employees; # 字段前 + distinct
select salary, distinct department_id from employees; # 错误
select distinct department_id, salary, from employees; # 整体去重, 没实际意义
空值参与运算
# 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()
着重号
select * from order; # 错误 order为关键字
select * from `order`;
查询常数
select "Mysql", employee_id, last_name from employees; # 三列, 匹配常数Mysql
显示表结构
describe employees; # 显示表中相关字段的详细信息
desc employees;
过滤数据
# 查询90号部门的员工信息
select * from employees where department_id = 90;
运算符
# 算术运算符 +, -, *, /, 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;# 位运算符: &, |, ^, ~, >
排序
select employee_id, last_name, salary from employees order by salary desc; # desc asc
分页
# limit 分页
select employee_id, last_name, salary from employees limit 0, 20; # START_INDEX, PAGESIZE
1.3 多表select语句
笛卡尔积
# 1 -> x, 每个员工都与每个部门匹配了一遍, 笛卡尔积(交叉连接), 缺少了多表的连接条件
select employee_id, department_name from employees, department;
等值连接
select e.employee_id, d.department_name
from employees e, departments d
wheree.department_id = d.department_id;
非等值连接
selecte.last_name, e.salary, j.grade_level
fromemployees e, job_grades j
wheree.salary between j.lowest_sal and j.highest_salary;
自连接
selecte.employee_id, e.last_name, m.employee_id, m.last_name
fromemployees e, employees m
wheree.manage_id = m.employee_id;
非自连接
# 以上几个case均为非自连接
内连接
# 以上几个case均为内连接
外连接
# 查询所有的员工的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不支持
union
# union union all, 结果集连接
# union: 会执行去重
# union all: 不会执行去重
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 单行函数
数值函数
- 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 最大的区别是不会进行四舍五入)
字符串函数
- 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
日期时间函数
- 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()时间戳转日期
流程控制函数
- 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…
加密解密函数
- 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
MySQL信息函数
- VERSION() 返回当前MySQL的版本号
- CONNECTION_ID() 返回当前MySQL服务器的连接数
- database(),SCHEMA() 返回MySQL命令行当前所在的数据库
- USER(),CURRENT_USER()、SYSTEM_USER(),SESSION_USER() 返回当前连接MySQL的用户名,返回结果格式为“主机名@用户名”
- CHARSET(value) 返回字符串value自变量的字符集
- COLLATION(value) 返回字符串value的比较规则
其它函数
- 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 聚合函数
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;
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 子查询
单行子查询
selectlast_name, salary
fromemployees
wheresalary > (selectsalaryfromemployeeswherelast_name = 'Abel');
多行子查询
# 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;
相关子查询
selectlast_name, department_id, salary
fromemployees e1
wheresalary > (selectavg(salary)from employees e2wheredepartment_id = e1.department_id);
2. 数据库与表操作
2.1 数据库操作
创建数据库
create database db_name;
create database db_name character set 'utf8mb4'; # 指定字符集
create database if not exists db_name; # 如果已存在 创建不成功
管理数据库
# 查看当前连接中的数据库
show databases;
# 切换数据库
use db_name;
# 查看当前使用的数据库
select database() from dual;
修改数据库
alter database db_name character set 'utf8';
删除数据库
drop database db_name;
drop database if exists db_name;
2.2 表操作
创建表
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;
查看表结构
show create table tb_name;
修改表
# 添加一个字段
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
rename table tb_name to new_table_name;# 方式2
alter table tb_name rename to new_table_name;
删除表
drop table if exists tb_name;
清空表
truncate table tb_name;
2.3 数据操作
添加数据
# 一条一条地添加
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; # 查询的字段与添加字段一一对应 (有风险)
更新删除数据
# 更新数据
update tb_name set field_name = new_value where condition;
计算列
# MySQL8.0 新特性
create table db_name(a int,b int,C int generated always as (a+b) virtual # c的值为a+b的和
);
2.4 视图
创建视图
create or replace view view_name as select employee_id, last_name from employees;
查看表和视图
show full tables;
修改视图
alter view view_name as select employee_id, last_name,department_id from employees;
重命名视图
rename table view_name to new_view_name;
删除视图
drop view if exists view_name;
3. 存储过程
3.1 入门
概述
# 存储过程就是一组SQL语句集, 相当于Java中的方法
# 存储过程就是数据库SQL语言层面的代码封装与重用
定义
# 定义存储过程
dilimiter $$ # 自定义结束符, $$
create procedure proc()
beginselect employee_id, last_name from employees;
end $$
dilimiter;
调用
# 调用存储过程
call proc01;
3.2 变量
局部变量
# 局部变量, 在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();
用户变量
# 用户变量, 当前会话(连接)有效, 相当于Java的成员变量
# 不需要提前声明 使用即声明 加@
dilimiter $$
create procedure proc()
beginset @var_name = 'LiSi';select @var_name;
end $$
dilimiter ;call proc();
select @var_name; # 也可以使用
系统变量
# 系统变量又分为全局变量, 会话变量# 查看全局变量
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 参数传递
in
# 封装有参数的存储过程, 传入员工编号, 查找员工信息
dilimiter $$
create procedure proc(in param_empno int)
beginselect * from employees where employee_id = param_empno;
end $$
dilimiter ;call proc(1001);
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;
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 条件
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');
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 循环
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);
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);
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 游标
# 游标用来存储查询结果集的数据类型, 在存储过程和函数中可以使用光标对结果集进行循环的处理
声明
declare cursor_name cursor for select_statement;
打开
open cursor_name;
取值
fetch cursor_name into var_name [, var_name]...
关闭
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;
无参函数
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();
有参函数
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 操作
创建
# 创建触发器
# 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. 创建表的时候指定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);
查看
# 查看数据库所有索引
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;
删除
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从删库到跑路: 入门篇相关推荐
- MySQL从删库到跑路(5):in and not
"哈哈哈哈,看你这几天没来上课,我还以为你去拜什么高人为师了?原来就是这个烂番薯.臭鸟蛋的小卖部大爷学装逼,你逗我玩呢?哈哈哈哈哈" "哈哈哈哈,一个老屌丝,一个小屌 ...
- MySQL从删库到跑路(2):大爷的SQL私房菜
大爷的SQL私房菜 夜色如墨,月凉如水,一轮皎洁的圆月高高地挂在夜空之上,平日里鼾声如雷的室友今夜也停止了打鼾,如此静谧的夜晚,李有为却辗转难眠. 时间悄然来到凌晨一点半,他已经在窗边站了53分钟23 ...
- MySQL从删库到跑路(三)——SQL语言
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.SQL语言简介 1.SQL语言简介 SQL是结构化查询语言(Structured Query Language) ...
- MySQL从删库到跑路
MySQL数据库指令集 增(insert) 不指定字段 insert into <表名> values(值1,值2,值3...); 指定字段(没给到值的字段为默认值或null) inser ...
- MySQL从删库到跑路(7):连接查询,用联系的观点看女神与渣男
"有为,能陪我说说话么?" 望着梨花带雨的女神,一时间李有为陷入了恍惚之中,尽管心里已经千万次告诫自己要远离面前的女人,可是当她真的出现在面前时,李有为的大脑早已一片空白. ...
- mysql从删库到跑路 亚马逊_Amazon RDS 上的 MySQL 的已知问题和限制 - Amazon Relational Database Service...
Amazon RDS 上的 MySQL 的已知问题和限制 下面给出了有关对 Amazon RDS 使用 MySQL 的已知问题和限制. 不一致的 InnoDB 缓冲池大小 对于 MySQL 5.7,管 ...
- Mysql从删库到跑路(1)
文章目录 前言 初识Mysql mysql是啥呢 什么是数据库 DBMS 操作数据库 基本操作 数据库中的数据类型 操作数据表 列的一些其他属性 数据表的引擎 基本操作 总结 前言 终于放假了,前段时 ...
- MySQL从删库到跑路(8):聚合函数——让我们来统计一下漂亮妹子的信息
"李有为,我且问你,human_base_info表面,颜值最高的妹子能有多高?" 听完大爷的话,李有为的嘴角情不自禁地绽开了一抹不易察觉的潇洒而自信的笑容,"大爷, ...
- MySQL从删库到跑路(9):group by——给漂亮小姐姐分个组
上回说到,李有为学会了五个聚合函数,自那以后,谁是这个世界上最漂亮的人,谁是这世界上最高的人,谁是这个世界上最重的人,都逃不过她的火眼金睛,然后大爷的一个问题又让李有为陷入了难题的泥沼当中,在这个花 ...
- MySQL从删库到跑路(10):case when——国色天香、倾国倾城,给漂亮小姐姐分个类
一生一代一篇文,争教两处销魂.上回说到,李有为跟着小卖部大爷,装逼界的传奇人物逼神阿六敦学了一招group by分组后自以为可以纵横天下,然而很快,他便发现人外有人.天外有天,强中还有强中手,一山还 ...
最新文章
- python 函数参数注解_python-如何使用函数注释来验证函数调用类...
- 女大学生两块钱成功进外企
- java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this a
- 我发现了25个影响力达20多年的 Windows 0day,微软刚修完11个
- 将JavaScript函数作为参数传递
- mingw-w64-i686-toolchain
- php 判断客户端类型,怎么使用php判断客户端的类型
- (轉貼) 人人有功練!! 有功夫,沒懦夫 (News)
- 一文带你了解Windows操作系统安全,保护自己的电脑不受侵害
- 书籍《Python股票量化交易从入门到实践》学习进阶路线
- oss图片无法在网站中显示
- 求qq微信快捷回复软件-微快聊聊天助手小程序
- vue常用的时间、手机号等的格式化方法
- 2012年奇虎360校园招聘实习生笔试编程题
- 谈谈大数据架构下的存储系统
- centos7分区挂载大容量数据盘
- 周期循环图像边界算法
- PAZU WEB打印控件
- 通过python分析微信好友数据
- 电子发票的报销归档问题——电子会计凭证入账三个特别需要注意的地方
热门文章
- Google Authenticator(谷歌身份验证器)
- redis 通道 java_【java】netty4,服务端向客户端主动发消息怎么把channel存储到redis缓存中?...
- blender弯曲物体
- CVPR 2019 论文汇总(按方向进行论文划分)
- 苹果账号打包发布APP流程详解
- 【前端】jQuery上传图片插件 : uploadifive
- jvm最大堆内存和最小堆内存保持什么样的关系 系统性能最好
- 视频教程-uni-app实战仿微信app开发-Webapp
- centos6系统下载--国内镜像站点
- 一个程序员未来5年的规划