【MySQL系列】操作手册

文章目录

MySQL操作手册

分类描述关键字
DDLData Definition Language 【数据定义语言】
定义数据库对象:数据库,表,列
create,drop,alter
DMLData Manipulation Language【数据操作语言】
操作表中数据:增,删,改
insert,delete,update
DQLData Query Language【数据查询语言】
查询表中数据,对数据库的操作最多就是查询
select…from…
DCLData Control Language【数据控制语言】
定义数据库的访问权限和安全级别,及创建用户
grant,revoke
TCLTransaction Control Language【事务控制语言】
控制数据库的事务操作
commit,rollback,savepoint

一个数据库 可以有 多张表,一张表 可以有 多条记录,记录 = 表结构 + 表数据

操作
数据库(database)createdropaltershow
表(table)createdropaltershow
表结构(字段)alter…addalter…dropalter…modify/change/
表数据(数据)insert intodelete fromupdate…set…select…from

一、Database 操作

1、创建数据库

-- 直接创建数据库db1
create database db1;

-- 判断如果不存在则创建数据库db2
create database if not exists db2;

-- 创建数据库db3并指定字符集为gbk
create database db3 character set gbk;

-- 关键字用 `` 
create database `create`;

2、使用数据库

-- 查看正在使用的数据库
select database();

-- 使用/切换数据库
use db2;

3、查看数据库

-- 查看正在使用的数据库
select database();

-- 查看所有的数据库
show databases;

-- 查看某个数据库的定义信息
show create database db3;

4、修改数据库(了解)

-- 将db3数据库的字符集改成utf8
alter database db3 character set utf8;

Tips:sql语句不识别-utf-8 要写成 utf8iso-8859-1 要写成 latin1

二、Table 操作

1、创建表

-- 创建student表包含id,name,sex,birthday字段
create table student(
    id int,
    name varchar(20),
    sex char(1),
    birthday date    
);

-- 创建一个student2表,结构与student相同
create table student2 like student;

2、查看表

-- 显示所有表
show tables;

-- 查看数据表表结构
desc student;

-- 查看数据表的创建信息
show create table student;

3、修改表结构(了解)

语法:ALTER TABLE 表名 (ADD、MODIFY、change、DROP) 字段名 数据类型(长度)

-- 新增字段
alter table student add remark varchar(20);

-- 修改字段
alter table student modify remark varchar(100);

-- 修改字段名(remark -> intro)
alter table student change remark intro varchar(20);

-- 删除字段
alter table student drop intro; 

-- 修改表名
rename student to student2;

-- 修改表的编码
alter table student character set gbk;

4、删除表 - drop

-- 直接删除表s1表
drop table s1;

-- 判断表如果存在就删除s1表
drop table if exists s1;

三、Data 操作 - 增删改

1、新增 - insert

-- 准备表
CREATE TABLE student (
    id INT,
    sex CHAR(2),
    NAME VARCHAR(20), 
    birthday DATE
);

-- 全写形式:插入所有数据,所有的字段名都写出来
insert into stu (id,sex,name,birthday) values (1,'男','tom','2020-05-20');

-- 省略全部字段:插入所有数据,可以不写字段名
insert into stu values (2,'男','汤姆','2020-05-21');

-- 省略部分字段:插入部分数据,需要指定字段名
insert into stu (name,sex) values ('柳岩','女');

-- 批量插入
insert into student(id,name,birthday,sex) values
(4,'ml','1998-01-01','男'),
(5,'qq','1999-01-01','女');

表的备份 & 蠕虫复制

-- 表结构的复制
create table s2 like student;
-- 表数据的复制
insert into s2 select * from student;
-- 蠕虫复制(不断复制自身)
insert into s2 select * from s2;

2、修改 - update

-- 修改表中的性别为'女'
update stu set sex='女'; 

-- 将表中id为1的性别改为男
update stu set sex='男' where id=1;

-- 修改多个列,用逗号分隔
update student set name='hehe', address = '北京' where id=3;

3、删除 - delete/truncate

-- 删除id为2的学生信息
delete from stu where id=2;

-- 删除整张表中的所有数据
delete from stu;
truncate table stu;

deletetruncate 删除的区别

  • delete
    • 将表中的数据一条一条删除,实际上没有删除表中数据的所有信息
    • 数据可能恢复(可以理解成隐藏)
    • 效率比较低
    • 属于DML语句
  • truncate
    • 将整个表摧毁,重新创建一个新的表,新的表结构和原来表结构一模一样
    • 数据不可恢复
    • 效率比较高
    • 属于DDL语句

四、Data 操作 - 查询

1、基本查询

-- 创建商品表
CREATE TABLE product(
	pid INT,
	pname VARCHAR(20),
	price DOUBLE,
	category_id VARCHAR(32)
);

INSERT INTO product(pid,pname,price,category_id) VALUES(1,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(2,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(4,'JACK JONES',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(5,'真维斯',200,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(6,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(7,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(8,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(10,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(11,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(12,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(13,'果9',1,NULL);

1)基本语法 - select

-- 查询所有商品(*表示查询所有列,不推荐,推荐一一列举)
select * from product;

-- 查询商品的名称和价格
select pname, price from product;

2)别名查询 - as

【表别名】

-- 表名.字段名: 某张表的某个字段
select product.pname, product.price from product;
-- 如果表只有一张,表名可以省略
select pname, price from product;
-- 使用关键字as取别名
select p.pname, p.price from product as p;
-- as可以省略
select p.pname, p.price from product p;

-- 注意: 一旦取了别名,原名不可用
select product.pname, product.price from product as p; 	-- error

【列别名】

-- 完整写法
select product.pname as '商品名', product.price as '商品价格' from product;
-- as 后的字符串可以不加引号
select product.pname as 商品名, product.price as 商品价格 from product;
-- as可以省略
select product.pname 商品名, product.price 商品价格 from product; 

3)去重查询 - distinct

-- 查看商品表中有哪些价格
select price from product; 			 -- 有重复的, 结果20条
select distinct price from product;  -- 过滤重复, 结果10条

4)计算查询

-- 将所有商品的价格+10元进行显示
select pname, price+10 newprice from product;
-- 通过ifnull,将null值转化为0再参与运算
select pname, ifnull(price,0) + 10 newprice from product;	

2、条件查询

-- 创建学生表
CREATE TABLE student (
    id INT,
    NAME VARCHAR(20),
    age INT,
    sex VARCHAR(5),
    address VARCHAR(100),
    math INT,
    english INT
);

INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES 
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);
(9,'唐僧',25,'男','长安',87,78),
(10,'孙悟空',18,'男','花果山',100,66),
(11,'猪八戒',22,'男','高老庄',58,78),
(12,'沙僧',50,'男','流沙河',77,88),
(13,'白骨精',22,'女','白虎岭',66,66),
(14,'蜘蛛精',23,'女','盘丝洞',88,88);

1)比较运算符

数值: 
	小于<   大于>   等于=   小于等于<=   大于等于>=    不等于<>!= 
null:
	is nullis not null
函数:
	ifnull(字段, 默认值)  如果字段值为null,则取默认值,否则取字段值
-- 数学成绩大于80分的学生
select * from student where math > 80;

-- 英语成绩小于等于80分的学生(不计null)
select name, english from student where english <= 80;

-- 英语成绩小于或等于80分的学生(null缺考,记作0)
select name, ifnull(english, 0) eng from student where ifnull(english, 0) <= 80;

-- age等于20岁的学生
select * from student where age = 20;

-- age不等于20岁的学生
select * from student where age != 20;
select * from student where age <> 20;

-- 英语成绩为null的同学(缺考)
select * from student where english is null;	
select * from student where english is not null;	

-- english + 10
select name, english+10 from student;	
select name, ifnull(english, 0) + 10 newEng from student;

2)逻辑运算符

与或非:
	and  or  not
in:
	多个or时使用 (in里面的每个数据都会作为一次条件,只要满足条件的就会显示)
between:
	在一个范围内,between a and b (包含a和b,b>a)
-- age大于35 且 性别为男(两个条件同时满足)
select * from student where age > 35 and sex = '男';

-- age大于35 或 性别为男(两个条件其中一个满足)
select * from student where age > 35 or sex = '男';

-- id是1或3或5
select * from student where id=1 or id=3 or id=5;
select * from student where id in (1, 3, 5);

-- 英语成绩 大于等于75 且 小于等于90
select * from student where english >= 75 and english <= 90;
select * from student where english between 75 and 90;

3)模糊查询

like%  表示0个或多个
	_  表示1
-- 姓马的学生
select * from student where name like '马%';
-- 姓名中包含'德'的学生
select * from student where name like '%德%';
-- 姓马 且 姓名有三个字 的学生
select * from student where name like '马__';

3、排序查询 - sort

order by
	desc - descending 降序
    asc  - ascending  升序(默认)
-- 查询所有数据,按年龄排序
select * from student order by age desc; -- 降序
select * from student order by age asc;  -- 升序
select * from student order by age;   	 -- 默认升序

-- 查询所有数据,按年龄降序排列,如果年龄相同,以数学成绩降序排列(多个排序条件以逗号分隔)
select * from student order by age desc, math desc;

4、分页查询 - limit

1)limit语法

limit-- limit offset(index), count;
        -- offset : 偏移量/索引 (从0开始)
        -- count  : 最大的查询数量	
-- 查询学生表中数据,跳过前面2条,显示6条
select * from student limit 2, 6;

-- 查询前5条数据
select * from student limit 0,5;
select * from student limit 5; 	   -- 当offset=0时,可以省略

-- 共14条数据
select * from student limit 10, 7;  -- 只返回4条(不会溢出)
select * from student limit 20, 7;  -- 没有就返回null(不会索引越界)

-- 查询第1条数据
select * from student limit 1;

2)分页查询

分页查询:每次只查询某一页数据,每页显示特定的数量

# 查询第page页,每页显示pageSize条数据
select * from student (page-1) * pageSize, pageSize;
-- 第一页: 获取5条(1~5)
select * from student limit 0, 5;
-- 第二页: 获取5条(6~10)
select * from student limit 5, 5;
-- 第三页: 获取5条(11~15)
select * from student limit 10, 5;

5、聚合函数

聚合:
	一组值进行运算,最终得出一个结果
函数:
	就是方法(sql、javascript中叫函数,java中叫方法)
语法:
	SELECT 聚合函数(字段) FROM 表名;

常见聚合函数:
    -- 求和  sum(字段参数)
    -- 平均  avg(字段参数) 
    -- 最值  max/min(字段参数) 
    -- 个数  count(字段参数) 
    
注意事项:
	a. null不是值,不会被列入运算
	b. where先于聚合执行  having后于聚合执行
	c. 聚合函数不能用在where之中,可以用在聚合之后的sql语句中
-- 查询学生总数
select count(*) from student;		-- 8  所有字段中,只要有一个有值,就会被统计 	
select count(english) from student; -- 7  有一个null,没有计入内
select count(id) from student; 		-- 8  写非空的字段也可以

-- 查询年龄大于40的总数
select count(*) from student where age > 40;

-- 查询数学成绩总分、最低分、最高分
select sum(math) from student;
select max(math) from student;
select min(math) from student;

-- 查询英语成绩平均分(不计null)
select sum(english)/count(english) 英语平均分 from student;  -- 81.4286
select avg(english) 英语平均分 from student; 				-- 81.4286

-- 查询英语成绩平均分(包含null)
select sum(english)/count(id) 英语平均分 from student; -- 71.2500
select avg(ifnull(english, 0)) 英语平均分 from student; -- 71.2500

6、分组查询 - group by

group by1)被分组字段有几类,最终结果集中就有几条(每一类只会显示首条结果)
		-- 如sex有男,女两类,结果集就只有2条
	2)分组查询中,select之后跟【与分组字段一对一关系的字段】和【聚合函数】
		-- 因为只会取首条结果,如果不是一对一的关系,没有意义
	3)和聚合函数一起使用:
		-- 无分组,聚合函数将表中所有符合条件的数据当成一组。
		-- 有分组,聚合在分组之后执行,对每一组数据进行聚合
-- 查询男女各多少人
select sex, count(*) from student group by sex;

-- 查询年龄大于25岁的男女各多少人
select sex, count(*) from student where age > 25 group by sex;	

-- 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于1的数据,并降序输出
select sex, count(*) from student
where age > 25      
group by sex
having count(*) > 1			-- 聚合函数不能用在where中,只能用在having中
order by count(*) desc;	

五、Data 操作 - 关联查询

-- 创建部门表
CREATE TABLE dept (
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES 
('开发部'),
('市场部'),
('财务部');

-- 创建员工表
CREATE TABLE emp ( 
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(10),
    gender CHAR(1),
    salary DOUBLE,
    join_date DATE,
    dept_id INT
);
INSERT INTO emp(NAME, gender, salary, join_date, dept_id) VALUES
('孙悟空','男',7200,'2013-02-24',1),
('猪八戒','男',3600,'2010-12-02',2),
('唐僧','男',9000,'2008-08-08',2),
('白骨精','女',5000,'2015-10-07',3),
('蜘蛛精','女',4500,'2011-03-14',1);

1、笛卡尔积

# 多表查询
	select * from A表, B表...;
# 交叉查询:会产生笛卡尔积
	select * from emp cross join dept; 
# 笛卡尔积:
	两张表数据的乘积
# 笛卡尔积的消除
	从表.外键 = 主表.主键
-- 查询员工表和部门表 【产生笛卡尔积】
select * from emp, dept;

-- 查询员工表和部门表 【消除笛卡尔积】
select * from emp e, dept d where e.dept_id = d.id;	

-- 如果多表查询的结果中字段唯一,可以不指定表名(推荐指定)
select `salary` from emp e, dept d where e.dept_id = d.id;	

-- 如果多表查询的结果中有多个同名字段,必须指定表名(不然会报错)
select `NAME` from emp e, dept d where e.dept_id = d.id;	

2、内连接 - inner join

-- 效果: 
	求两张表的交集(消除笛卡尔积 -> 从表.外键 = 主表.主键)
	
-- 隐式内连接:
	select 列名 from 左表, 右表 where 从表.外键 = 主表.主键

-- 显示内连接:(on + 连接条件) 【推荐】
	select 列名 from 左表 inner join 右表 on 从表.外键 = 主表.主键
-- 隐式内连接
select e.name, e.salary, d.name 
from emp e, dept d
where e.dept_id = d.id and e.name = '唐僧';

-- 显式内连接【推荐】 
select e.name, e.salary, d.name 
from emp e inner join dept d
on e.dept_id = d.id
where e.name = '唐僧';

3、左外连接 - left join

-- 效果
	左表不动,并上右表与之交集的部分, 如果右表没有对应的数据,使用NULL填充。
	
-- 语法
	select 列名 from 左表 left join 右表 on 从表.外键 = 主表.主键
-- 添加一个销售部,暂时还没有员工
insert into dept (name) values ('销售部');

-- 使用内连接查询,缺少销售部
select * from dept d inner join emp e on d.id = e.dept_id;

-- 使用左连接查询,有销售部,销售部员工为null
select * from dept d left join emp e on d.id = e.dept_id;

4、右外连接 - right join

-- 效果
	右表不动,并上左表与之交集的部分, 如果右表没有对应的数据,使用NULL填充。
	
-- 语法
	select 列名 from 左表 right join 右表 on 从表.外键 = 主表.主键
-- 在员工表中增加一个员工,还没分配部门
insert into emp values(null,'沙僧','男',6666,'2013-02-24',null);

-- 使用内连接查询,缺少沙僧
select * from dept d inner join emp e on d.id = e.dept_id;

-- 使用右外连接查询,有沙僧,沙僧的部门为null
select * from dept d right join emp e on d.id = e.dept_id;

5、全连接 - union

-- 效果:
	左右表的数据都不动, 并上交集数据。

-- oracle语法(mysql不支持)
	select 列名 from 左表 full outer join 右表 on 条件

-- mysql语法 - union(去重)
	select * from dept d left join emp e on e.dept_id = d.id
	union
	select * from dept d right join emp e on e.dept_id = d.id;

-- mysql语法 - union all(不去重)
	select * from dept d left join emp e on e.dept_id = d.id
	union all
	select * from dept d right join emp e on e.dept_id = d.id;

注意:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,尽量使用UNION ALL语句,以提高数据查询的效率。

六、Data 操作 - 子查询

1、子查询定义

# 子查询定义
	a语句是b语句的一部分

# 主查询/外层查询 main query
	可以是select、update、delete等语句

# 子查询/内层查询 sub query
	可以写在 select、from、where、having、exists 之后,最常见在where之后

2、子查询分类

# 按结果集的行列数不同
1. 标量子查询
		返回的结果是一条数据,搭配 > < >= <= = <> 使用
		select * from article where uid = (select uid from blog where bid = 1);
2. 列子查询
		返回的结果是一列(N行1列)  搭配 in、any、some、all 使用
		select * from article where uid in (select uid from blog where bid in(1,2));
3. 行子查询
		返回的结果是一行(1行N列)
		select * from article where (title, content) = (select title, content from blog where bid = 1);
4. 表子查询
		返回的结果是一张表(N行N列)
		select * from article where (title, content) in (SELECT title, content from blog);	
# 按子查询出现的位置
1. select之后(少见)
		只支持标量子查询,子查询的结果直接出现在结果集中
2. from之后(有用)
		支持表子查询
3. where、having之后(重要)
		a. 标量子查询 - 常见
		b. 列子查询 - 常见
		c. 行子查询
4. exists之后(有用)
    	都支持,一般是表子查询
# 按关联性
1. 非相关子查询
	a. 含义: 独立于外部查询的子查询 (子查询可以独立运行)
	b. 执行: 子查询优先于主查询执行,并且只执行一次,执行完将结果传递给外部查询
	c. 效率: 较高
	d. 举例: 
			select * from A where A.id in (select  id  from  B)

2. 相关子查询
	a. 含义: 依赖于外部查询的数据的子查询
	b. 执行: 子查询和外部查询交叉执行,外部查询每执行一行,子查询执行一次
	c. 解释: 子查询中查询条件依赖于外层查询中的某个值,子查询要反复求值,以供外层查询使用。
	d. 效率: 较低
	e. 举例: 
			select * from emp e1 
			where exists (select * from emp e2 where e1.empno=e2.mgr);

3、select之后

-- 查询每个部门id、name和对应的员工数
select d.id, d.name, (select count(*) from emp e where e.dept_id = d.id) as 员工数
from dept d;
# select之后(相关子查询)
	1. 主查询执行一次 -> select id, name from dept;
	2. 子查询执行一次 -> select count(*) from emp where e.dept_id = 1;
	3. 后续执行同理,主查询和子查询交叉进行	

4、from之后

-- 查询每个部门id、name和对应的员工数
select d.id, d.name, temp.员工数
from (select dept_id, count(*) 员工数 from emp group by dept_id) as temp
inner join dept d
on temp.dept_id = d.id;
# from之后(表子查询)
1. 特点:
		将子查询的结果作为一张临时表,和另一张表连接,再进行连接查询
2. 要求:
		1. 子查询必须起别名(一般为temp,表示临时表)
		2. 若子查询中使用了聚合函数,必须取别名,否则外部语句引用时会报错
		   例如:不能直接写 temp.count(*),语法不允许

5、where/having之后

【标量子查询】

-- 查询工资最高的员工是谁? 
select * from emp where salary = (select max(salary) from emp);

-- 查询工资小于平均工资的员工有哪些?
select * from emp where salary < (select avg(salary) from emp);

-- 查询 部门平均工资 超过 全公司平均工资的 部门id和部门平均工资
select dept_id, avg(salary) from emp 
group by dept_id
having avg(salary) > (select avg(salary) from emp);

【列子查询】

-- 查询工资最高的员工是谁? 
	-- all关键字
	select * from emp where salary >= all (select salary from emp);

-- 查询工资大于5000的员工,来自于哪些部门
	-- in关键字
	select name from dept where id in (select dept_id from emp where salary > 5000);
	-- any关键字
	select name from dept where id any (select dept_id from emp where salary > 5000);
	-- some关键字
	select name from dept where id some (select dept_id from emp where salary > 5000);
	
-- 查询开发部与财务部所有的员工信息
select * from emp where dept_id in (select id from dept where name in ('开发部','财务部'));

6、exist之后

# exists之后(相关子查询)
1. 语法:
		exists(完整的查询语句);
2. 结果:
		0/1 (false/true)
3. 理解:
		当成if来看, exists小括号中的内容是null,返回0,否则返回1
-- select之后,返回0或1
select exists (select * from emp where salary > 1000); 	 -- 返回1
select exists (select * from emp where salary > 10000);  -- 返回0

-- where之后,控制结果的显示
select * from emp where 1; -- 条件为1,显示结果
select * from emp where exists (select * from emp where salary > 1000);

select * from emp where 0;	-- 条件为0,不显示结果
select * from emp where exists (select * from emp where salary > 10000);
-- 查询工资大于5000的员工,来自于哪些部门
select name from dept d
where exists (select * from emp e where e.salary > 5000 and e.dept_id = d.id);
-- 执行顺序
	-- 主查询结果: 1,2,3
	-- 第一次执行:
		-- a. 先执行主查询: id=1, name=开发部
		-- b. 接着执行子查询: 满足条件的数据不为null,返回1
		-- c. 子查询返回1,主查询就保留当前行记录
	-- 第二次执行: 返回1,会保留 name=市场部
	-- 第三次执行: 返回0,不保留 name=财务部

7、exist 和 in

-- exists和in的区别
	-- in 后面一般直接跟 非相关子查询(子查询可单独运行。子查询执行完毕,再执行主查询)
	-- exists 后面一般都要跟 相关子查询 (子查询和主查询交叉执行,主查询查询一条,子查询执行一次)
	
-- exists和in的效率哪个高? 视情况而定
	-- 其他条件相同,看结果集数量 (有索引)
	-- 1. 主查询 > 子查询,用in
	-- 2. 主查询 < 子查询,用exists	

七、函数操作

01、字符串函数

注意:MySQL中,字符串的位置是从1开始的。

函数描述
char_length(s)返回字符串 s 的字符数
concat(s1,s2...sn)字符串 s1, s2 等多个字符串合并为一个字符串
lower(s)将字符串 s 的所有字母变成小写字母
upper(s)将字符串转换为大写
substr(s, start,length)从字符串 s 的 start 位置截取长度为 length 的子字符串
trim(s)去掉字符串 s 开始和结尾处的空格
示例:
select char_length('love') as '长度';
--执行结果为: 4

select concat('i','love','you');
--执行结果为: iloveyou

select lower('LOVE');
--执行结果为: love

select upper("love");
--执行结果为: LOVE

select substr("love", 1, 2);
--执行结果为: lo

select trim(' love ');
--执行结果为: 'love'

02、数字函数

函数描述
rand()返回 0 到 1 的随机数
round(小数, 保留位数)四舍五入保留几位小数
least(expr1, expr2, expr3, ...)返回列表中的最小值
greatest(expr1, expr2, expr3, ...)返回列表中的最大值
示例:
select rand();	
-- 返回0-1之间的随机数 0.21809973867433122

select round(3.1415926, 2) ; 
-- 执行结果: 3.14

select least(13, 14, 521, 74, 1);	
-- 执行结果: 1

select greatest(13, 14, 521, 74, 1); 
-- 执行结果: 521

03、日期函数

函数名描述
now()sysdate()返回系统的当前日期和时间
curdate()返回当前日期
curtime()返回当前系统时间
year(d)返回d的中的年份
month(d)返回d的中的月份
day(d)返回d中的日
date_format(日期,格式)日期格式化
示例:
select now(); 			-- 返回系统的当前时间: 年-月-日 时:分:秒 
select sysdate(); 		-- 返回系统的当前时间: 年-月-日 时:分:秒 
select curdate(); 		-- 返回系统当前日期: 年-月-日
select curtime(); 		-- 返回系统当前时间: 时:分:秒
select year(now()); 	-- 返回当前日期中的年份
select month(now()); 	-- 返回当前日期中的月份
select day(now()); 		-- 返回当前日期中的日

日期格式化函数:date_format(date, format) 的使用

-- 字符串转为日期格式
select date_format('2021-09-20 08:30:45', '%Y-%m-%d %H:%i:%S');
-- 日期转为字符串格式
select date_format(now(), '%Y-%m-%d %H:%i:%s')

MySQL中,date_format(date, format) 函数的 format 格式如下

%M 月名字(January……December) 
%W 星期名字(Sunday……Saturday) 
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) 
%Y 年, 数字, 4%y 年, 数字, 2%a 缩写的星期名字(Sun……Sat) 
%d 月份中的天数, 数字(00……31) 
%e 月份中的天数, 数字(0……31) 
%m 月, 数字(01……12) 
%c 月, 数字(1……12) 
%b 缩写的月份名字(Jan……Dec) 
%j 一年中的天数(001……366) 
%H 小时(00……23) 
%k 小时(0……23) 
%h 小时(01……12) 
%I 小时(01……12) 
%l 小时(1……12) 
%i 分钟, 数字(00……59) 
%r 时间,12 小时(hh:mm:ss [AP]M) 
%T 时间,24 小时(hh:mm:ss) 
%S 秒(00……59) 
%s 秒(00……59) 
%p AM或PM 
%w 一个星期中的天数(0=Sunday ……6=Saturday ) 
%U 星期(0……52), 这里星期天是星期的第一天 
%u 星期(0……52), 这里星期一是星期的第一天 
%% 一个文字“%”。

04、流程控制函数

函数名描述
ifnull(v1,v2)如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
isnull(expr)如果 expr 的值不为 NULL,则返回 0,否则返回 1。
if(expr,v1,v2)如果 expr 是 true 则返回 v1,否则返回 v2
示例:
select ifnull(null, 'Hello Word')
-- 将null值替换为 Hello Word

select isnull(NULL);
-- 执行结果: null返回1,非null返回0

Case函数:只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。

-- 简单Case函数(相当于 switch...case...)
CASE sex
	WHEN '1' THEN '男'
	WHEN '2' THEN '女'
ELSE '其他' END

-- Case搜索函数(相当于 if...else...)
CASE 
	WHEN sex = '1' THEN '男'
    WHEN sex = '2' THEN '女'
ELSE '其他' END

05、cast()

函数名描述
cast(expression AS data_type)将某种数据类型的表达式显式转换为另一种数据类型。
用AS关键字分隔的源值和目标数据类型。
  • expression:任何有效的SQServer表达式。
  • AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
  • data_type:目标系统所提供的数据类型,包括bigintsql_variant,不能使用用户定义的数据类型。
SIGNED 	 : 整数 
UNSIGNED : 无符号整数
DECIMAL	 : 浮点数

CHAR() : 字符型,可带参数
BINARY : 二进制,同带binary前缀的效果

DATE     : 日期 
TIME     : 时间
DATETIME : 日期时间型
示例:
select cast('9.0' as decimal);
-- 执行结果: 9

select cast('9.5' as decimal(10,2))
-- 执行结果: 9.50

select now()
-- 执行结果: 2021-04-17 12:46:59

select cast(now() as date)
-- 执行结果: 2021-04-17 

select cast(now() as time)
-- 执行结果: 12:46:59

select cast(now() as datetime)
-- 执行结果: 2021-04-17 12:46:59

06、concat 相关函数

1)concat()

  • 功能:将多个字符串拼接成一个字符串。
    • 拼接结果为连接参数产生的字符串,如果有任何一个参数为null,则拼接结果为null。
  • 语法:concat(str1, str2,...)
select concat(id, username, sex) from `user`;
select concat(id, ',', username, ',', sex) from `user`;

2)concat_ws()

  • 功能:将多个字符串连接成一个字符串,但是可以指定分隔符(concat with separator)
  • 语法:concat_ws(separator, str1, str2, ...)
    • 第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则拼接结果为null。
select concat_ws(',', id, username, sex) from `user`;

3)group_concat()

  • 功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
  • 语法:group_concat ( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
    • 使用distinct可以排除重复值;
    • 使用order by可以对一个分组中的值进行排序
    • separator是一个字符串值,缺省为一个逗号。
select age, group_concat(id) from `user` group by age;
select age, group_concat(id order by id desc separator '_') from `user` group by age;

-- 先拼接同一分组中的每行数据的多个字段,再拼接同一分组
select age, group_concat(concat_ws('-',id,sex) order by sex) from `user` group by age;

-- 在同一分组中的每行数据的拼接结果后加上&
select age, group_concat(concat_ws('-',id,sex), '&') from `user` group by age;

八、索引操作

1、创建索引

【直接创建】

-- 创建普通索引
create index 索引名 on 表名(字段);
-- 创建唯一索引
create unique index 索引名 on 表名(字段);
-- 创建普通组合索引
create index 索引名 on 表名(字段1,字段2);
-- 创建唯一组合索引
create unique index 索引名 on 表名(字段1,字段2);

【修改表时指定】

-- 添加主键索引(唯一且不为Null)
alter table 表名 add primary key(字段);
-- 添加唯一索引(除了NULL外,NULL可能会出现多次)
alter table 表名 add unique 索引名(字段);
-- 添加普通索引
alter table 表名 add index 索引名(字段); 
-- 添加全文索引
alter table 表名 add fulltext 索引名(字段);

【创建表时指定】

CREATE TABLE teacher (
    id INT PRIMARY KEY AUTO_INCREMENT,  -- 主键索引
    `name` VARCHAR(32),
    telephone VARCHAR(11) UNIQUE, 		-- 唯一索引
    sex VARCHAR(5),
    birthday DATE,
    student_id INT,
    INDEX(`name`), 						-- 普通索引
    CONSTRAINT fk_01 FOREIGN KEY (student_id) REFERENCES student(id) -- 外键索引
);

-- 备注: 如果不指定索引名称,默认为建立索引的字段名

2、删除索引

-- 直接删除
drop index 索引名 on 表名;

-- 修改表时删除 【掌握】
alter table 表名 drop index 索引名;

3、查看索引

show index from 表名; 
# 查询结果说明
1. table : 表
2. Non_unique: 是否唯一(0表示true,1表示false)
3. Key_name : 索引的名字
4. Column_name : 索引所在的列
5. Null : 是否允许为空(YES表示允许,空表示不允许)
6. Index_type: 索引的数据结构类型

九、Json操作

create table test_json (
    id INT,
    json_field JSON
);

1、Json对象操作

-- 对象
insert into test_json (id, json_field) values (1, '{"name": "John", "age": 18}');

-- 嵌套对象
insert into test_json (id, json_field) values 
(2, '{"age": 18, "name": "John", "address": {"city": "上海", "country": "中国"}}');

-- 数组
insert into test_json (id, json_field) values 
(3, '{"age": 18, "name": "John", "friend": ["Lucy", "Jack", "Tom"]}');

1)添加元素

使用 json_setjson_insert 函数来 添加新元素 到 JSON 对象或数组中。

update test_json set json_field = json_set(json_field, '$.city', '上海');
update test_json set json_field = json_insert(json_field, '$.sex', '男');

2)删除元素

使用 json_remove 函数来 删除 JSON 对象或数组中的元素。

update test_json set json_field = json_remove(json_field, '$.city');

3)修改元素

使用 json_setjson_replace 函数来 更新 JSON 对象或数组中的现有值。

update test_json set json_field = json_set(json_field, '$.sex', '女');
update test_json set json_field = json_replace(json_field, '$.age', 28);

4)查询元素

使用 json_extract 函数从 JSON 数据中提取指定路径的值

# "John"
select json_extract(json_field, '$.name') from test_json;
# 18
select json_extract(json_field, '$.age') from test_json;

使用 ->->> 操作符从 JSON 字符串中提取值。

  • -> 返回 JSON 对象或数组中的属性。
  • ->> 返回 JSON 对象或数组中的属性的字符串值。
select json_field->'$.name' as name from test_json;		# "John"
select json_field->>'$.name' as name from test_json;	# John

select json_field->'$.age' as name from test_json;		# 18
select json_field->>'$.age' as name from test_json;		# 18

总之,->->> 操作符用于不同的用途,前者返回 JSON 类型,后者返回字符串类型。你可以根据需要来选择使用哪个操作符。如果你需要进一步操作 JSON 数据的子元素,通常使用 ->,如果你只需要获取值作为字符串,可以使用 ->>

2、Json嵌套对象操作

使用 json_array 在 JSON对象 中添加 嵌套对象

update test_json set json_field = 
json_set(json_field, '$.address', json_object('country', '中国', 'city', '上海'));

1)添加元素

update test_json set json_field = json_set(json_field, '$.address.province', '江苏省');

3)删除元素

update test_json set json_field = json_remove(json_field, '$.address.country');

4)修改元素

update test_json set json_field = json_set(json_field, '$.address.city', '南京');

5)查询元素

select json_extract(json_field, '$.address') from test_json;
select json_extract(json_field, '$.address.city') from test_json;

3、Json数组操作

使用 json_array 在 JSON对象 中添加 数组

update test_json set json_field = json_set(json_field, '$.friend', json_array('Jack', 'Tom'));

1)添加元素

使用 json_array_append 函数将一个元素添加到 JSON 数组的末尾。

update test_json set json_field = json_array_append(json_field, '$.friend', 'Roce');

使用 json_array_insert 函数将一个元素插入到 JSON 数组的指定位置(索引从0开始)

update test_json set json_field = json_array_insert(json_field, '$.friend[0]', 'Mark');

2)删除元素

-- 索引从0开始
update test_json set json_field = json_remove(json_field, '$.friend[0]');

3)修改元素

-- 索引从0开始
update test_json set json_field = json_set(json_field, '$.friend[0]', 'Lucy');

4)查询元素

-- 索引从0开始
select json_extract(json_field, '$.friend[0]') from test_json;

4、其他操作

1)json_keys

返回 JSON 对象中的所有键作为 JSON 数组

select json_keys(json_field) from test_json;	# ["age", "name", "address"]

2)json_length

使用 json_length 函数判断 JSON 对象 键的数量 或 数组的长度

-- key的数量
select json_length(json_field) from test_json;

-- 数组长度
select json_length(json_field, '$.friend') from test_json;

3)json_contains

使用 json_contains 函数判断 JSON 对象 是否包含指定的 JSON 值

-- 是否包含特定值
select json_contains(json_field, '"John"', '$.name') from test_json;
select json_contains(json_field, '"上海"', '$.address.city') from test_json;

-- 是否包含特定json子集
select json_contains(json_field, '{"name": "John"}', '$') from test_json;
select json_contains(json_field, '{"city": "上海", "country": "中国"}', '$.address') from test_json;

-- 是否包含特定键和值的组合
select json_contains(json_field, '{"name": "John", "age": 18}', '$') from test_json;

4)json_contains_path

使用 json_contains_path 函数判断 JSON 对象 是否包含指定的 JSON 路径

  • 'one':表示只需要找到一个匹配的路径,如果找到任何一个匹配的路径,函数就会返回 1
  • 'all':表示需要找到所有匹配的路径,只有当所有匹配的路径都被找到时,函数才会返回 1
select json_contains_path(json_field, 'one', '$.age') from test_json;
select json_contains_path(json_field, 'all', '$.name', '$.age') from test_json;

十、其他操作

# 查询mysql版本
select version();
# 查询缓存相关配置
show variables like '%cache%';

# 不走缓存查询
select sql_no_cache count(*) from users; 

# 走缓存查询
select sql_cache count(*) from users; 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL 5.1参考手册 目录 前言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的差别 1.8.6. MySQL处理约束的方式 2. 安装MySQL 2.1. 一般安装问题 2.1.1. MySQL支持的操作系统 2.1.2. 选择要安装的MySQL分发版 2.1.3. 怎样获得MySQL 2.1.4. 通过MD5校验和或GnuPG验证软件包的完整性 2.1.5. 安装布局 2.2. 使用二进制分发版的标准MySQL安装 2.3. 在Windows上安装MySQL 2.3.1. Windows系统要求 2.3.2. 选择安装软件包 2.3.3. 用自动安装器安装MySQL 2.3.4. 使用MySQL安装向导 2.3.5. 使用配置向导 2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7. 在其它类Unix系统中安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 2.8.2. 典型配置选项 2.8.3. 从开发源码树安装 2.8.4. 处理MySQL编译问题 2.8.5. MIT-pthreads注意事项 2.8.6. 在Windows下从源码安装MySQL 2.8.7. 在Windows下编译MySQL客户端 2.9. 安装后的设置和测试 2.9.1. Windows下安装后的过程 2.9.2. Unix下安装后的过程 2.9.3. 使初始MySQL账户安全 2.10. 升级MySQL 2.10.1. 从5.0版升级 2.10.2. 升级授权表 2.10.3. 将MySQL数据库拷贝到另一台机器 2.11. 降级MySQL 2.12. 具体操作系统相关的注意事项 2.12.1. Linux注意事项 2.12.2. Mac OS X注意事项 2.12.3. Solaris注意事项 2.12.4. BSD注意事项 2.12.5. 其它Unix注意事项 2.12.6. OS/2注意事项 2.13. Perl安装注意事项 2.13.1. 在Unix中安装Perl 2.13.2. 在Windows下安装ActiveState Perl 2.13.3. 使用Perl DBI/DBD接口的问题 3. 教程 3.1. 连接与断开服务器 3.2. 输入查询 3.3. 创建并使用数据库 3.3.1. 创建并选择数据库 3.3.2. 创建表 3.3.3. 将数据装入表中 3.3.4. 从表检索信息 3.4. 获得数据库和表的信息 3.5. 在批处理模式下使用mysql 3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找所有未分发的孪生项 3.7.2. 显示孪生对状态的表 3.8. 与Apache一起使用MySQL 4. MySQL程序概述 4.1. MySQL程序概述 4.2. 调用MySQL程序 4.3. 指定程序选项 4.3.1. 在命令行上使用选项 4.3.2. 使用选项文件 4.3.3. 用环境变量指定选项 4.3.4. 使用选项设置程序变量 5. 数据库管理 5.1. MySQL服务器和服务器启动脚本 5.1.1. 服务器端脚本和实用工具概述 5.1.2. mysqld-max扩展MySQL服务器 5.1.3. mysqld_safe:MySQL服务器启动脚本 5.1.4. mysql.server:MySQL服务器启动脚本 5.1.5. mysqld_multi:管理多个MySQL服务器的程序 5.2. mysqlmanager:MySQL实例管理器 5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:MySQL服务器 5.3.1. mysqld命令行选项 5.3.2. SQL服务器模式 5.3.3. 服务器系统变量 5.3.4. 服务器状态变量 5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA LOCAL安全问题 5.7. MySQL访问权限系统 5.7.1. 权限系统的作用 5.7.2. 权限系统工作原理 5.7.3. MySQL提供的权限 5.7.4. 与MySQL服务器连接 5.7.5. 访问控制, 阶段1:连接核实 5.7.6. 访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. MySQL服务器时区支持 5.11. MySQL日志文件 5.11.1. 错误日志 5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix中运行多个服务器 5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1. 复制介绍 6.2. 复制实施概述 6.3. 复制实施细节 6.3.1. 复制主线程状态 6.3.2. 复制从I/O线程状态 6.3.3. 复制从SQL线程状态 6.3.4. 复制传递和状态文件 6.4. 如何设置复制 6.5. 不同MySQL版本之间的复制兼容性 6.6. 升级复制设置 6.6.1. 将复制升级到5.0版 6.7. 复制特性和已知问题 6.8. 复制启动选项 6.9. 复制FAQ 6.10. 复制故障诊断与排除 6.11. 通报复制缺陷 6.12. 多服务器复制中的Auto-Increment 7. 优化 7.1. 优化概述 7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息) 7.2.2. 估计查询性能 7.2.3. SELECT查询的速度 7.2.4. MySQL怎样优化WHERE子句 7.2.5. 范围优化 7.2.6. 索引合并优化 7.2.7. MySQL如何优化IS NULL 7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. 其它优化技巧 7.3. 锁定事宜 7.3.1. 锁定方法 7.3.2. 表锁定事宜 7.4. 优化数据库结构 7.4.1. 设计选择 7.4.2. 使你的数据尽可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 7.4.6. MyISAM键高速缓冲 7.4.7. MyISAM索引统计集合 7.4.8. MySQL如何计算打开的表 7.4.9. MySQL如何打开和关闭表 7.4.10. 在同一个数据库中创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具概述 8.2. myisampack:生成压缩、只读MyISAM表 8.3. mysqlMySQL命令行工具 8.3.1. 选项 8.3.2. mysql命令 8.3.3. 怎样从文本文件执行SQL语句 8.3.4. mysql技巧 8.4. mysqlaccess:用于检查访问权限的客户端 8.5. mysqladmin:用于管理MySQL服务器的客户端 8.6. mysqlbinlog:用于处理二进制日志文件的实用工具 8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM日志文件内容 8.13. perror:解释错误代码 8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、表、索引、列和别名 9.2.1. 识别符限制条件 9.2.2. 识别符大小写敏感性 9.3. 用户变量 9.4. 系统变量 9.4.1. 结构式系统变量 9.5. 注释语法 9.6. MySQL中保留字的处理 10. 字符集支持 10.1. 常规字符集和校对 10.2. MySQL中的字符集和校对 10.3. 确定默认字符集和校对 10.3.1. 服务器字符集和校对 10.3.2. 数据库字符集和校对 10.3.3. 表字符集和校对 10.3.4. 列字符集和校对 10.3.5. 字符集和校对分配示例 10.3.6. 连接字符集和校对 10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句中使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 10.4. 字符集支持影响到的操作 10.4.1. 结果字符串 10.4.2. CONVERT() 10.4.3. CAST() 10.4.4. SHOW语句 10.5. Unicode支持 10.6. 用于元数据的UTF8 10.7. 与其它DBMS的兼容性 10.8. 新字符集配置文件格式 10.9. 国家特有字符集 10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列类型 11.1. 列类型概述 11.1.1. 数值类型概述 11.1.2. 日期和时间类型概述 11.1.3. 字符串类型概述 11.2. 数值类型 11.3. 日期和时间类型 11.3.1. DATETIME、DATE和TIMESTAMP类型 11.3.2. TIME类型 11.3.3. YEAR类型 11.3.4. Y2K事宜和日期类型 11.4. String类型 11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 12. 函数和操作符 12.1. 操作符 12.1.1. 操作符优先级 12.1.2. 圆括号 12.1.3. 比较函数和操作符 12.1.4. 逻辑操作符 12.2. 控制流程函数 12.3. 字符串函数 12.3.1. 字符串比较函数 12.4. 数值函数 12.4.1. 算术操作符 12.4.2. 数学函数 12.5. 日期和时间函数 12.6. MySQL使用什么日历? 12.7. 全文搜索功能 12.7.1. 布尔全文搜索 12.7.2. 全文搜索带查询扩展 12.7.3. 全文停止字 12.7.4. 全文限定条件 12.7.5. 微调MySQL全文搜索 12.8. Cast函数和操作符 12.9. 其他函数 12.9.1. 位函数 12.9.2. 加密函数 12.9.3. 信息函数 12.9.4. 其他函数 12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 13.1.5. CREATE TABLE语法 13.1.6. DROP DATABASE语法 13.1.7. DROP INDEX语法 13.1.8. DROP TABLE语法 13.1.9. RENAME TABLE语法 13.2. 数据操作语句 13.2.1. DELETE语法 13.2.2. DO语法 13.2.3. HANDLER语法 13.2.4. INSERT语法 13.2.5. LOAD DATA INFILE语法 13.2.6. REPLACE语法 13.2.7. SELECT语法 13.2.8. Subquery语法 13.2.9. TRUNCATE语法 13.2.10. UPDATE语法 13.3. MySQL实用工具语句 13.3.1. DESCRIBE语法(获取有关列的信息) 13.3.2. USE语法 13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制语句 13.6.1. 用于控制主服务器的SQL语句 13.6.2. 用于控制从服务器的SQL语句 13.7. 用于预处理语句的SQL语法 14. 插件式存储引擎体系结构 14.1. 前言 14.2. 概述 14.3. 公共MySQL数据库服务器层 14.4. 选择存储引擎 14.5. 将存储引擎指定给表 14.6. 存储引擎和事务 14.7. 插入存储引擎 14.8. 拔出存储引擎 14.9. 插件式存储器的安全含义 15. 存储引擎和表类型 15.1. MyISAM存储引擎 15.1.1. MyISAM启动选项 15.1.2. 键所需的空间 15.1.3. MyISAM表的存储格式 15.1.4. MyISAM表方面的问题 15.2. InnoDB存储引擎 15.2.1. InnoDB概述 15.2.2. InnoDB联系信息 15.2.3. InnoDB配置 15.2.4. InnoDB启动选项 15.2.5. 创建InnoDB表空间 15.2.6. 创建InnoDB表 15.2.7. 添加和删除InnoDB数据和日志文件 15.2.8. InnoDB数据库的备份和恢复 15.2.9. 将InnoDB数据库移到另一台机器上 15.2.10. InnoDB事务模型和锁定 15.2.11. InnoDB性能调节提示 15.2.12. 多版本的实施 15.2.13. 表和索引结构 15.2.14. 文件空间管理和磁盘I/O 15.2.15. InnoDB错误处理 15.2.16. 对InnoDB表的限制 15.2.17. InnoDB故障诊断与排除 15.3. MERGE存储引擎 15.3.1. MERGE表方面的问题 15.4. MEMORY (HEAP)存储引擎 15.5. BDB (BerkeleyDB)存储引擎 15.5.1. BDB支持的操作系统 15.5.2. 安装BDB 15.5.3. BDB启动选项 15.5.4. BDB表的特性 15.5.5. 修改BDB所需的事宜 15.5.6. 对BDB表的限制 15.5.7. 使用BDB表时可能出现的错误 15.6. EXAMPLE存储引擎 15.7. FEDERATED存储引擎 15.7.1. 安装FEDERATED存储引擎 15.7.2. FEDERATED存储引擎介绍 15.7.3. 如何使用FEDERATED表 15.7.4. FEDERATED存储引擎的局限性 15.8. ARCHIVE存储引擎 15.9. CSV存储引擎 15.10. BLACKHOLE存储引擎 16. 编写自定义存储引擎 16.1. 前言 16.2. 概述 16.3. 创建存储引擎源文件 16.4. 创建handlerton 16.5. 对处理程序进行实例化处理 16.6. 定义表扩展 16.7. 创建表 16.8. 打开表 16.9. 实施基本的表扫描功能 16.9.1. 实施store_lock()函数 16.9.2. 实施external_lock()函数 16.9.3. 实施rnd_init()函数 16.9.4. 实施info()函数 16.9.5. 实施extra()函数 16.9.6. 实施rnd_next()函数 16.10. 关闭表 16.11. 为存储引擎添加对INSERT的支持 16.12. 为存储引擎添加对UPDATE的支持 16.13. 为存储引擎添加对DELETE的支持 16.14. API引用 16.14.1. bas_ext 16.14.2. close 16.14.3. create 16.14.4. delete_row 16.14.5. delete_table 16.14.6. external_lock 16.14.7. extra 16.14.8. info 16.14.9. open 16.14.10. rnd_init 16.14.11. rnd_next 16.14.12. store_lock 16.14.13. update_row 16.14.14. write_row 17. MySQL簇 17.1. MySQL簇概述 17.2. MySQL簇的基本概念 17.3. 多计算机的简单基础知识 17.3.1. 硬件、软件和联网 17.3.2. 安装 17.3.3. 配置 17.3.4. 首次启动 17.3.5. 加载示例数据并执行查询 17.3.6. 安全关闭和重启 17.4. MySQL簇的配置 17.4.1. 从源码创建MySQL簇 17.4.2. 安装软件 17.4.3. MySQL簇的快速测试设置 17.4.4. 配置文件 17.5. MySQL簇中的进程管理 17.5.1. 用于MySQL簇的MySQL服务器进程使用 17.5.2. ndbd,存储引擎节点进程 17.5.3. ndb_mgmd,“管理服务器”进程 17.5.4. ndb_mgm,“管理客户端”进程 17.5.5. 用于MySQL簇进程的命令选项 17.6. MySQL簇的管理 17.6.1. MySQL簇的启动阶段 17.6.2. “管理客户端”中的命令 17.6.3. MySQL簇中生成的事件报告 17.6.4. 单用户模式 17.6.5. MySQL簇的联机备份 17.7. 使用与MySQL簇的高速互连 17.7.1. 配置MySQL簇以使用SCI套接字 17.7.2. 理解簇互连的影响 17.8. MySQL簇的已知限制 17.9. MySQL簇发展的重要历程 17.9.1. MySQL 5.0中的MySQL簇变化 17.9.2. 关于MySQL簇的MySQL 5.1发展历程 17.10. MySQL簇常见问题解答 17.11. MySQL簇术语表 18. 分区 18.1. MySQL中的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. KEY分区 18.2.5. 子分区 18.2.6. MySQL分区处理NULL值的方式 18.3. 分区管理 18.3.1. RANGE和LIST分区的管理 18.3.2. HASH和KEY分区的管理 18.3.3. 分区维护 18.3.4. 获取关于分区的信息 19. MySQL中的空间扩展 19.1. 前言 19.2. OpenGIS几何模型 19.2.1. Geometry类的层次 19.2.2. 类Geometry 19.2.3. 类Point 19.2.4. 类Curve 19.2.5. 类LineString 19.2.6. 类Surface 19.2.7. 类Polygon 19.2.8. 类GeometryCollection 19.2.9. 类MultiPoint 19.2.10. 类MultiCurve 19.2.11. 类MultiLineString 19.2.12. 类MultiSurface 19.2.13. 类MultiPolygon 19.3. 支持的空间数据格式 19.3.1. 著名的文本(WKT)格式 19.3.2. 著名的二进制(WKB)格式 19.4. 创建具备空间功能的MySQL数据库 19.4.1. MySQL空间数据类型 19.4.2. 创建空间值 19.4.3. 创建空间列 19.4.4. 填充空间列 19.4.5. 获取空间数据 19.5. 分析空间信息 19.5.1. Geometry格式转换函数 19.5.2. Geometry函数 19.5.3. 从已有Geometry创建新Geometry的函数 19.5.4. 测试几何对象间空间关系的函数 19.5.5. 关于几何最小边界矩形(MBR)的关系 19.5.6. 测试几何类之间空间关系的函数 19.6. 优化空间分析 19.6.1. 创建空间索引 19.6.2. 使用空间索引 19.7. MySQL的一致性和兼容性 19.7.1. 尚未实施的GIS特性 20. 存储程序和函数 20.1. 存储程序和授权表 20.2. 存储程序的语法 20.2.1. CREATE PROCEDURE和CREATE FUNCTION 20.2.2. ALTER PROCEDURE和ALTER FUNCTION 20.2.3. DROP PROCEDURE和DROP FUNCTION 20.2.4. SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION 20.2.5. SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS 20.2.6. CALL语句 20.2.7. BEGIN ... END复合语句 20.2.8. DECLARE语句 20.2.9. 存储程序中的变量 20.2.10. 条件和处理程序 20.2.11. 光标 20.2.12. 流程控制构造 20.3. 存储程序、函数、触发程序和复制:常见问题 20.4. 存储子程序和触发程序的二进制日志功能 21. 触发程序 21.1. CREATE TRIGGER语法 21.2. DROP TRIGGER语法 21.3. 使用触发程序 22. 视图 22.1. ALTER VIEW语法 22.2. CREATE VIEW语法 22.3. DROP VIEW语法 22.4. SHOW CREATE VIEW语法 23. INFORMATION_SCHEMA信息数据库 23.1. INFORMATION_SCHEMA表 23.1.1. INFORMATION_SCHEMA SCHEMATA表 23.1.2. INFORMATION_SCHEMA TABLES表 23.1.3. INFORMATION_SCHEMA COLUMNS表 23.1.4. INFORMATION_SCHEMA STATISTICS表 23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表 23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表 23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表 23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表 23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表 23.1.10. INFORMATION_SCHEMA COLLATIONS表 23.1.11. INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表 23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表 23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表 23.1.14. INFORMATION_SCHEMA ROUTINES表 23.1.15. INFORMATION_SCHEMA VIEWS表 23.1.16. INFORMATION_SCHEMA TRIGGERS表 23.1.17. 其他INFORMATION_SCHEMA表 23.2. SHOW语句的扩展 24. 精度数学 24.1. 数值的类型 24.2. DECIMAL数据类型更改 24.3. 表达式处理 24.4. 四舍五入 24.5. 精度数学示例 25. API和库 25.1. libmysqld,嵌入式MySQL服务器库 25.1.1. 嵌入式MySQL服务器库概述 25.1.2. 使用libmysqld编译程序 25.1.3. 使用嵌入式MySQL服务器时的限制 25.1.4. 与嵌入式服务器一起使用的选项 25.1.5. 嵌入式服务器中尚需完成的事项(TODO) 25.1.6. 嵌入式服务器示例 25.1.7. 嵌入式服务器的许可 25.2. MySQL C API 25.2.1. C API数据类型 25.2.2. C API函数概述 25.2.3. C API函数描述 25.2.4. C API预处理语句 25.2.5. C API预处理语句的数据类型 25.2.6. C API预处理语句函数概述 25.2.7. C API预处理语句函数描述 25.2.8. C API预处理语句方面的问题 25.2.9. 多查询执行的C API处理 25.2.10. 日期和时间值的C API处理 25.2.11. C API线程函数介绍 25.2.12. C API嵌入式服务器函数介绍 25.2.13. 使用C API时的常见问题 25.2.14. 创建客户端程序 25.2.15. 如何生成线程式客户端 25.3. MySQL PHP API 25.3.1. 使用MySQL和PHP的常见问题 25.4. MySQL Perl API 25.5. MySQL C++ API 25.5.1. Borland C++ 25.6. MySQL Python API 25.7. MySQL Tcl API 25.8. MySQL Eiffel Wrapper 25.9. MySQL程序开发实用工具 25.9.1. msql2mysql:转换mSQL程序以用于MySQL 25.9.2. mysql_config:获取编译客户端的编译选项 26. 连接器 26.1. MySQL Connector/ODBC 26.1.1. MyODBC介绍 26.1.2. 关于ODBC和MyODBC的一般信息 26.1.3. 如何安装MyODBC 26.1.4. 在Windows平台上从二进制版本安装MyODBC 26.1.5. I在Unix平台上从二进制版本安装MyODBC 26.1.6. 在Windows平台上从源码版本安装MyODBC 26.1.7. 在Unix平台上从源码版本安装MyODBC 26.1.8. 从BitKeeper开发源码树安装MyODBC 26.1.9. MyODBC配置 26.1.10. 与MyODBC连接相关的事宜 26.1.11. MyODBC和Microsoft Access 26.1.12. MyODBC和Microsoft VBA及ASP 26.1.13. MyODBC和第三方ODBC工具 26.1.14. MyODBC通用功能 26.1.15. 基本的MyODBC应用步骤 26.1.16. MyODBC API引用 26.1.17. MyODBC数据类型 26.1.18. MyODBC错误代码 26.1.19. MyODBC与VB:ADO、DAO和RDO 26.1.20. MyODBC与Microsoft.NET 26.1.21. 感谢 26.2. MySQL Connector/NET 26.2.1. 前言 26.2.2. 下载并安装MySQL Connector/NET 26.2.3. Connector/NET体系结构 26.2.4. 使用MySQL Connector/NET 26.2.5. MySQL Connector/NET变更史 26.3. MySQL Connector/J 26.3.1. 基本的JDBC概念 26.3.2. 安装 Connector/J 26.3.3. JDBC引用 26.3.4. 与J2EE和其他Java框架一起使用 Connector/J 26.3.5. 诊断 Connector/J方面的问题 26.3.6. Changelog 26.4. MySQL Connector/MXJ 26.4.1. 前言 26.4.2. 支持平台: 26.4.3. Junit测试要求 26.4.4. 运行Junit测试 26.4.5. 作为JDBC驱动程序的一部分运行 26.4.6. 在Java对象中运行 26.4.7. MysqldResource API 26.4.8. 在JMX代理(custom)中运行 26.4.9. 部署在标准的JMX代理环境下 (JBoss) 26.4.10. 安装 27. 扩展MySQL 27.1. MySQL内部控件 27.1.1. MySQL线程 27.1.2. MySQL测试套件 27.2. 为MySQL添加新函数 27.2.1. 自定义函数接口的特性 27.2.2. CREATE FUNCTION/DROP FUNCTION语法 27.2.3. 添加新的自定义函数 27.2.4. 添加新的固有函数 27.3. 为MySQL添加新步骤 27.3.1. 步骤分析 27.3.2. 编写步骤 A. 问题和常见错误 A.1. 如何确定导致问题的原因 A.2. 使用MySQL程序时的常见错误 A.2.1. 拒绝访问 A.2.2. 无法连接到[local] MySQL服务器 A.2.3. 客户端不支持鉴定协议 A.2.4. 输入密码时出现密码错误 A.2.5. 主机的host_name被屏蔽 A.2.6. 连接数过多 A.2.7. 内存溢出 A.2.8. MySQL服务器不可用 A.2.9. 信息包过大 A.2.10. 通信错误和失效连接 A.2.11. 表已满 A.2.12. 无法创建文件/写入文件 A.2.13. 命令不同步 A.2.14. 忽略用户 A.2.15. 表tbl_name不存在 A.2.16. 无法初始化字符集 A.2.17. 文件未找到 A.3. 与安装有关的事宜 A.3.1. 与MySQL客户端库的链接问题 A.3.2. 如何以普通用户身份运行MySQL A.3.3. 与文件许可有关的问题 A.4. 与管理有关的事宜 A.4.1. 如何复位根用户密码 A.4.2. 如果MySQL依然崩溃,应作些什么 A.4.3. MySQL处理磁盘满的方式 A.4.4. MySQL将临时文件储存在哪里 A.4.5. 如何保护或更改MySQL套接字文件/tmp/mysql.sock A.4.6. 时区问题 A.5. 与查询有关的事宜 A.5.1. 搜索中的大小写敏感性 A.5.2. 使用DATE列方面的问题 A.5.3. 与NULL值有关的问题 A.5.4. 与列别名有关的问题 A.5.5. 非事务表回滚失败 A.5.6. 从相关表删除行 A.5.7. 解决与不匹配行有关的问题 A.5.8. 与浮点比较有关的问题 A.6. 与优化器有关的事宜 A.7. 与表定义有关的事宜 A.7.1. 与ALTER TABLE有关的问题 A.7.2. 如何更改表中的列顺序 A.7.3. TEMPORARY TABLE问题 A.8. MySQL中的已知事宜 A.8.1. MySQL中的打开事宜 B. 错误代码和消息 B.1. 服务器错误代码和消息 B.2. 客户端错误代码和消息 C. 感谢 C.1. MySQL AB处的开发人 C.2. MySQL贡献人 C.3. 资料员和译员 C.4. MySQL使用和包含的库 C.5. 支持MySQL的软件包 C.6. 用于创建MySQL的工具 C.7. MySQL支持人员 D. MySQL变更史 D.1. 5.1.x版中的变更情况(开发) D.1.1. 5.1.2版中的变更情况(尚未发布) D.1.2. 5.1.1版中的变更情况(尚未发布) D.2. MyODBC的变更情况 D.2.1. MyODBC 3.51.12的变更情况 D.2.2. MyODBC 3.51.11的变更情况 E. 移植到其他系统 E.1. 调试MySQL服务器 E.1.1. 针对调试编译MySQL E.1.2. 创建跟踪文件 E.1.3. 在gdb环境下调试mysqld E.1.4. 使用堆栈跟踪 E.1.5. 使用日志文件找出mysqld中的错误原因 E.1.6. 如果出现表崩溃,请生成测试案例 E.2. 调试MySQL客户端 E.3. DBUG软件包 E.4. 关于RTS线程的注释 E.5. 线程软件包之间的差异 F. 环境变量 G. MySQL正则表达式 H. MySQL中的限制 H.1. 联合的限制 I. 特性限制 I.1. 对存储子程序和触发程序的限制 I.2. 对服务器端光标的限制 I.3. 对子查询的限制 I.4. 对视图的限制 I.5. 对XA事务的限制 J. GNU通用公共许可 K. MySQL FLOSS许可例外 索引 图形清单 14.1. MySQL插件式存储引擎的体系结构 14.2. 存储引擎比较 16.1. MySQL体系结构 表格清单 26.1. 连接属性 26.2. 转换表 26.3. 用于ResultSet.getObject()的MySQL类型和Java类型 26.4. MySQL对Java编码名称的翻译 示例清单 26.1. 从DriverManager获得连接 26.2. 使用java.sql.Statement执行SELECT查询 26.3. 存储程序示例 26.4. 使用Connection.prepareCall() 26.5. 注册输出参数 26.6. 设置CallableStatement输入参数 26.7. 检索结果和输出参数值 26.8. 使用Statement.getGeneratedKeys()检索AUTO_INCREMENT列的值 26.9. 使用SELECT LAST_INSERT_ID()检索AUTO_INCREMENT列的值 26.10. 在可更新的ResultSets中检索AUTO_INCREMENT列的值 26.11. 设置Unix环境下的CLASSPATH 26.12. 与J2EE应用服务器一起使用连接池 26.13. 重试逻辑的事务示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scj1022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值