MySQL(数据库)
mysql
常用命令:
创建库:
create database rzh;
查看所有的数据库
show databases;
查看所有表:
show tables;
切换库:
use rzh;
创建表 表名(字段 字段类型):
create tables test(id int);
不同的字段会有不同种类的字段类型
姓名:字符串类型
年龄:数字类型
出生:日期类型(时间)
语法:
create table 表名 (
字段一 数据类型[完整性约束条件],数据唯一,数据非空,添加默认值
字段二 数据类型[完整性约束条件],
字段三 数据类型[完整性约束条件],
字段四 数据类型[完整性约束条件],
);
表名:student
名字(name):自定义 char,varchara(6)
年龄(age):自定义 int
体重(weight):自定义 int
身高(height):自定义 float(3,2)
create table student (
id int,
name varchar(10),
age int,
weight float(3,1),
height float(3,2)
);
desc student; #查看表结构
Field:字段 Type:数据类型 Null:空 Key:完整性约束条件 Default:默认值 Extra:自定义
select * from student; #查看表中所有信息
表名:student
学号 名字 年龄 体重 身高
1 佩奇 6 180 80
2 乔治 3 150 50
3 迪迦 1024 1000 300
完整性约束条件:目的是为了限制数据的写入,保证数据的完整性
完整性约束条件是对字段进行限制,要求对字段进行操作的时候符合要求
主键约束 primary key
外键约束 foreign key
唯一性约束 unique
非空约束 not null
自增约束 auto_increment
默认值约束 default
主键的作用:非空且唯一
如果字段设置了主键约束,那么该字段的值非空且唯一,可以定义联合主键格式
添加单个主键:
直接添加在数据类型之后
字段 数据类型 主键约束
create table test(id int primary key);
insert into student values(1,'佩奇',6,180,80);
向表中插入数据
create table student_new (
id int,
name varchar(10),
age int,
weight float(3),
height float(3)
);
insert into student_new values(1,'佩奇',3,150,50);
insert into student_new values(2,'迪迦',1024,88.8,3.24);
insert into student_new values(3,'乔治',3,150,50);
添加联合主键:
create table student_pri (
id int,
name varchar(10),
age int,
weight float(3),
height float(3),
primary key (id,name) #添加联合主键
);
insert into student_pri values(1,'佩奇',6,180,80);
insert into student_pri values(2,'乔治',3,150,50);
insert into student_pri values(3,'迪迦',1024,1000,300);
insert into student_pri values(4,'雷欧',1086,1300,295);
insert into student_pri values(5,'赛文',1100,1250,333);
联合主键就是用2个或2个以上的字段组成主键。用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引,其中一个字段一定要有值
唯一约束,unique:这个字段值必须是唯一的,不能重复
直接添加到数据类型后面
创建表:
create table student_uni (
id int unique,
name varchar(10),
age int,
weight float(3),
height float(3),
primary key (id,name)
);
查看表结构:
desc student_uni;
插入值:
insert into student_uni values(1,'赛文',1100,1250,333);
insert into student_uni(id) values(1);
非空约束: not null 这个字段的值不能为空
直接添加到数据类型后面
创建表:
create table student_nn (
id int not null,
name varchar(10),
age int,
weight float(3),
height float(3)
);
默认值约束: default:如果某个字段设置了默认值约束,在写入数据时,如果没有对这个字段赋值,则会使用默认值
create table student_de (
id int,
name varchar(10),
age int default '18',
weight int,
height int
);
插入数据:
insert into student_de(id) values(1);
查看:
select * from student_de;
insert into 表名 values(值); #一定是对表的所有数据进行数据添加
insetr into 表名(字段) values(值); #对表中指定的字段进行数据添加
insert into 表名 values(值),(值),(值),(值);
insert into 表名 values(1,‘rzh’,18,18,18),(2,‘rzh’,16,16,16);
自增约束: 特殊的约束条件,用于为表中写入新的记录生成唯一的值
自增约束不能单独存在,必须要有主键约束
一个表里面只能有一个自增约束字段
格式:
字段 数据类型 auto_increment
create table student_auto (
id int unique auto_increment, #唯一性约束条件
name char(10),
age int default '18',
weight int,
height int
);
insert into student_auto(name) values('rzh'); #向表中插入数据
select * from student_auto; #查看表中信息
desc student_auto; #查看表结构
id从1开始,每次自增1
查看自增约束的相关变量
语法:
show variables like 'auto_increment%';
show variables 变量 加个s代表复数
like 模糊匹配
set auto_increment_offset=2;
set auto_increment_increment=2;
外键约束:
用来建立两个表格之间的联系,一张表可以对应某一个字段设置外键,也可以对多个字段设置外键,添加外键的表属于子表,绑定外键的属于父表,要求子表与父表之间存在关系的字段数据类型得一致 父表的那个字段必须是主键
例:
表一 班级表 班级名称 mysql 学号(主键) 姓名
表二 学生信息表 学号 姓名 年龄 性别
格式:
constraint 外键约束名(自定义) foreign key(子表字段) references 父表名 主键
…………student_class……………学号……………………class……学号
父表:
create table class (
class_id int primary key,
class_name char(10) not null default 'mysql'
);
子表:
create table student (
id int,
name char(10) not null default 'xxx',
age int not null default '18',
sex char(2) not null default '男',
constraint student_class foreign key(id) references class(class_id)
);
小练习:
表名:students
学号 …… 姓名……年龄 …… 体重…… 身高…… 班级
1…………佩奇……6…………180………80
2…………乔治……3…………150………50
3…………迪迦……1024……1000………300
4…………雷欧……1086……1300………295
5…………赛文……1100……1250………333
表名:
班级名称……班级id……学生
小猪班………1…………佩奇 乔治
奥特曼班……2…………迪迦 雷欧 赛文
小矮子班……3…………佩奇 乔治
高个子班……4…………迪迦 雷欧 赛文
创建父表:
create table class2 (
class_id int unique auto_increment, #唯一性 自增约束
class_name char(10) not null, #非空
student_name char(10) not null,
primary key (class_id,class_name) #联合主键约束
);
创建子表:
create table student3 (
id int,
name char(10) not null default 'xxx',
age int not null default '18', #默认值约束
weight int not null,
height int not null,
class_id int,
constraint students_class4 foreign key(id) references class2(class_id) #外键约束
);
向classs(父)表中插入数据:
insert into class2 values(1,'小猪班','佩奇 乔治');
insert into class2 values(2,'奥特曼班','迪迦 雷欧 赛文');
insert into class2 values(3,'小矮子班','佩奇 乔治');
insert into class2 values(4,'高个子班','迪迦 雷欧 赛文');
向students(子)表中插入数据:
insert into student3 values(1,'佩奇',6,180,80,1);
insert into student3 values(2,'乔治',3,150,50,1);
insert into student3 values(3,'迪迦',1024,1000,300,2);
insert into student3 values(4,'雷欧',1086,1300,295,2);
insert into student3 values(5,'赛文',1100,1250,333,2); #因为父表中只有四个id数,所以这条命令可能会插入不进去
insert into student3 values(1,'佩奇',6,180,80,3);
insert into student3 values(2,'乔治',3,150,50,3);
insert into student3 values(3,'迪迦',1024,1000,300,4);
insert into student3 values(4,'雷欧',1086,1300,295,4);
insert into student3 values(5,'赛文',1100,1250,333,4);
查看表结构:
父表:
mysql> desc class2;
+--------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+----------------+
| class_id | int(11) | NO | PRI | NULL | auto_increment |
| class_name | char(10) | NO | PRI | NULL | |
| student_name | char(10) | NO | | NULL | |
+--------------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
子表:
mysql> desc student3;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
| name | char(10) | NO | | xxx | |
| age | int(11) | NO | | 18 | |
| weight | int(11) | NO | | NULL | |
| height | int(11) | NO | | NULL | |
+--------+----------+------+-----+---------+-------+
5 rows in set (0.00 sec)
查看表中信息:
mysql> select * from class2;
+----------+--------------+----------------------+
| class_id | class_name | student_name |
+----------+--------------+----------------------+
| 1 | 小猪班 | 佩奇 乔治 |
| 2 | 奥特曼班 | 迪迦 雷欧 赛文 |
| 3 | 小矮子班 | 佩奇 乔治 |
| 4 | 高个子班 | 迪迦 雷欧 赛文 |
+----------+--------------+----------------------+
4 rows in set (0.00 sec)mysql> select * from student3;
+------+--------+------+--------+--------+
| id | name | age | weight | height |
+------+--------+------+--------+--------+
| 1 | 佩奇 | 6 | 180 | 80 |
| 2 | 乔治 | 3 | 150 | 50 |
| 3 | 迪迦 | 1024 | 1000 | 300 |
| 4 | 雷欧 | 1086 | 1300 | 295 |
+------+--------+------+--------+--------+
4 rows in set (0.00 sec)
mysql常用增删改查命令:
1、查看指定表格的内容:
select * from 表名
2、更改/更新表格中的数据:
语法
update 表名 set 字段=新值,[字段=新值......] [where 条件语句]
例:
update class set teacher=‘xmj’ where class_id=1
3、删除数据表中的数据
delete from 表名 #删除数据表中的数据,不会释放表空间,可以找回,只是用户看不见
truncate table 表名 #删除数据会释放空间,数据再也找不回
4、删除表结构
drop table 表名 删除指定的表名
drop table 表1,表2,表3... 删除多个表
5.修改表名
alter table 表名 rename to 新表名
例:alter table test rename to test1;
6、修改字段的数据类型
alter table 表名 modify 字段名 数据类型
alter table testq modify id char(3);
7.修改字段名称
alter table 表名 change 字段名 新字段名 新数据类型;
例:alter table testq change id testq_id int;
8.添加新的字段
alter table 表名 add 新字段名 数据类型 [完整性约束条件]
[first | after]
alter table testq add name char unique first;
9.删除字段
alter table 表名 drop 字段名
例:alter table testq drop name1;
10.删除外键
alter table 表名 drop foreign key 外键名;
alter table testq drop foreign key student_class;
11、修改表的存储引擎
alter table 表名 engine=存储引擎
alter table student engine=‘myisam’;
show databases;
show engines\G
alter table sw add name char unique first age;
12、修改并调整字段位置
alter table 表名 change 旧字段 新字段 字段类型 完整性约束条件 first|after 字段名
alter table test change name new char unique after age;
数据类型
数据类型主要分为整数和浮点数
整数的特点: 正数,负数不带小数点
整数:
数值类型:存储需求 符号取值范围(±)无符号取值范围
tinyint 很小的整数 -127~127 0–255 1字节
smallint 小的整数 -32768~32767 2字节
mediumint 中等的整数 3字节
int 普通的整数 4字节
bigint 大的整数 8字节 2^64-1
1字节是8位二进制
create table test (
a tinyint,
b smallint,
c mediumint,
d int,
e bigint
);
insert into test values(127,255,111,3442,312); #取值范围不能超过数值类型所对应的最大值
mysql> select * from test;
+------+------+------+------+------+
| a | b | c | d | e |
+------+------+------+------+------+
| 127 | 255 | 111 | 3442 | 312 |
+------+------+------+------+------+
1 row in set (0.00 sec)
数值类型的显示位数并不严格,
数据类型后面加上unsigned,就是无符号取值范围
create table test1 (
a tinyint (1) unsigned
);
浮点数: 计算机在处理小数的能力有限
float(x,y): 单精浮点数,
x表示精度最多多少位,小数和整数之和
y表示标度,表示有几位小数
mysql> create table test3 (-> a float(3,1),-> b float(3,0),-> c float-> );
Query OK, 0 rows affected (0.00 sec)mysql> insert into test3 values(111,1111,111);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
double(x,y): 双精度浮点数,占8字节存储x的有效位为16位
mysql> create table test4 ( a double(10,5), b double );
Query OK, 0 rows affected (0.31 sec)mysql> insert into test4 values(11111.11111,1111111111);
Query OK, 1 row affected (0.00 sec)mysql> select * from test4;
+-------------+------------+
| a | b |
+-------------+------------+
| 11111.11111 | 1111111111 |
+-------------+------------+
1 row in set (0.00 sec)
decimal(x,y): 定点数,占16字节,x有效位65位
y也就是小数部分,最高30位(默认情况下)
mysql> create table test5 ( a decimal(10,2) );
Query OK, 0 rows affected (0.01 sec)mysql> insert into test5 values(10000000.99);
Query OK, 1 row affected (0.00 sec)mysql> select * from test5;
+-------------+
| a |
+-------------+
| 10000000.99 |
+-------------+
1 row in set (0.00 sec)
日期类型:
year: 年 显示格式有多种
第一种:以四位字符串格式表示,范围‘1901’-‘2155’
第二种:以四位数据类型表示,范围1901-2155
第三种:以两位数值类型表示,范围‘00’-‘99’
第四种:以两位数值类型表示,范围00-99
00-69 表示 2000-2068
70-69 表示 1970-1999
create table test6 (
a year
);
insert into test6 values('2020',20,'20',2020)
date:日期
格式一:‘YYYY-MM-DD’,YYYY表示年,MM表示月,DD表示天
‘1000-01-01’~‘9999-12-31’
格式二:‘YY-MM-DD’
‘YY’取值范围‘00’-‘99’ ‘00-69’表示’2000’-‘2069’ ‘70-99’,‘1970-1999’
格式三:YYMMDD
create table test7 ( a date );
insert into test7 values('2020-12-09'),('20-12-09'),(201209);
select * from test7;
+------------+
| a |
+------------+
| 2020-12-09 |
| 2020-12-09 |
| 2020-12-09 |
+------------+
time:时间
格式一:‘HH:MM:SS’ HH代表时 MM代表分 SS代表秒
格式二:‘HHMMSS’
格式三:‘D HH:MM:SS’ D表示天数,会计算成对应的小时与HH的值相加,D的取值范围-34~34
时间的取值范围‘-829:59:59’-'838:59:59’大概是35天前,三十五天后
负数表示今天以前
create table test8 ( a time );
insert into test8 values('10:27:25'),('102725'),('-1 10:27:25');
select * from test8;
+-----------+
| a |
+-----------+
| 10:27:25 |
| 10:27:25 |
| -34:27:25 |
+-----------+mysql> insert into test8 values('10:27:25'),('102725'),('-25 10:27:25');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0mysql> select * from test8;
+------------+
| a |
+------------+
| 10:27:25 |
| 10:27:25 |
| -34:27:25 |
| 10:27:25 |
| 10:27:25 |
| -610:27:25 |
+------------+
6 rows in set (0.00 sec)
datetime:日期与时间
格式一:‘YYYY-MM-DD HH;MM;SS’
取值范围:‘1010-01-01 00:00:00’~‘9999-12-31 99:99:99’
格式二:‘YY-MM-DD HH:MM:SS’
取值范围:‘00’-‘99’,‘00’-'69’表示‘2020’-‘2069’ ‘70’-‘99’表示‘1970’-‘1999’
格式三:格式三:‘YYYYMMDDHHMMSS’,‘YYMMDDHHMMSS’
create table test9 ( a datetime );
insert into test9 values('2020-12-09 10:42:40'),(20201209104240);
select * from test9;
+---------------------+
| a |
+---------------------+
| 2020-12-09 10:42:40 |
| 2020-12-09 10:42:40 |
+---------------------+
字符串数据类型:
大概分为两种:
文本字符串和二进制字符串
文本字符串:
char(M): 固定长度文本字符串,M表示宽度,最多可以写入并显示M个字符
M的取值范围是0-255,如果对字段写入的数据的字符数小于M,那么会以空格补充至M个字符,如果超出则会报错或警告
create table rzh_01(
name char(7)
);
insert into rzh_01 values('qwerr'),('qwerui');
varchar(M): 不定长度文本字符串,M显示宽度表示最多可以显示M个字符
M的取值范围是1-21844
如果显示的字符小于M,不会进行空格填充
如果写入的字符大于M,那么多出的字符会被截取或者报错
varchar会额外占用1-2个字节去记录写入的实际宽度的字符长度
字符个数<=255使用1字节,否则使用2字节
create table rzh_02(
name varchar(3)
);
insert into rzh_02 values('qwe');
insert into rzh_02 values('qwert'); #超过会被截取或报错
类型 | 支持存储大小和最大支持 |
---|---|
tinytext | 非常小的文本字符串 支持2^8-1 255字节 |
text | 小的文本字符串 支持2^16-1 |
mediumtext | 中等大小的文本字符串 支持2^24-1 |
longtext | 大的文本字符串 支持2^32-1 |
varchar的值超过21844会自动切换成mediumtext
create table rzh_3(
a varchar(22000)
);
enum枚举: 是一个字符串对象,在给定的范围内选择一个值
格式:
字段 enum(值1,值2,值3……值n)
如果值后面有空格键,会把空格删除,最多可以有65535个值
把值称为元素,每个值都有自己的编号,编号从1开始
写入数据时选择不存在的编号会导致字段内容为空
create table rzh_4(
id tinyint,
name char(11),
fenshu tinyint,
cj enum('优秀','良好','及格','不及格')
);
insert into rzh_4 values(1,'rzh',90,'优秀');
set: 集合,是一个字符串对象,可以在给定范围以内。选取0个或多个数值
格式:
字段 set(值1,值2……值n)
#值最多可以有64个,在写入数据的时候可以选择多个值写入
指定的值会按照设置的顺序自动排列
如果一个值选中了多次,会自动去重,重复的值,只会出现一次
如果写入不存在的值,会被删除
create table rzh_5(
a set('a','b','c','d','e')
);
insert into rzh_5 values('a,b,c'),('e,d,c,a');
二进制类型字符串:
属于字节流,不受字符集的限制,可以指定可写入字节的大小
一般用于存储图片,视频,音频等媒体数据
bit(M),M指的是字段可以存储的位的大小,M的取值范围是1-65
create table rzh_6(
a bit(10)
);
insert into rzh_6 values('c'),('a'),('c');
select bin(a) from rzh_6;
binary(M): 固定长度二进制字符串,M表示可以存储字节的大小
M的取值范围是0-255,如果写入的数据小于M的值,那么会以\0进行填充
\0一样是没有实际意义的
create table rzh_7(
a binary(4)
);
insert into rzh_7 values(1),('a'),('ab12');
insert into rzh_7 values(1),('a'),('哈哈'); #会告诉你超出范围
数据库默认utf-8字符集,字母字符数字都占一个字节,汉字占3字节
varbinary(M): 不定长度二进制字符串,M表示可以存储字节的大小
M的取值范围0-65535,如果写入的数据大小小于M的值,不会进行\0补充
会占用额外的1-2字节存储实际的大小
create table rzh_8(
a varbinary(6)
);
insert into rzh_8 values(111111),('哈哈');
二进制类型:
类型 | 支持存储大小 |
---|---|
tinyblob | 非常小的二进制字符串 2^8 |
blob | 小的二进制字符串 2^16 |
mediumblob | 中等大小的二进制字符串 2^24 |
longblob | 大的二进制字符串 2^32 |
create table rzh_9(
name char(11),
img mediumblob
);
insert into rzh_9 values('xx',load_file('/usr/local/mysql/data/5f8d2f350b621.jpg') );
算数运算符
+:加法运算
-:减法运算
*:乘法运算
/:除法运算
%:取余
比较运算符
>: 大于
=:等于
<:小于
>=:
<=
!=,<>
<=>
1、=等于运算符,用来判断数值,字符串,表达式是否相等,
如果返回值是1,则相等;返回0,代表不等,如果比较值为null,则返回null
2、<=>安全等于运算符,用来判断数值,字符串,和表达式是否相等
可以对空值进行比较,如果相等则返回1,不等返回0
对空值的判断
is null:判断一个值是否为空,是返回1,不是返回0
isnull:判断一个值是否为空,是返回1,不是返回0
is not null:判断一个值是否不为空,如果不为空返回1,为空返回0
between and:判断一个值是否在给定的范围以内
select 6 between 1 and 9;
返回最大值与最小值
least:当存在有两个或两个以上数据时,返回最小值,如果有null,返回null
select least(1,2,3,4,5,null),least('a','b','c');
greatest:当存在有两个或者两个以上数据时,返回最大值,如果有null,则返回null
select greatest(1,2,3,4,5,null),least('a','b','c');
in:判断一个值是否在指定的列表中
not in:判断一个值是否不在指定的列表中
select 5 in(1,2,3,4,5,6,null),'a' not in(1,2,3,4,5,6);
like:用来匹配字符串,符号_用于匹配任意一个字符,符号%匹配任意个任意字符
如果字符匹配则返回1,不匹配返回0
select 'zyg' like 'zy_','szjdha' like 's%','sljd' like 'z%jb_cj';
regexp:正则表达式匹配,用来匹配字符串,如果匹配返回1,不匹配返回0
^:匹配以...开头的字符串
$:匹配以...结尾的字符串
. 匹配任意一个字符
*:表示重复前面的字符任意次
.* :表示任意个任意字符
[]:用于匹配括号内的任意字符
select 'sjk' regexp '^s','sjk' regexp 'k$','sjk' regexp 's.k';
select 'sjk' regexp 's*','sjk' regexp 'j.*','sjk' regexp '[aed]';
逻辑运算符
not,!:逻辑非运算符
and,&&:逻辑与运算符
or,||:逻辑或运算符
xor:逻辑异运算符
1.not , ! 当操作数为0时返回1,当操作数是不为0是返回0,当操作数是null,返回null
select not 0,not 1,not null,not 'a';
2.and,&&当所有操作数为非零且值不为空时返回1,任意操作数为0返回0
当任意操作数不为0且不为空返回1
select null or 1,0 or 1,1 or 2;
3.or,||:当所有的操作数都为0时返回0,当操作数为0和null或者全为null返回null
当任意操作数不为0且不为空返回1
select null or 1,0 or 1,1 or 2;
4.xor:当任意一个操作数为NULL返回NULL,对于非NULL的操作数
如果两个操作数都为0或都不为0则返回0
如果一个操作数为0,一个操作数不为0则返回1
位运算符
|:或
&:与
^位异
~位取反
<<位左移
>>位右移
1.|:对应的二进制有一个或两个为1,则为1,反之为0
15|10 8|10
1 2 4 8
1 1 1 1 0001
0 1 0 1 0101
1111 0101
select 15 | 10,10 | 8;
2.&:对应的二进制都为1则是1,否则为0
15&10
1111
0101
0101
3.^位异运算,对应的二进制一样则为0,不同则为1
15^10
1111 1110
0101
1010
4,<<将指定的二进制向左移n位(值变大)
select 15 << 1;
1 2 4 8 16
1 1 1 1 0
0 1 1 1 1
5,>>将指定的二进制向右移n为(值变小)
select 15 >> 1;
6,~位取反:将对应的二进制的每一位进行反转,1变成0,0变成1,需要和&搭配使
~10 & 20
1 2 4 8 16
0 1 0 1 0
1 0 1 0 1
0 0 1 0 1
0 0 10 1
函数:
具有一定的功能,能够使我们的计算变得简单,将一些功能和步骤进行封装
分类:
数字类:
1、abs(n):绝对值
mysql> select abs(-1),abs(10),abs(0);
+---------+---------+--------+
| abs(-1) | abs(10) | abs(0) |
+---------+---------+--------+
| 1 | 10 | 0 |
+---------+---------+--------+
1 row in set (0.00 sec)
2、pi():圆周率
mysql> select pi();
+----------+
| pi() |
+----------+
| 3.141593 |
+----------+
1 row in set (0.00 sec)
3、sqrt(x):求平方根,负数没有平方根
mysql> select sqrt(18),sqrt(20);
+-------------------+------------------+
| sqrt(18) | sqrt(20) |
+-------------------+------------------+
| 4.242640687119285 | 4.47213595499958 |
+-------------------+------------------+
1 row in set (0.00 sec)
4、mod(x,y):求余函数
select mod(19,2);
5、获取整数的函数
ceil(x):获取的值最接近原数,且不小于原数的整数
mysql> select ceil(1.11);
+------------+
| ceil(1.11) |
+------------+
| 2 |
+------------+
ceiling(x):获取的值最接近原数,且不小于原数的整数
mysql> select ceiling(1.11);
+---------------+
| ceiling(1.11) |
+---------------+
| 2 |
+---------------+
1 row in set (0.01 sec)
floor(x):获取的值最接近原数,且大于原数的整数
mysql> select floor(1.11),floor(1.99);
+-------------+-------------+
| floor(1.11) | floor(1.99) |
+-------------+-------------+
| 1 | 1 |
+-------------+-------------+
1 row in set (0.00 sec)
6、rand():获取一个随机数的函数
获取的范围在0-1之间,每一次执行得到的数都不一样
mysql> select rand(),rand(),rand();
+--------------------+--------------------+---------------------+
| rand() | rand() | rand() |
+--------------------+--------------------+---------------------+
| 0.2071449199757957 | 0.7698830969351187 | 0.22798075548185107 |
+--------------------+--------------------+---------------------+
1 row in set (0.00 sec)
rand(x):获取一个随机数,根据x返回一个确定的随机数
mysql> select rand(6),rand(7),rand(8),rand(6);
+--------------------+--------------------+---------------------+--------------------+
| rand(6) | rand(7) | rand(8) | rand(6) |
+--------------------+--------------------+---------------------+--------------------+
| 0.6563190842571847 | 0.9065021936842261 | 0.15668530311126755 | 0.6563190842571847 |
+--------------------+--------------------+---------------------+--------------------+
1 row in set (0.00 sec)mysql> select rand(7);
+--------------------+
| rand(7) |
+--------------------+
| 0.9065021936842261 |
+--------------------+
1 row in set (0.00 sec)
7、四舍五入函数
round(x):对x进行四舍五入,保留整数,不保留小数
select(x,y):对x进行四舍五入,y是值从第几位数开始
mysql> select round(12.345,2),round(12.345,-2);
+-----------------+------------------+
| round(12.345,2) | round(12.345,-2) |
+-----------------+------------------+
| 12.35 | 0 |
+-----------------+------------------+
1 row in set (0.00 sec)mysql> select round(12.345,2),round(12.345,-1);
+-----------------+------------------+
| round(12.345,2) | round(12.345,-1) |
+-----------------+------------------+
| 12.35 | 10 |
+-----------------+------------------+
1 row in set (0.00 sec)
y是正数,表示小数点之后几位,y是负数,表示小数点前几位
8、truncate(x,y): 截取数值的函数,对x进行截取,y为正数,对小数部分进行截取,y为负数,则对整数部分进行截取
mysql> select truncate(123.456,2),truncate(123.456,-2);
+---------------------+----------------------+
| truncate(123.456,2) | truncate(123.456,-2) |
+---------------------+----------------------+
| 123.45 | 100 |
+---------------------+----------------------+
1 row in set (0.00 sec)
9、sign(x): 符号函数,x为正数时返回1,x为0时返回0,x为负数时,返回-1
x为null,返回null
mysql> select sign(1223),sign(-123),sign(null),sign(0);
+------------+------------+------------+---------+
| sign(1223) | sign(-123) | sign(null) | sign(0) |
+------------+------------+------------+---------+
| 1 | -1 | NULL | 0 |
+------------+------------+------------+---------+
1 row in set (0.00 sec)
10、pow(x,y): 幂运算函数,已知底数为5,指数为2,求5的2次方是多少
mysql> select pow(5,2);
+----------+
| pow(5,2) |
+----------+
| 25 |
+----------+
1 row in set (0.00 sec)
pow(x,y):求x的y次方是多少
exp(y):求e的y次方
mysql> select exp(1);
+-------------------+
| exp(1) |
+-------------------+
| 2.718281828459045 |
+-------------------+
1 row in set (0.00 sec)
11、对数的运算 ,已知底数为5,结果为25,求指数
log():以e为底
mysql> select log(25);
+--------------------+
| log(25) |
+--------------------+
| 3.2188758248682006 |
+--------------------+
1 row in set (0.00 sec)
log 10():以10为底
mysql> select log10(100);
+------------+
| log10(100) |
+------------+
| 2 |
+------------+
1 row in set (0.00 sec)
12、角度和弧度互相转化的函数
一个圆角,圆心角360°
弧度为2π弧度
180°对应π
90°对应1/2π
radians(x):将角度转化成弧度
mysql> select radians(180),radians(90),radians(360);
+-------------------+--------------------+-------------------+
| radians(180) | radians(90) | radians(360) |
+-------------------+--------------------+-------------------+
| 3.141592653589793 | 1.5707963267948966 | 6.283185307179586 |
+-------------------+--------------------+-------------------+
1 row in set (0.00 sec)mysql> select pi();
+----------+
| pi() |
+----------+
| 3.141593 |
+----------+
1 row in set (0.00 sec)
degrees(x):将弧度转化为角度
mysql> select degrees(pi()),degrees(pi()/2),degrees(pi()*2);
+---------------+-----------------+-----------------+
| degrees(pi()) | degrees(pi()/2) | degrees(pi()*2) |
+---------------+-----------------+-----------------+
| 180 | 90 | 360 |
+---------------+-----------------+-----------------+
1 row in set (0.00 sec)
角A的领边是b,对边是a,斜边是c
13、求正弦函数和反正弦函数
sin就是对边比斜边
sin(x):求弧度为x的正弦值
mysql> select sin(pi()/6);
+---------------------+
| sin(pi()/6) |
+---------------------+
| 0.49999999999999994 |
+---------------------+
1 row in set (0.00 sec)
asin(x):求正弦函数值对应的弧度
mysql> select degrees(asin(0.5));
+--------------------+
| degrees(asin(0.5)) |
+--------------------+
| 30.000000000000004 |
+--------------------+
1 row in set (0.00 sec)
14,、余弦函数
mysql> select cos(pi()/4);
+--------------------+
| cos(pi()/4) |
+--------------------+
| 0.7071067811865476 |
+--------------------+
1 row in set (0.00 sec)
acos(x):求余弦函数值对应的弧度
mysql> select degrees(acos(0.7));
+--------------------+
| degrees(acos(0.7)) |
+--------------------+
| 45.5729959991943 |
+--------------------+
1 row in set (0.00 sec)
15、正切函数
mysql> select tan(pi()/4);
+--------------------+
| tan(pi()/4) |
+--------------------+
| 0.9999999999999999 |
+--------------------+
1 row in set (0.01 sec)
atan(x):求正切函数值对应的弧度
mysql> select degrees(atan(1));
+------------------+
| degrees(atan(1)) |
+------------------+
| 45 |
+------------------+
1 row in set (0.00 sec)
16、余切函数
mysql> select cot(pi()/6),cot(pi()/3);
+--------------------+-------------------+
| cot(pi()/6) | cot(pi()/3) |
+--------------------+-------------------+
| 1.7320508075688774 | 0.577350269189626 |
+--------------------+-------------------+
1 row in set (0.00 sec)
字符串函数
1、计算字符长度的函数
char_length(str):统计字符串的个数,空格也算一个字符
mysql> select char_length('shao zhuang bu nu li');
+-------------------------------------+
| char_length('shao zhuang bu lu li') |
+-------------------------------------+
| 20 |
+-------------------------------------+
1 row in set (0.00 sec)mysql> select char_length('少壮不努力');
+--------------------------------+
| char_length('少壮不努力') |
+--------------------------------+
| 5 |
+--------------------------------+
1 row in set (0.00 sec)
2、合并字符串函数
concat(s1,s2…sn):值如果有null,则返回null
(‘老’)(‘大’)(‘徒伤悲’)
mysql> select concat('老','大','徒','伤','悲');
+---------------------------------------+
| concat('老','大','徒','伤','悲') |
+---------------------------------------+
| 老大徒伤悲 |
+---------------------------------------+
1 row in set (0.00 sec)
concat_ws(x,s1,s2):s1 x s2使用x作为分隔符,合并字符串
mysql> select concat_ws('@','1612977378','qq.com');
+--------------------------------------+
| concat_ws('@','1612977378','qq.com') |
+--------------------------------------+
| 1612977378@qq.com |
+--------------------------------------+
1 row in set (0.00 sec)
3、替换字符串函数
insert(s1,x,len,s2):从字符串s1x位开始,使用字符串s2进行替换,替换len的长度
mysql> select insert('xuexiaiwo',6,2,'buai');
+--------------------------------+
| insert('xuexiaiwo',6,2,'buai') |
+--------------------------------+
| xuexibuaiwo |
+--------------------------------+
1 row in set (0.00 sec)
4、大小写转换函数
lower(str):大写转换成小写
lcase(str):大写转换成小写
mysql> select lower('SoS'),lcase('OvO');
+--------------+--------------+
| lower('SoS') | lcase('OvO') |
+--------------+--------------+
| sos | ovo |
+--------------+--------------+
1 row in set (0.00 sec)
upper(str):小写转换成大写
ucase(str):小写转换成大写
mysql> select upper('SoS'),ucase('OvO');
+--------------+--------------+
| upper('SoS') | ucase('OvO') |
+--------------+--------------+
| SOS | OVO |
+--------------+--------------+
1 row in set (0.00 sec)
5、获取指定长度的字符串
left(s,n):从左开始获取字符串n位之后的字符
right(s,n):从右开始获取字符串n位之后的字符
mysql> select left('shaozhuangbunuli',4),right('shaozhuangbunuli',6);
+----------------------------+-----------------------------+
| left('shaozhuangbunuli',4) | right('shaozhuangbunuli',6) |
+----------------------------+-----------------------------+
| shao | bunuli |
+----------------------------+-----------------------------+
1 row in set (0.00 sec)
6、填充字符串函数
lpad(s1,len,s2):将字符串s1通过字符串s2向左填充至len个字符
rpad(s1,len,s2):将字符串s1通过字符串s2向右填充至len个字符
mysql> select lpad('456',6,'123'),rpad('456',6,'789');
+---------------------+--------------------+
| lpad('456',6,'123') | rpad('456',6,'789') |
+---------------------+--------------------+
| 123456 | 456789 |
+---------------------+--------------------+
1 row in set (0.00 sec)
7、删除空格的函数
ltrim(s):删除字符左边的函数
rtrim(s):删除字符右边的函数
trim(s):删除字符两边的空格
mysql> select ' AK47 ' as a,ltrim(' AK47')as a,rtrim(' AK47')as a,trim(' AK47')as a;
+--------+------+-------+------+
| a | a | a | a |
+--------+------+-------+------+
| AK47 | AK47 | AK47 | AK47 |
+--------+------+-------+------+
1 row in set (0.00 sec)
as表示重命名或者别名的意思
8、trim(s1 from str):删除指定字符串的函数,删除字符串str两边的带有字符串s1的内容
mysql> select trim('AK' from 'AKAWMAKM4AK');
+-------------------------------+
| trim('AK' from 'AKAWMAKM4AK') |
+-------------------------------+
| AWMAKM4 |
+-------------------------------+
1 row in set (0.00 sec)
9、repeat(str,n):重复生成指定的字符串,将字符串str重复n次
mysql> select repeat('你kin',2);
+--------------------+
| repeat('你kin',2) |
+--------------------+
| 你kin你kin |
+--------------------+
1 row in set (0.00 sec)
10、space(n):空格函数,生成n个空格
mysql> select space(2),space(4),space(6);
+----------+----------+----------+
| space(2) | space(4) | space(6) |
+----------+----------+----------+
| | | |
+----------+----------+----------+
1 row in set (0.00 sec)
11、replace(s,s1,s2):替换函数,将字符串中的字符s1替换成s2,区分大小写
mysql> select replace('kin','k','K');
+------------------------+
| replace('kin','k','K') |
+------------------------+
| Kin |
+------------------------+
1 row in set (0.00 sec)
12、strcmp(s1,s2):比较字符串之间的大小
mysql> select strcmp('a','A');
+-----------------+
| strcmp('a','A') |
+-----------------+
| 0 |
+-----------------+
1 row in set (0.00 sec)
如果s1>s2结果返回1,如果s1=s2结果返回0,如果s1<s2结果返回-1
13、获取子字符串的函数
substring(str,n,len):对字符串str的第n位开始获取字符串,获取len个字符
n为正表示从左开始数,n为负表示从右开始数0
mysql> select substring('kong ni ji wa',1,4);
+--------------------------------+
| substring('kong ni ji wa',1,4) |
+--------------------------------+
| kong |
+--------------------------------+
1 row in set (0.00 sec)
mid(str,n,len):对字符串str的第n位开始获取字符串,获取len个字符
mysql> select mid('kongnijiwa',1,4),mid('kongnijiwa',-6,4);
+-----------------------+------------------------+
| mid('kongnijiwa',1,4) | mid('kongnijiwa',-6,4) |
+-----------------------+------------------------+
| kong | niji |
+-----------------------+------------------------+
1 row in set (0.00 sec)
14、匹配字符串开始位置的函数
locate(str1,str):str1在str的第几位开始
position(str1 in str):str1在str的第几位开始
instr(str,str1)
mysql> select locate('zhi','xueyizhiyong'),position('xue' in 'xueyizhiyong');
+------------------------------+-----------------------------------+
| locate('zhi','xueyizhiyong') | position('xue' in 'xueyizhiyong') |
+------------------------------+-----------------------------------+
| 6 | 1 |
+------------------------------+-----------------------------------+
1 row in set (0.00 sec)
mysql> select instr('xueyizhiyong','yi');
+----------------------------+
| instr('xueyizhiyong','yi') |
+----------------------------+
| 4 |
+----------------------------+
1 row in set (0.00 sec)
15、reverse(s):对字符串s中的字符进行反转
mysql> select reverse('7654321');
+--------------------+
| reverse('7654321') |
+--------------------+
| 1234567 |
+--------------------+
1 row in set (0.00 sec)
16、elt(n,s1,s2,s3…sn):返回指定位置的字符串
mysql> select elt(3,'ni','hao','ya','word');
+-------------------------------+
| elt(3,'ni','hao','ya','word') |
+-------------------------------+
| ya |
+-------------------------------+
1 row in set (0.00 sec)
17、field(s,s1,s2…sn):返回指定字符串位置的函数
mysql> select field('how','are','you');
+--------------------------+
| field('how','are','you') |
+--------------------------+
| 0 |
+--------------------------+
1 row in set (0.00 sec)
18、find_in_set(s1,s2):返回字符串s1在字符串集合s2中的位置
mysql> select find_in_set('zhi','xue,yi,zhi,yong');
+--------------------------------------+
| find_in_set('zhi','xue,yi,zhi,yong') |
+--------------------------------------+
| 3 |
+--------------------------------------+
1 row in set (0.00 sec)
查询
#创建子表
mysql> create database rzh;
Query OK, 1 row affected (0.01 sec)mysql> use rzh;
Database changed
mysql> create table student(-> id int primary key auto_increment, #自增约束-> name varchar(6) default null, #默认值约束,默认为空-> class_id int default 1,-> sex char(3) not null,-> cj int default 0-> );
Query OK, 0 rows affected (0.10 sec)mysql> insert into student values(1,'迪迦',1,'G',88);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(2,'赛文',1,'G',78);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(3,'戴拿',1,'G',79);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(4,'赛罗',2,'G',85);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(5,'泰罗',2,'G',87);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(6,'雷欧',2,'G',88);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(7,'熊大',3,'G',86);
Query OK, 1 row affected (0.29 sec)mysql> insert into student values(8,'熊二',3,'G',85);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(9,'喜羊羊',4,'G',90);
Query OK, 1 row affected (0.01 sec)mysql> insert into student values(10,'懒羊羊',4,'G',65);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(11,'美羊羊',4,'M',86);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(12,'灰太狼',5,'G',95);
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(13,'红太狼',5,'M',80);
Query OK, 1 row affected (0.00 sec
创建父表
mysql> create table class(-> id int primary key auto_increment,-> name char(6) default null-> );
Query OK, 0 rows affected (0.05 sec)mysql> insert into class values(1,'老奥特曼班');
Query OK, 1 row affected (0.00 sec)mysql> insert into class values(2,'小奥特曼班');
Query OK, 1 row affected (0.00 sec)mysql> insert into class values(3,'狗熊班');
Query OK, 1 row affected (0.01 sec)mysql> insert into class values(4,'肥羊班');
Query OK, 1 row affected (0.00 sec)mysql> insert into class values(5,'大灰狼班');
Query OK, 1 row affected (0.00 sec)
1、基本查询
语法:
select * from 表名;
例:
select * from student;
select * from class;
2、条件查询: 根据条件语句对数据表进行数据的查询,返回的是符合条件的数据
格式:
select {*|字段名} from table where 条件语句
条件语句中常用的查询条件:
#比特符:=,>,<,>=,<=,!=,<>
例:
查询迪迦的相关信息
mysql> select * from student where name='迪迦';
+----+--------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+--------+----------+-----+------+
| 1 | 迪迦 | 1 | G | 88 |
+----+--------+----------+-----+------+
1 row in set (1.74 sec)
查询老奥特曼班学生的名字
mysql> select * from class where name='老奥特曼班';
+----+-----------------+
| id | name |
+----+-----------------+
| 1 | 老奥特曼班 |
+----+-----------------+
1 row in set (0.00 sec)mysql> select * from student where class_id=1;
+----+--------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+--------+----------+-----+------+
| 1 | 迪迦 | 1 | G | 88 |
| 2 | 赛文 | 1 | G | 78 |
| 3 | 戴拿 | 1 | G | 79 |
+----+--------+----------+-----+------+
3 rows in set (0.00 sec)
查询成绩达到85-100分之间的小朋友
mysql> select * from student where cj between 85 and 100;
+----+-----------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+-----------+----------+-----+------+
| 1 | 迪迦 | 1 | G | 88 |
| 4 | 赛罗 | 2 | G | 85 |
| 5 | 泰罗 | 2 | G | 87 |
| 6 | 雷欧 | 2 | G | 88 |
| 7 | 熊大 | 3 | G | 86 |
| 8 | 熊二 | 3 | G | 85 |
| 9 | 喜羊羊 | 4 | G | 90 |
| 11 | 美羊羊 | 4 | M | 86 |
| 12 | 灰太狼 | 5 | G | 95 |
+----+-----------+----------+-----+------+
9 rows in set (0.00 sec)
#确定集合:in,not in
例:查看班级编号1,2,3的学生的id和姓名
mysql> select id,name from student where class_id in (1,2,3);
+----+--------+
| id | name |
+----+--------+
| 1 | 迪迦 |
| 2 | 赛文 |
| 3 | 戴拿 |
| 4 | 赛罗 |
| 5 | 泰罗 |
| 6 | 雷欧 |
| 7 | 熊大 |
| 8 | 熊二 |
+----+--------+
8 rows in set (0.01 sec)
#字符匹配:like,not like
常用的通配符符号_表示任意一个字符,%表示任意个任意字符
例:找到成绩为85分的所有同学
mysql> select * from student where cj like (85);
+----+--------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+--------+----------+-----+------+
| 4 | 赛罗 | 2 | G | 85 |
| 8 | 熊二 | 3 | G | 85 |
+----+--------+----------+-----+------+
2 rows in set (0.00 sec)
找到所有姓赛的同学
mysql> select * from student where name like '赛%';
+----+--------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+--------+----------+-----+------+
| 2 | 赛文 | 1 | G | 78 |
| 4 | 赛罗 | 2 | G | 85 |
+----+--------+----------+-----+------+
2 rows in set (0.00 sec)
#空值判断:is null,is not null
例:
查看学生表的成绩字段是否存在空值
mysql> select * from student where cj is null;
Empty set (0.00 sec)mysql> select * from student where cj is not null;
+----+-----------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+-----------+----------+-----+------+
| 1 | 迪迦 | 1 | G | 88 |
| 2 | 赛文 | 1 | G | 78 |
| 3 | 戴拿 | 1 | G | 79 |
| 4 | 赛罗 | 2 | G | 85 |
| 5 | 泰罗 | 2 | G | 87 |
| 6 | 雷欧 | 2 | G | 88 |
| 7 | 熊大 | 3 | G | 86 |
| 8 | 熊二 | 3 | G | 85 |
| 9 | 喜羊羊 | 4 | G | 90 |
| 10 | 懒羊羊 | 4 | G | 65 |
| 11 | 美羊羊 | 4 | M | 86 |
| 12 | 灰太狼 | 5 | G | 95 |
| 13 | 红太狼 | 5 | M | 80 |
+----+-----------+----------+-----+------+
13 rows in set (0.00 sec)
#多重条件查询:当查询的条件有多个时,可以通过and,or,not对查询条件进行链接和限制
条件1 and 条件2 and 条件。。。 查询条件需要满足前后所有的条件
例:
查询班级编号为2且分数大于85分的同学的姓名
mysql> select name from student where class_id=2 and cj>85;
+--------+
| name |
+--------+
| 泰罗 |
| 雷欧 |
+--------+
2 rows in set (0.00 sec)
条件1 or 条件2 or 。。。。查询条件只需满足任一条件即可
例:
查询是女生或成绩低于85分的同学的姓名
mysql> select name from student where sex='M' or cj<85;
+-----------+
| name |
+-----------+
| 赛文 |
| 戴拿 |
| 懒羊羊 |
| 美羊羊 |
| 红太狼 |
+-----------+
5 rows in set (0.00 sec)
not条件:返回不满足查询条件的查询结果
例:
查询班级编号不是2的同学
mysql> select * from student where not class_id=2;
+----+-----------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+-----------+----------+-----+------+
| 1 | 迪迦 | 1 | G | 88 |
| 2 | 赛文 | 1 | G | 78 |
| 3 | 戴拿 | 1 | G | 79 |
| 7 | 熊大 | 3 | G | 86 |
| 8 | 熊二 | 3 | G | 85 |
| 9 | 喜羊羊 | 4 | G | 90 |
| 10 | 懒羊羊 | 4 | G | 65 |
| 11 | 美羊羊 | 4 | M | 86 |
| 12 | 灰太狼 | 5 | G | 95 |
| 13 | 红太狼 | 5 | M | 80 |
+----+-----------+----------+-----+------+
10 rows in set (0.00 sec)
3、对查询结果进行排序
格式:
select {*|字段} from 表名 order by 字段名 [desc]
例:
将成绩从低到高进行排序
mysql> select * from student order by cj;
+----+-----------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+-----------+----------+-----+------+
| 10 | 懒羊羊 | 4 | G | 65 |
| 2 | 赛文 | 1 | G | 78 |
| 3 | 戴拿 | 1 | G | 79 |
| 13 | 红太狼 | 5 | M | 80 |
| 4 | 赛罗 | 2 | G | 85 |
| 8 | 熊二 | 3 | G | 85 |
| 11 | 美羊羊 | 4 | M | 86 |
| 7 | 熊大 | 3 | G | 86 |
| 5 | 泰罗 | 2 | G | 87 |
| 6 | 雷欧 | 2 | G | 88 |
| 1 | 迪迦 | 1 | G | 88 |
| 9 | 喜羊羊 | 4 | G | 90 |
| 12 | 灰太狼 | 5 | G | 95 |
+----+-----------+----------+-----+------+
13 rows in set (0.00 sec)
例:将成绩从高到低进行排序
mysql> select * from student order by cj desc;
+----+-----------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+-----------+----------+-----+------+
| 12 | 灰太狼 | 5 | G | 95 |
| 9 | 喜羊羊 | 4 | G | 90 |
| 1 | 迪迦 | 1 | G | 88 |
| 6 | 雷欧 | 2 | G | 88 |
| 5 | 泰罗 | 2 | G | 87 |
| 11 | 美羊羊 | 4 | M | 86 |
| 7 | 熊大 | 3 | G | 86 |
| 8 | 熊二 | 3 | G | 85 |
| 4 | 赛罗 | 2 | G | 85 |
| 13 | 红太狼 | 5 | M | 80 |
| 3 | 戴拿 | 1 | G | 79 |
| 2 | 赛文 | 1 | G | 78 |
| 10 | 懒羊羊 | 4 | G | 65 |
+----+-----------+----------+-----+------+
13 rows in set (1.74 sec)
4、分页查询:当查询结果数量很多时,可以通过分页查询来进行控制
格式:
select {*|字段名} from 表名 [where 条件语句] limit offset
例:查看学生表中前3行的数据
mysql> select * from student limit 3;
+----+--------+----------+-----+------+
| id | name | class_id | sex | cj |
+----+--------+----------+-----+------+
| 1 | 迪迦 | 1 | G | 88 |
| 2 | 赛文 | 1 | G | 78 |
| 3 | 戴拿 | 1 | G | 79 |
+----+--------+----------+-----+------+
3 rows in set (0.00 sec)
例:查看学生表中第5行到第9行的信息
select * from student limit 5 offset 4;
例:查看学生表中第3行到第六行
select * from student limit 2,4;
5、分组查询:对查询结果进行分组显示,通常会搭配聚合函数一起使用
也可以和group_concat()搭配使用显示每个组成员的信息
格式:
select {*|字段|count(字段)|groupconcat(字段)} from 表名
[where 条件语句] group by 字段[having 条件语句]
常用的聚合函数 :
count():统计计数
max():求最大值
min():求最小值
sum():求和
avg():求平均值
例:将学生按照性别分组,并且统计男生多少人,女生多少人
mysql> select sex,count(sex) from student group by sex;
+-----+------------+
| sex | count(sex) |
+-----+------------+
| G | 11 |
| M | 2 |
+-----+------------+
2 rows in set (0.00 sec)
例:将学生按照班级分组,并统计每个班的人数,把名字列出
mysql> select class_id,count(class_id) num,group_concat(name) name from student group by class_id;
+----------+-----+-------------------------------+
| class_id | num | name |
+----------+-----+-------------------------------+
| 1 | 3 | 迪迦,赛文,戴拿 |
| 2 | 3 | 赛罗,泰罗,雷欧 |
| 3 | 2 | 熊二,熊大 |
| 4 | 3 | 喜羊羊,懒羊羊,美羊羊 |
| 5 | 2 | 灰太狼,红太狼 |
+----------+-----+-------------------------------+
5 rows in set (0.00 sec)
例:将学生按成绩分组,统计每个成绩的人数,把名字列出
mysql> select cj,count(cj) num,group_concat(name) name from student group by cj;
+------+-----+------------------+
| cj | num | name |
+------+-----+------------------+
| 65 | 1 | 懒羊羊 |
| 78 | 1 | 赛文 |
| 79 | 1 | 戴拿 |
| 80 | 1 | 红太狼 |
| 85 | 2 | 赛罗,熊二 |
| 86 | 2 | 美羊羊,熊大 |
| 87 | 1 | 泰罗 |
| 88 | 2 | 雷欧,迪迦 |
| 90 | 1 | 喜羊羊 |
| 95 | 1 | 灰太狼 |
+------+-----+------------------+
10 rows in set (0.00 sec)
6、多表查询:从指定的多张表进行查询
格式:
select {*|字段} from 表1,表2… [where 条件语句]
例:同时查看学生表和班级表中的数据
mysql> select * from student,class;
7、连接查询,在多表查询时,通过对多表中合适的字段建立关系,优化查询结果
内连接:自然连接查询 内查询
外连接:左连接 右连接
自然连接查询:通过自然连接查询的方式查询班级和学生信息表的信息
select * from student,class where student.class_id=class.id;
select student.name,student.cj,class.name from student,class
where student.class_id=class.id;
内查询:
格式:
select {*|字段} from 表1 inner join 表2 on 连接条件
select student.name,student.cj,class.name from student inner join
class on student.class_id=class.id;
外连接-左连接
返回表1都存在的行,如果建立左连接关系的字段,只有表一存在,那么表二对应内容会
显示null
格式
select {*|字段} from 表1 left outer join 表2 on 连接条件
select student.name,student.cj,class.name from student leftouter join class on student.class_id=class.id;
外连接-右连接
返回表2都存在的行,如果建立右连接关系的字段的值,只有表2存在,那么表一
相对应的值会以null显示
格式
select {*|字段} from 表1 right outer join 表2 on 连接条件
select * from student right outer join class on
student.class_id=class.id;
insert into class values(6,'铠甲勇士班');
insert into student values(13,'奥利给班',7,'G',18);
8、联合查询:把两次或多次查询结果和并起来,要求对两张或多张表查询结果的字段数量必须一致,数据类型和字段名可以不一样,显示查询结果时,字段名以第一张表的字段名显示
格式:
select {*|字段} from 表名 union [all] select {*|字段} from 表名
例:
select id,class_id from student union select * from class;
9、嵌套查询:将一个查询块(一个select-from-where语句称为一个查询块)
嵌套在另一个查询块的where子句中或having短句的条件中查询
嵌套查询的三种类型:
#使用IN的子查询:在嵌套查询中,子查询的结果如果是一个集合,就可以使用关键字
IN来调用子查询的结果
例:
查询成绩和熊二,熊大一样的学生的名字分数
mysql> select name,cj from student where cj in (select cj from student where name='熊二' or name='熊大');
+-----------+------+
| name | cj |
+-----------+------+
| 赛罗 | 85 |
| 熊大 | 86 |
| 熊二 | 85 |
| 美羊羊 | 86 |
+-----------+------+
4 rows in set (0.00 sec)
查询成绩和熊二,熊大不一样的学生的名字分数
mysql> select name,cj from student where cj not in (select cj from student where name='熊二' or name='熊大');
+-----------+------+
| name | cj |
+-----------+------+
| 迪迦 | 88 |
| 赛文 | 78 |
| 戴拿 | 79 |
| 泰罗 | 87 |
| 雷欧 | 88 |
| 喜羊羊 | 90 |
| 懒羊羊 | 65 |
| 灰太狼 | 95 |
| 红太狼 | 80 |
+-----------+------+
9 rows in set (0.00 sec)
#带有比较符号的嵌套查询:如果子查询语句返回的结果是单个值,那么父查询就可以通过比较符来调用子查询的结果
例:
查询成绩大于迪迦的学生的名字和分数
mysql> select name,cj from student where cj>(select cj from student where name='迪迦');
+-----------+------+
| name | cj |
+-----------+------+
| 喜羊羊 | 90 |
| 灰太狼 | 95 |
+-----------+------+
2 rows in set (0.00 sec)
#通过any和all的子查询,当子查询的个数有多个时,可以使用any和all搭配比较符来调用子查询的结果
例:查询成绩低于喜羊羊,迪迦,熊大的名字和分数
mysql> select name,cj from student where cj < all (select cj from student where name='喜羊羊' or name='迪迦' or name='熊大');
+-----------+------+
| name | cj |
+-----------+------+
| 赛文 | 78 |
| 戴拿 | 79 |
| 赛罗 | 85 |
| 熊二 | 85 |
| 懒羊羊 | 65 |
| 红太狼 | 80 |
+-----------+------+
6 rows in set (0.00 sec)
查询练习
1、创建数据表employee和dept,并插入数据
mysql> create database rzh;
Query OK, 1 row affected (0.00 sec)mysql> use rzh;
Database changed#创建employee表
mysql> create table employee( e_id int(11) not null unique,-> e_name varchar(50) not null, -> e_sex char(2), dept_id int(11) not null, -> e_job varchar(50) not null,-> e_salary int(11) not null, -> hireDate date not null , -> constraint employee_dept foreign key(dept_id) references dept(dept_id) );
Query OK, 0 rows affected (0.03 sec)#创建dept表
mysql> create table dept(-> dept_id int(11) primary key not null unique auto_increment,-> d_name varchar(50) not null,-> d_location varchar(100)-> );
Query OK, 0 rows affected (0.00 sec)查看一下表结构:
mysql> desc employee;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| e_id | int(11) | NO | PRI | NULL | |
| e_name | varchar(50) | NO | | NULL | |
| e_sex | char(2) | YES | | NULL | |
| dept_id | int(11) | NO | | NULL | |
| e_job | varchar(50) | NO | | NULL | |
| e_salary | int(11) | NO | | NULL | |
| hireDate | date | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)mysql> desc dept;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| dept_id | int(11) | NO | PRI | NULL | auto_increment |
| d_name | varchar(50) | NO | | NULL | |
| d_location | varchar(100) | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
#向employee表中插入数据
mysql> insert into employee values(1001,'SMTTH','M',20,'CLERK',800,'2005-11-12');
Query OK, 1 row affected (0.00 sec)mysql> insert into employee values(1002,'ALLEN','F',30,'SALESMAN',1600,'2003-05-12');
Query OK, 1 row affected (0.01 sec)mysql> insert into employee values(1003,'WARO','F',30,'SALESMAN',1250,'2003-05-12');
Query OK, 1 row affected (0.00 sec)mysql> insert into employee values(1004,'JONES','M',20,'MANAGER',2975,'1998-05-18');
Query OK, 1 row affected (0.00 sec)mysql> insert into employee values(1007,'CLARK','M',10,'MANAGER',2450,'2002-09-12');
Query OK, 1 row affected (0.29 sec)mysql> insert into employee values(1008,'SCOTT','M',20,'ANALYSE',3000,'2003-05-12');
Query OK, 1 row affected (0.00 sec)mysql> insert into employee values(1009,'KING','F',10,'PRESIDENT',5000,'1995-01-01');
Query OK, 1 row affected (0.00 sec)mysql> insert into employee values(1010,'TURNER','F',30,'SALESMAN',1500,'1997-10-12');
Query OK, 1 row affected (0.00 sec)mysql> insert into employee values(1011,'ADAMS','M',20,'CLERK',1100,'1999-10-05');
Query OK, 1 row affected (0.00 sec)mysql> insert into employee values(1012,'JAMES','F',30,'CLERK',950,'2008-06-15');
Query OK, 1 row affected (0.00 sec)#向dept表中添加数据
mysql> insert into dept values(10,'ACCOUNTINC','shanghai');
Query OK, 1 row affected (0.00 sec)mysql> insert into dept values(20,'RESEARCH','Beijing');
Query OK, 1 row affected (0.00 sec)mysql> insert into dept values(30,'SALES','ShenZhen');
Query OK, 1 row affected (0.00 sec)mysql> insert into dept values(40,'OPERATTONS','FuJian');
Query OK, 1 row affected (0.00 sec)
2、在employee表中,查询所有记录的e_id,e_name和e_salary字段值
mysql> select e_id,e_name,e_salary from employee -> ;
+------+--------+----------+
| e_id | e_name | e_salary |
+------+--------+----------+
| 1001 | SMTTH | 800 |
| 1002 | ALLEN | 1600 |
| 1003 | WARO | 1250 |
| 1004 | JONES | 2975 |
| 1005 | MARTIN | 1250 |
| 1006 | BLAKE | 2850 |
| 1007 | CLARK | 2450 |
| 1008 | SCOTT | 3000 |
| 1009 | KING | 5000 |
| 1010 | TURNER | 1500 |
| 1011 | ADAMS | 1100 |
| 1012 | JAMES | 950 |
+------+--------+----------+
12 rows in set (0.00 sec)
3、在employee表中,查询dept_id等于10和20的所有记录
mysql> select * from employee where dept_id in (10,20);
+------+--------+-------+---------+-----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+-----------+----------+------------+
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1004 | JONES | M | 20 | MANAGER | 2975 | 1998-05-18 |
| 1007 | CLARK | M | 10 | MANAGER | 2450 | 2002-09-12 |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 |
| 1009 | KING | F | 10 | PRESIDENT | 5000 | 1995-01-01 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
+------+--------+-------+---------+-----------+----------+------------+
6 rows in set (0.00 sec)
4、在employee表中,查询工资范围在800-2500之间的员工的信息
mysql> select * from employee where e_salary between 800 and 2500;
+------+--------+-------+---------+----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+----------+----------+------------+
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1007 | CLARK | M | 10 | MANAGER | 2450 | 2002-09-12 |
| 1010 | TURNER | F | 30 | SALESMAN | 1500 | 1997-10-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 |
+------+--------+-------+---------+----------+----------+------------+
8 rows in set (0.00 sec)
5、在employee表中,查询部门编号为20的部门中的员工信息
mysql> select * from employee where dept_id=20;
+------+--------+-------+---------+---------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+---------+----------+------------+
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1004 | JONES | M | 20 | MANAGER | 2975 | 1998-05-18 |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
+------+--------+-------+---------+---------+----------+------------+
4 rows in set (0.00 sec)
6、在employee表中,查询每个部门最高工资的员工信息
mysql> select * from employee order by e_salary desc;
+------+--------+-------+---------+-----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+-----------+----------+------------+
| 1009 | KING | F | 10 | PRESIDENT | 5000 | 1995-01-01 |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 |
| 1004 | JONES | M | 20 | MANAGER | 2975 | 1998-05-18 |
| 1006 | BLAKE | F | 30 | MANAGER | 2850 | 1997-02-15 |
| 1007 | CLARK | M | 10 | MANAGER | 2450 | 2002-09-12 |
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1010 | TURNER | F | 30 | SALESMAN | 1500 | 1997-10-12 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 |
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
+------+--------+-------+---------+-----------+----------+------------+
12 rows in set (0.00 sec)
7、查询员工BLAKE所在部门和部门所在地
mysql> select employee.e_name,dept.d_name,dept.d_location from employee,dept where employee.e_name='BLAKE' and employee.dept_id=dept.dept_id;
+--------+--------+------------+
| e_name | d_name | d_location |
+--------+--------+------------+
| BLAKE | SALES | ShenZhen |
+--------+--------+------------+
1 row in set (0.00 sec)
8、使用连接查询、查询所有员工的部门和部门信息
mysql> select employee.e_name,dept.* from employee,dept where employee.dept_id=dept.dept_id;
+--------+---------+------------+------------+
| e_name | dept_id | d_name | d_location |
+--------+---------+------------+------------+
| CLARK | 10 | ACCOUNTINC | shanghai |
| KING | 10 | ACCOUNTINC | shanghai |
| SMTTH | 20 | RESEARCH | Beijing |
| JONES | 20 | RESEARCH | Beijing |
| SCOTT | 20 | RESEARCH | Beijing |
| ADAMS | 20 | RESEARCH | Beijing |
| ALLEN | 30 | SALES | ShenZhen |
| WARO | 30 | SALES | ShenZhen |
| MARTIN | 30 | SALES | ShenZhen |
| BLAKE | 30 | SALES | ShenZhen |
| TURNER | 30 | SALES | ShenZhen |
| JAMES | 30 | SALES | ShenZhen |
+--------+---------+------------+------------+
12 rows in set (0.00 sec)
9、在employee表中,计算每个部门各多少名员工
mysql> select dept_id,count(dept_id) from employee group by dept_id;
+---------+----------------+
| dept_id | count(dept_id) |
+---------+----------------+
| 10 | 2 |
| 20 | 4 |
| 30 | 6 |
+---------+----------------+
3 rows in set (0.00 sec)
10、在employee表中,计算不同类型职业的总工资数
mysql> select e_job,sum(e_salary) from employee group by e_job;
+-----------+---------------+
| e_job | sum(e_salary) |
+-----------+---------------+
| ANALYSE | 3000 |
| CLERK | 2850 |
| MANAGER | 8275 |
| PRESIDENT | 5000 |
| SALESMAN | 5600 |
+-----------+---------------+
5 rows in set (0.00 sec)
11、在employee表中,计算不同部门的平均工资
mysql> select dept_id,avg(e_salary) from employee group by dept_id;
+---------+---------------+
| dept_id | avg(e_salary) |
+---------+---------------+
| 10 | 3725.0000 |
| 20 | 1968.7500 |
| 30 | 1566.6667 |
+---------+---------------+
3 rows in set (0.00 sec)
12、在employee表中,查询工资低于1500的员工信息
mysql> select * from employee where e_salary<1500;
+------+--------+-------+---------+----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+----------+----------+------------+
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 |
+------+--------+-------+---------+----------+----------+------------+
5 rows in set (0.00 sec)
13、在employee表中,将查询记录先按照部门编号由高到底排列,在按员工工资由高到底排列
mysql> select * from employee order by dept_id desc,e_salary desc;
+------+--------+-------+---------+-----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+-----------+----------+------------+
| 1006 | BLAKE | F | 30 | MANAGER | 2850 | 1997-02-15 |
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1010 | TURNER | F | 30 | SALESMAN | 1500 | 1997-10-12 |
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 |
| 1004 | JONES | M | 20 | MANAGER | 2975 | 1998-05-18 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1009 | KING | F | 10 | PRESIDENT | 5000 | 1995-01-01 |
| 1007 | CLARK | M | 10 | MANAGER | 2450 | 2002-09-12 |
+------+--------+-------+---------+-----------+----------+------------+
12 rows in set (0.00 sec)
14、在employee表中,查询员工姓名以字母A或S开头的员工信息
mysql> select * from employee where e_name like 'A%' or e_name like 'S%';
+------+--------+-------+---------+----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+----------+----------+------------+
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
+------+--------+-------+---------+----------+----------+------------+
4 rows in set (0.00 sec)
15、在employee表中,查询到目前为止,工龄大于等于10年的员工信息
mysql> select * from employee where hireDate<=date_sub(curdate(),interval 10 year);
+------+--------+-------+---------+-----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+-----------+----------+------------+
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1004 | JONES | M | 20 | MANAGER | 2975 | 1998-05-18 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1006 | BLAKE | F | 30 | MANAGER | 2850 | 1997-02-15 |
| 1007 | CLARK | M | 10 | MANAGER | 2450 | 2002-09-12 |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 |
| 1009 | KING | F | 10 | PRESIDENT | 5000 | 1995-01-01 |
| 1010 | TURNER | F | 30 | SALESMAN | 1500 | 1997-10-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 |
+------+--------+-------+---------+-----------+----------+------------+
12 rows in set (0.00 sec)
16、计算所有女员工(F)的年龄
mysql> select e_name,e_sex,year(curdate()) -year(hireDate) as year from employee where e_sex='F';
+--------+-------+------+
| e_name | e_sex | year |
+--------+-------+------+
| ALLEN | F | 17 |
| WARO | F | 17 |
| BLAKE | F | 23 |
| KING | F | 25 |
| TURNER | F | 23 |
| JAMES | F | 12 |
+--------+-------+------+
6 rows in set (0.00 sec)
17、使用LIMIT查询从第3条记录开始到第6条记录
mysql> select * from employee limit 2,4;
+------+--------+-------+---------+----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+----------+----------+------------+
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1004 | JONES | M | 20 | MANAGER | 2975 | 1998-05-18 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1006 | BLAKE | F | 30 | MANAGER | 2850 | 1997-02-15 |
+------+--------+-------+---------+----------+----------+------------+
4 rows in set (0.00 sec)
18、查询销售人员(SALSEMAN)的最低工资
mysql> select e_job,min(e_salary) from employee group by dept_id having e_job='SALESMAN';
+----------+---------------+
| e_job | min(e_salary) |
+----------+---------------+
| SALESMAN | 950 |
+----------+---------------+
1 row in set (0.00 sec)
19、查询名字以字母N或者S结尾的记录
mysql> select * from employee where e_name like '%N' or e_name like '%S';
+------+--------+-------+---------+----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+----------+----------+------------+
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1004 | JONES | M | 20 | MANAGER | 2975 | 1998-05-18 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 |
+------+--------+-------+---------+----------+----------+------------+
5 rows in set (0.00 sec)
20、查询在BeiJing工作的员工的姓名和职务
mysql> select employee.e_name,dept.d_name,dept.d_location from employee,dept where dept.d_location='BeiJing' and employee.dept_id=dept.dept_id;
+--------+----------+------------+
| e_name | d_name | d_location |
+--------+----------+------------+
| SMTTH | RESEARCH | Beijing |
| JONES | RESEARCH | Beijing |
| SCOTT | RESEARCH | Beijing |
| ADAMS | RESEARCH | Beijing |
+--------+----------+------------+
4 rows in set (0.00 sec)
21、使用左连接方式查询employee和dept表
mysql> select * from employee left outer join dept on employee.dept_id=dept.dept_id;
+------+--------+-------+---------+-----------+----------+------------+---------+------------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate | dept_id | d_name | d_location |
+------+--------+-------+---------+-----------+----------+------------+---------+------------+------------+
| 1007 | CLARK | M | 10 | MANAGER | 2450 | 2002-09-12 | 10 | ACCOUNTINC | shanghai |
| 1009 | KING | F | 10 | PRESIDENT | 5000 | 1995-01-01 | 10 | ACCOUNTINC | shanghai |
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 | 20 | RESEARCH | Beijing |
| 1004 | JONES | M | 20 | MANAGER | 2975 | 1998-05-18 | 20 | RESEARCH | Beijing |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 | 20 | RESEARCH | Beijing |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 | 20 | RESEARCH | Beijing |
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 | 30 | SALES | ShenZhen |
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 | 30 | SALES | ShenZhen |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 | 30 | SALES | ShenZhen |
| 1006 | BLAKE | F | 30 | MANAGER | 2850 | 1997-02-15 | 30 | SALES | ShenZhen |
| 1010 | TURNER | F | 30 | SALESMAN | 1500 | 1997-10-12 | 30 | SALES | ShenZhen |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 | 30 | SALES | ShenZhen |
+------+--------+-------+---------+-----------+----------+------------+---------+------------+------------+
12 rows in set (0.00 sec)
22、查询所有2001~2005年入职的员工的信息,查询部门编号为20和30的员工信息并使用UNION合并两个查询结果
mysql> select * from employee where year(hireDate) between 2001 and 2005 union all select * from employee where dept_id in (20,30);
+------+--------+-------+---------+----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+----------+----------+------------+
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1007 | CLARK | M | 10 | MANAGER | 2450 | 2002-09-12 |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 |
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1004 | JONES | M | 20 | MANAGER | 2975 | 1998-05-18 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1006 | BLAKE | F | 30 | MANAGER | 2850 | 1997-02-15 |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 |
| 1010 | TURNER | F | 30 | SALESMAN | 1500 | 1997-10-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 |
+------+--------+-------+---------+----------+----------+------------+
16 rows in set (0.00 sec)
23、使用LIKE查询员工姓名中包括字母a的记录
mysql> select * from employee where e_name like '%a%';
+------+--------+-------+---------+----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+----------+----------+------------+
| 1002 | ALLEN | F | 30 | SALESMAN | 1600 | 2003-05-12 |
| 1003 | WARO | F | 30 | SALESMAN | 1250 | 2003-05-12 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1006 | BLAKE | F | 30 | MANAGER | 2850 | 1997-02-15 |
| 1007 | CLARK | M | 10 | MANAGER | 2450 | 2002-09-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 |
+------+--------+-------+---------+----------+----------+------------+
7 rows in set (0.00 sec)
24、使用regexp查询员工姓名中包含T,C或者M的3个字母中任意1个记录
mysql> select * from employee where e_name regexp '[TCM]';
+------+--------+-------+---------+----------+----------+------------+
| e_id | e_name | e_sex | dept_id | e_job | e_salary | hireDate |
+------+--------+-------+---------+----------+----------+------------+
| 1001 | SMTTH | M | 20 | CLERK | 800 | 2005-11-12 |
| 1005 | MARTIN | M | 30 | SALESMAN | 1250 | 2001-06-12 |
| 1007 | CLARK | M | 10 | MANAGER | 2450 | 2002-09-12 |
| 1008 | SCOTT | M | 20 | ANALYSE | 3000 | 2003-05-12 |
| 1010 | TURNER | F | 30 | SALESMAN | 1500 | 1997-10-12 |
| 1011 | ADAMS | M | 20 | CLERK | 1100 | 1999-10-05 |
| 1012 | JAMES | F | 30 | CLERK | 950 | 2008-06-15 |
+------+--------+-------+---------+----------+----------+------------+
7 rows in set (0.00 sec)
视图:
1、视图是一个虚拟表,本质是根据sql语句获取的动态数据集,并为其命名
用户在使用的时候,只需要指定名称就可以获取相对应的结果
select * from 表名;
2、视图虽然是虚拟表,但是一样有行有列,视图的数据不会真实保存在我们的数据库里面,行和列来自于定义的视图查询语句中所指的表,数据库只存放视图的定义,并不会存放视图的数据,当表发生变化时,视图的数据也会随之改变
创建一个依赖表:
create table test(
id int primary key,
name char(6) not null
);
insert into test values(1,'哈哈');
insert into test values(2,'嘻嘻');
insert into test values(3,'嘿嘿');
insert into test values(4,'呵呵');create table test_1(
id int primary key,
cj int not null,
constraint test_test foreign key(id) references test(id)
);
insert into test_1 values(1,100);
insert into test_1 values(2,90);
insert into test_1 values(3,80);
insert into test_1 values(4,70);
创建视图:
语法:
create view 视图名 as 查询语句
例:查询班上成绩大于85且姓嘻的同学
mysql> select test.name,test.id,test_1.cj from test,test_1 where name like '嘻%' and cj>85 and test.id=test_1.id;
+--------+----+----+
| name | id | cj |
+--------+----+----+
| 嘻嘻 | 2 | 90 |
+--------+----+----+
1 row in set (0.00 sec)
将查询到的结果做成视图
mysql> create view test_cj as select test.name,test.id,test_1.cj from test,test_1 where name like '嘻%' and cj>85 and test.id=test_1.id;
Query OK, 0 rows affected (0.00 sec)
重新添加数据,再次查询,验证视图是否是动态查询
mysql> insert into test values(7,'赛罗');
Query OK, 1 row affected (0.00 sec)mysql> insert into test_1 values(7,'90');
Query OK, 1 row affected (0.00 sec)mysql> select * from test_cj;
数据表的改变是否会影响视图的调用
修改嘻嘻的成绩到85分以下,再查询视图
update test_1 set cj=84 where id=2;
select * from test_cj;
修改表名,再查询(有影响)
alter table test_1 rename cj;
修改字段名,查询(有影响)
alter table test change name new_name char(6);
依赖的表结构发生改变,会影响视图的调用
视图的优点:
1、简单化:可以将复杂的查询语句,通过简单的调用就可以完成
2、安全性:通过视图用户只能够查询和修改能见到的数据,其他在视图中没有的数据用户看不见的,也无法获取
3、逻辑数据独立性:视图可以帮助用户屏蔽真实表结构变化带来的影响
对视图进行数据的写入
语法
create view 视图名 as 查询语句[with [cascades]|[local] check option]
with check option:如果创建视图的语句中添加了with check option子句
mysql会通过视图检查正在更改的每个行,例如写入,删除,使其符合视图的定义,因为mysql允许基于另一个视图创建视图,他还会检查依赖的视图中的规则来保证数据的一致性,为了确定检查范围,mysql提供了两个选项[cascades]|[local]如果在with check option 子句中没有明确指定使用哪个选项,默认使用cascades
cascades:表示更新视图时需要满足所有视图和表的条件
local:表示更新视图时,只需要满足指定的视图和表的条件
创建一个基本表
create table tb(id int primary key);
基于tb创建视图v1,不添加with check option 子句
此时,向视图v1插入数据时只需要满足tb表的完整性约束条件就可以了
insert into tb values(1),(2),(3),(4),(5),(6),(7),(8),(11);
create view v1 as select * from tb where id > 10;
查看不到小于10的数据,但是可以插入
基于tb表创建视图v2,添加with check option子句
create view v2 as select * from tb where id > 10 with check option;
同时满足依赖表以及视图的规则
基于视图2创建视图3,不添加with check option
create view v3 as select * from v2;
向v3写入数据时,只需要满足依赖表的完整性约束条件就可以
基于视图2,创建视图4,添加with check option
create view v4 as select * from v2 where id < 15 with check option;
向v4写入数据时,需要同时满足依赖表,v2,v4的所有条件
基于视图2创建视图5
create view v5 as select * from v2 where id < 20 with local check option;
向v5插入数据时,只需要满足v5和依赖表的条件即可;
视图在哪些情况下,是不能够插入数据
1.视图中不包含基本表的非空的字段
test --- v1 idnot null
id name age
1zs 17
3
空值和非空会冲突
2.在定义视图的查询语句中,select后的字段使用了juhe函数
3.在定义视图的查询语句中,select后的字段使用了数学表达式
4.在定义视图的查询语句中,使用了group by union 等子句
234.对原始表进行查询,聚合,数学表达式都要先计算,在插入
已经不是对原表进行查询了
视图的算法
创建分数表
create table score(
id int,
name char(6),
sex char(2),
score int
);
insert into score values(1,'one','M',88),
(2,'two','G',99),(3,'three','M',100),(4,'four','G',66),
(5,'five','G',85),(6,'six','G',86);
查询班上男生的最高分,和女生的最高分
select max(score),sex from score group by sex;
select * from (select * from score order by score desc)
as s1 group by sex;
group_concat()
将子查询定义为视图
create view score_v2 as select * from score order by score desc;
通过视图v2查询男女最高分的信息
select * from score_v2 group by sex;
视图查询: select * from score order by score desc
查询: select * from score_v2 group by sex;
真实执行的命令:
select * from (select * from score order by score desc)
as s1 group by sex;
语法
create algorithm=算法 view 视图名 as 查询语句
merge:使用merge算法,mysql会将指定查询语句和视图的查询语句进行合并
组成单个查询语句之后再进行查询,如果查询语句中包含
group by,limit,union,union all,子查询时不能使用merge算法
temptable:如果使用temptable算法,mysql会将视图的查询语句进行执行得到的结果作为
指定的查询语句的条件,使用该算法,视图不能进行更新数据
merge,temptable优先使用merge
创建算法为temptable视图
create algorithm=temptable view score_v3 as select * from
score order by score desc;
select * from score_v3 group by sex;
视图的特点
创建视图的时候添加with check option的作用是什么
视图算法中merge 和 temptable的特点和区别是什么
对已经创建的视图进行修改
语法 replace (代替)
create or replace view 视图名 as 查询语句
create table test(id int,name char(5));
create view v1 as select * from test;
create or replace view v1 as select * from score;
更新视图中的数据
语法
update 视图名 set 字段=新值 [where 条件语句];
update score_v2 set score=66 where name='two';
删除视图
语法
drop view 视图名 #如果指定的视图不存在,会报错
drop view if exists 视图名#如果指定的视图不存在,会警告
mysql的索引:
使用索引可以提高数据库对特定数据的查询速度,是单独存储在磁盘上的
数据结构,包含对数据库中某一列数据的引用,有效的建立索引可以提高数据库的查询速度,索引可以通过存储引擎实现,每种存储引擎带有特定的索引功能,每一种索引,每个表最少支持创建16个索引,总索引长度至少支持256字节
mysql数据库常用的索引数据结构是btree,多路搜索树
索引的优点:
1,加快查询速度,提高查询效率
2,有多种索引类型的选择,可以创建唯一索引,来保证数据表中的唯一性
3,实现数据的完整性,加速表与表之间的连接
4,减少排序和分组的时间
索引的缺点
1,创建索引需要消耗磁盘空间,索引越多占用的空间越大
2,创建索引以及维护索引需要耗费大量时间,随着数据量的增加,耗费的时间更多
3,对表当中的数据增删改查时,索引动态维护降低对数据的操作效率
索引的分类
唯一索引: 允许在定义的索引的列上插入空值,但是值不能重复,可以手动给指定的字段
创建唯一索引,如果一个字段带有唯一性约束,那么最高字段会被默认创建唯一索引
主键索引: 唯一索引的特殊情况,如果一个字段带有主键约束,那么这个字段会默认
创建主键索引,在定义主键索引的字段上不允许写入空值,值也不能重复
单列索引: 对某一个字段创建索引,也称之为普通索引
组合索引: 多个字段组合在一起创建一个索引
全文索引: 在定义的索引列上支持值得全文查找,允许在索引定义的列上插入重复值和
空值,只能对char,varchar,text这三种类型的列上创建全文索引,而且数据表的存储引擎为
myisam类型,全文索引一般用于文本类型的数据查找,如小说,文档等
空间索引: 对用来表示地理位置的字段可以创建空间索引
索引:日常生活中最常见的索引
索不知道他的意思suo,查字典,偏旁,部首,拼音
唯一性索引
语法:
create table 表名(
字段 数据类型 [完整性约束条件]
);
unique index 索引名(字段)
create table test_1(
id int,
name char(3),
unique index ui(id)
);
主键索引
语法:
create table 表名(
字段 数据类型 [完整性约束条件]
。。。。。。。
primary key 索引名(字段)
);
create table test_pri(
id int,
name char(3),
primary key pi(id)
);
创建单列索引
语法:
create table 表名(
字段 数据类型 [完整性约束条件]
…
index 索引名(字段)
);
create table dex(
id int,
name char(4),
index op(id)
);
创建组合索引
create table 表名(
字段1 数据类型 [完整性约束条件]
字段2 数据类型 [完整性约束条件]
字段3 数据类型 [完整性约束条件]
字段4 数据类型 [完整性约束条件]
key multiidx(字段1,字段2......)
);
create table multiidx_test(
id int,
name char(5),
age int,
key multiidx(name,age)
);
创建全文索引
语法:
create table 表名(
字段 数据类型 [完整性约束]
。。。。。。
fulltext index 索引名(字段)
);
例:
create table fulltext_index(
id int,
text mediumtext,
fulltext index fl(text)
)engine=myisam;
创建空间索引
create table 表名(
字段 数据类型 [完整性约束条件]
。。。。。。。
spatial index 索引名(字段)
);
例
create table spatial_index(
name char(4),
home geometry not null, geometry经纬度
spatial index go(home)
)engine=myisam;
对已经创建好的表,添加索引
语法
alter table 表名 add 索引类型索引名
例:
create table add_index(
id int,
name char(5)
);
alter table add_index add index q(name);
删除指定的索引
alter table 表名 drop index 索引名
alter table add_index drop index q;
查询指定数据表的索引信息
show index from dex\GTable: dex 表名Non_unique: 1 表示该索引是否是唯一索引 1表示不是 , 0表示是Key_name: op 索引名称Seq_in_index: 1 索引序列号Column_name: id 创建索引的字段名Collation: A 字段以什么形式存储在索引中,A表示升序,null没有分类Cardinality: 0 索引中唯一值的数目估值Sub_part: NULL 索引的长度Packed: NULL 是否对关键字进行了压缩。如果为null代表没有Null: YES 表示索引字段是否能为null值Index_type: BTREE 索引类型Comment: 注释
Index_comment: 注释
触发器:
触发器是与表相关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句
创建触发器:
语法
create trigger trigger_name trigger_time trigger_event on tb_name for each row trigger_stmt
释义:
trigger_name:触发器的名字
trigger_time:触发器定义语句执行的时间,分为before(在…之前)和after(在…之后)
trigger_event:触发事件,insert,updata,delete
tb_name:对哪个表创建触发器
for each row:表示数据表中任何一条记录上的操作满足触发条件都会触发该触发器
trigger_stmt:触发器的程序体,可以是一条sql语句,也可以是多条,程序体中还可以声明变量和调用变量,如果是多条语句,每条语句使用,作为分隔符/结束符,此时需要通过delimiter 修改数据库的结束符
创建用户信息表
mysql> create table user(-> id int primary key,-> name char(5) not null,-> add_time int default null,-> comment char(30)-> );
Query OK, 0 rows affected (0.31 sec)
创建日志表:
mysql> create table log(-> id int primary key auto_increment,-> date int default null,-> log_info varchar(255) default null-> );
Query OK, 0 rows affected (0.01 sec)
创建触发器:
mysql> delimiter #
mysql> create trigger user_log after insert on user for each row -> begin-> set @s1='用户创建成功';-> set @s2=concat(new.name,@s1);-> insert into log(date,log_info) values (new.add_time,@s2);-> end #
Query OK, 0 rows affected (0.00 sec)
用户信息表插入数据验证触发器
mysql> delimiter #
mysql> insert into user values(1,'张三',20201221,'采花大盗-张三');-> #
Query OK, 1 row affected (0.01 sec)mysql> select * from user;
-> #
+----+--------+----------+---------------------+
| id | name | add_time | comment |
+----+--------+----------+---------------------+
| 1 | 张三 | 20201221 | 采花大盗-张三 |
+----+--------+----------+---------------------+
1 row in set (0.01 sec)mysql> select * from log;-> #
+----+----------+--------------------------+
| id | date | log_info |
+----+----------+--------------------------+
| 1 | 20201221 | 张三用户创建成功 |
+----+----------+--------------------------+
1 row in set (0.00 sec)
new:创建触发器的表中新添加的一行数据
old:创建触发器的表中新删除的一行数据
new. 字段名:表示新增加行的指定字段的值
old.字段名:表示新删除行的指定字段的值
查看已经创建的触发器信息
select * from information_schema.triggers\G
删除触发器
drop trigger 触发器名
mysql用户管理
查看数据库已经创建的用户的信息
select * from mysql.user\G
mysql> select * from mysql.user\G
*************************** 1. row ***************************Host: localhost #表示哪些主机可以通过数据库用户名密码连接到数据库,如果是localhost表示是本地连接,如果是网段或IP表示远程连接User: root #用户名,root为管理员用户Password: *AC241830FFDDC8943AB31CBD47D758E79F7953EA #用户名的密码,加密后存储#权限列,用户对数据库的操作权限,y有权限,n没有权限Select_priv: Y #查询Insert_priv: Y #写入Update_priv: Y #更新Delete_priv: Y #删除数据Create_priv: Y #创建Drop_priv: Y #删除表,库,视图,触发器Reload_priv: Y #用户可以执行刷新和重新加载mysql所有各种内部缓存的特定命令,比如日志,权限,查询和表,重新加载权限表Shutdown_priv: Y #关闭mysql服务Process_priv: Y #用户可以通过show Processlist命令查看其它用户的进程File_priv: Y #可以将外部文件导入mysqlGrant_priv: Y #给其他用户授权的权限References_priv: Y #占位 ,没有具体的功能Index_priv: Y #是否可以创建,删除,查询所有等Alter_priv: Y #修改表结构Show_db_priv: Y #通过show查看数据库,数据库。视图Super_priv: Y #超级权限,用户可以删除其他用户的进程,修改全局变量,执行关于复制和日志相关的命令Create_tmp_table_priv: Y #创建临时表Lock_tables_priv: Y #对表加锁Execute_priv: Y #执行函数Repl_slave_priv: Y #从服务器从主节点复制数据的权限Repl_client_priv: Y #用户可以查看从节点和主节点的信息Create_view_priv: Y #创建视图Show_view_priv: Y #查看视图Create_routine_priv: Y #创建函数Alter_routine_priv: Y #修改函数Create_user_priv: Y #创建用户Event_priv: Y #创建事件Trigger_priv: Y #创建,修改,查看触发器
Create_tablespace_priv: Y #创建表空间
#安全列ssl_type: #是否支持ssl标准对密码加密ssl_cipher: #是否支持ssl标准对密码加密x509_issuer: #是否支持x509标准的字段x509_subject: #是否支持x509标准的字段max_questions: 0 #用户每小时允许执行查询的操作次数,0表示不限制max_updates: 0 #用户每小时允许执行更新操作次数,0表示不限制max_connections: 0 #用户每小时允许执行连接操作次数,0表示不限max_user_connections: 0 #用户允许同时建立连接的次数,0表示不限制plugin: mysql_native_password #识别用户身份的插件authentication_string: #记录用户密码password_expired: N
创建数据库用户
create user 用户名@主机 [identified by '密码'];
例:
create user 'rzh'@'192.168.10.%' identified by '123.com';
flush privileges;
mysql> EXIT
Bye
[root@localhost ~]# mysql -urzh -p123.com -h 192.168.10.3
.......
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
授权用户: 使用root用户进行授权
语法
grant 权限 on 库.表 (字段) to 用户名@主机 [identified by ‘密码’]
[with grant option]
例:
mysql> grant all on *.* to 'rzh'@'192.168.10.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)mysql> exit
Bye
[root@localhost ~]# mysql -urzh -p123.com -h 192.168.10.3
mysql> create database haha;
Query OK, 1 row affected (0.00 sec)
给指定的用户授权:如果指定的用户不存在,则先创建该用户,在进行授权
如果指定的用户存在,那么就只是修改这个用户的权限
撤销用户的权限
第一种:撤销全部权限
语法
revoke 权限1,权限2,… on 库.表 from ‘用户名’@‘主机名’
revoke all on *.* from 'rzh'@'192.168.10.%';
第二种:
revoke insert on sjk.* from 'rzh'@'192.168.10.%';
修改用户密码
第一种
语法:
mysqladmin -u 用户名 -h 主机名 -p password
例:
mysqladmin -u rzh -h192.168.10.3 -p password 123456
第二种
通过update 更新user表修改
例:
update mysql.user set password=password('123456') where user='rzh' and host='192.168.10.%';
flush privileges;
第三种:
修改本机的密码
set password=password('123456');
通过set修改指定用户的密码
set password for 'rzh'@'192.168.10.%'=password '123456';
第四种
grant all on *.* to 'rzh'@'192.168.10.%' identified by '123456';
删除用户:
drop user ‘用户名’@‘主机名’
drop user 'rzh'@'192.168.10.%';
mysql事务:
事务的特点: ACID
A原子性: 一个事务中,所有的操作要么都成功,要么都失败,不会在中间某个环节结束,事务在执行的过程中发生错误会被回滚到事务开启前的状态
C一致性: 在事务开始之前和事务开始之后,数据库的完整性没有被破坏,也就是写入的数据必须符合所有的预设规则
I隔离性: 数据库运行多个事务并同时对其数据进行读写和修改能力;隔离性可以防止多个事务并发执行由于交叉执行而导致数据不一致
事务的隔离等级分为:
未提交读 已提交读 可重复读 可串行读
D持久性: 事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失
事务的常用操作:
begin 开始一个事务
rollback 事务回滚
commit 事务确认
开启事务 begin 或 start transaction
提交事务:将事务所执行的sql语句执行结果写入数据库并结束该事务
commit
事务回滚:撤销事务中所执行的sql语句并结束事务 rollback
保存点:指定一个保存点,在执行回滚操作的时候,可以选择回滚点指定回滚
而不是回到最开始的地方
savepoint 保存点名
rollback to 保存点名
创建一个表账单信息表:
create table bank(
id int,
name char(6),
money int
);
insert into bank values(1,'迪迦','100'),(2,'戴拿','80');
事务的隔离级别
1、未提交读: read-uncommitted,如果一个事务已经开启写数据,则另一个事务不能同时进行写的操作,但其他事务能够读取该行数据,可能出现脏读,也就是事务B读取到了事务A未提交的数据
查看当前事务隔离等级
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ | #可重复读
+-----------------+
1 row in set (0.00 sec)
临时修改隔离等级
mysql> set session tx_isolation='read-uncommitted';
Query OK, 0 rows affected (0.00 sec)例:
A:写
begin;
update bank set money=money+100 where name='迪迦';
update bank set money=money+50 where name='戴拿'; B:
begin;
select * from bank;
set session tx_isolation='read-uncommitted';
select @@tx_isolation;
2.已提交读: read-committed 如果是一个读事务,则允许其他事务读写;如果是一个写事务,在未提交以前,其他事务看不到数据的修改,该隔离级别避免了脏读,但是可能出现不可重复读,也就是事务A先读取数据,此时事务B更新了数据并提交
此时事务A再次读取该数据时,数据已经发生改变,也就是同一行的数据多次读取不一致叫做不可重复读
set session tx_isolation='read-committed';
select @@tx_isolation;
A:读
begin;
select * from bank;
B:写
begin;
update bank set money=money-10 where name='迪迦';
#B修改迪迦这一行数据时,如果没有提交,则A是看不见修改的结果,只有dangB提交以后
A才能够看见最终结果,避免了脏读,
在B已经修改完毕,但没有提交事务,此时A不能对同一行进行数据修改
3、可重复读 : repeatable read 开启一个读事务,此时对数据的多次读取结果都是一样的;如果事务提交前,数据发生了改变,是看不到变化的,也就是只要读到事务开启,那么对于数据的查询来说,多次执行结果都是一致的,解决了不可重复读的问题,但是可能导致幻读,也就是事务中的查询结果与数据表真实的结果不一致
set session tx_isolation='repeatable-read';
select @@tx_isolation;
A:读
begin;
select * from bank;
B:写
begin;
update bank set money=money+50 where name='戴拿';
A:可重复读
select * from bank;即使B对数据进行了修改,A事务的查询结果任然保持不变
对此查看的结果,与之前一样,这就是可重复读,但是由于看到结果与真实的数据不同,索引产生了幻读
4、可串行读 serializable 提供严格的事务隔离,他要求事务序列化执行,事务只能一个接一个的执行,不能并发执行,这种隔离级别是最高的,同样这种隔离级别会导致效率低下能解决脏读,不可重复读,幻读,所以很少使用
set session tx_isolation='serializable';
select @@tx_isolation;
A:
begin;
update bank set money=money+50 where name='迪迦';
B
begin;
update bank set money=money-50 where name='迪迦';
mysql日志:
错误日志:
特点:
错误日志是默认启用的,一般存放在数据目录下,默认文件名hostname.err
错误日志中除了记录数据库运行时出现的错误等相关信息外,默认还记录数据库的初始化信息数据库启动,关闭,重启过程中的输出信息
通过配置文件开启或关闭错误日志
log-error=[/路径/文件名]
跟错误日志相关的变量
show variables like 'log_error';
show variables like 'log_warnings';该变量的值用来控制警告信息是否可以记录到错误日志中
log_warning=0 错误日志中不记录警告等信息
log_warning=1 错误日志中记录警告类型信息
log_warning=2 如果值大于1.错误日志中也会记录数据库连接失败的信息
日志刷新
flush logs;
mysqladmin -uroot -p123.com flush-logs
查询日志
特点: 查询日志记录了所有的MySQL的操作信息,无论是否成功,默认情况下该日志时关闭的,需要手动开启,日志文件名默认为hostname.log
通过配置文件开启查询日志
vim /etc/my.cnf
添加
log=[/路径/日志名]
查询日志相关变量
show variables like ‘%general_log%’;查询日志的状态和日志文件存放位置
show variables like ‘%log_output%’;查看日志信息记录的时文件还是数据表
修改查询日志状态
set global general_log=ON|OFF;
修改日志信息存储方式
set global log_output=table|file;
查询日志数据表
select * from mysql.general_log;
刷新查询日志
flush logs;
mysqladmin -uroot -p123.com flush-logs
慢查询日志
特点: 用来记录mysql运行中响应时间查过指定值的sql语句,还可以记录没有使用索引的查询
语句(可选),当我们需要对查询日志语句进行测试优化时,可以开启慢查询日志
通过配置文件开启慢查询日志
vim /etc/my.cnf
log-slow-querise=[/路径/日志名]
long_query_time=2
slow_query_log=on|off
slow-query-log-file=[/路径/日志名]
long_query_time=2
查询慢查询相关的变量
show variables like ‘%slow_query_log%’;
set global slow_query_log=‘ON’|‘OFF’; 开启或关闭慢查询日志
show variables like ‘long_query_time’;
set global long_query_time=3;#修改慢查询的临界值,重新登入MySQL生效
刷新查询日志
flush logs;
mysqladmin -uroot -p123.com flush-logs
4.二进制日志
特点: 是一个二进制文件,记录会对数据库中数据进行修改的sql语句增删改,不会
记录查询语句还可以用于主从复制
通过配置文件开启二进制日志
vim /etc/my.cnf
添加
log-bin=[/路径/日志名]
expire_logs_days=0#是否对二进制文件内容进行自动清除,0表示不清除,如果
为2表示每隔2天自动清除,值可以自定义
max_binlog_size=1G #指定单个二进制日志文件的存储大小。如果文件大小超过该值
会生成一个新的二进制文件继续存储
查看二进制日志的相关变量
show variables like ‘%binlog%’;
查看二进制文件内容
mysqlbinlog 二进制日志文件名
##binlog_cache_size:二进制日志缓存大小,当客户端连接数据库执行事务或对
memory存储引擎的表进行增删改操作时,对于的二进制日志信息不会直接写入磁盘中
而是先写入给客户端分配的内存缓存中
##binlog_format 二进制日志格式 statement row mixed
statement:数据库执行的sql语句是什么日志就记录什么,不会考虑这条sql语句的执行
是否会对多行产生影响,占用日志空间少
row:记录数据库执行的sql语句对所有产生数据变化的行,对于主从复制来说,如果一台
sql语句对多行数据进行了修改,可以考虑使用row,该格式相较于statement占用的
二进制空间大
mixed:混合模式,数据库根据情况对statement和row两个格式自动选择
刷新查询日志
flush logs;
mysqladmin -uroot -p123.com flush-logs
重启mysql
查看二进制日志及文件大小
show binary logs;
查看当前正在使用的二进制日志
show master status;
删除二进制日志
1.直接删除,rm -rf 日志文件 在这个目录/usr/local/mysql/data
2.reset master;删除除当前正在使用的二进制以外的日志文件,把当前正在使用的二进制日志
变成mysql-bin.000001
3.purge master logs to 日志文件 :删除指定索引前的所有日志文件
不包括当前正在使用的
mysql备份
全量备份: 全量备份也可以叫做完全备份,对数据库中所有的数据进行备份(可以是全部数据库中的数据,也可以是指定数据库中的数据)
差异备份: 差异备份也叫做差量备份,每次备份时对上一次全备份以后变化的数据进行备份
增量备份: 增量备份是对上一次备份时的数据进行比较,备份变化的数据
时间点恢复: 备份惹怒执行前如果数据丢失,可以通过二进制日志恢复指定时间段的数据
热备: 也可以称之为热备份,在数据库运行时(可读可写)进行数据备份
myisam(引擎)不支持热备,innodb(默认引擎)支持
温备: 在数据库进行数据备份,但只能执行读操作,不能进行写操作
冷备: 对数据库冷备期间,不能对数据库进行任何操作,也就意味着备份期间,数据库停止工作
物理备份: 直接对数据库的数据文件进行备份
逻辑备份: 将数据库数据表以及对数据操作的sql语句进行备份
通过二进制日志进行数据恢复
语法:
mysqlbinlog [option] 日志名 | mysql -u root -p123.com
[option]:
–start-date: 开始时间
–stop-date:结束时间
–start-position:开始位置
–stop-position:结束位置
例:恢复从2020-12-29 9:18-2020-12-29 9:25之间的数据
mysqlbinlog --start-date=‘2020-12-29 9:18’ --stop-date=‘2020-12-29 9:25’
mysql-bin.000001 | mysql -u root -p123.com
对数据库进行修改
创建一个库,在库里面创建一个表,对表插入数据,刷新表,删除表
刷新
201229 10:03:25
201229 10:03:08
mysqlbinlog --start-date='2020-12-29 10:03:08 ’
–stop-date=‘2020-12-29 10:03:25’
mysql-bin.000002 | mysql -u root -p123.com
–start-position
–stop-position
mysqlbinlog --start-position=42 --stop-position=274 \
mysql-bin.000002 | mysql -u root -p123.com
2.mysqldump是以逻辑备份的方式备份数据的,会将数据库中的数据转化成sql语句然后进行备份
例:
1.备份sjk中的数据,不包含数据库sjk本身,只备份其中的数据表以及表内的数据
mysqldump -uroot -p123.com sjk > /sjk_tables.sql
还原
mysql -u root -p123.com sjk(指定某个数据库)< /sjk_tables.sql
2.备份sjk中表1和表2的表结构和数据
mysqldump -uroot -p123.com sjk 表1 表2 > /sjk_tables.sql
还原
mysql -u root -p123.com sjk(指定某个数据库)< /sjk_tables.sql
3.备份sjk,包含数据库本身以及数据库中表结构和表数据
mysqldump -uroot -p123.com --databases sjk > /sjk_all.sql
还原
mysql -u root -p123.com < /sjk_all.sql
4.同时备份多个数据库,比如sjk_01,sjk_02,sjk_03
mysqldump -uroot -p123.com --databases sjk_01 sjk_02 sjk_03 > /sjk123_all.sql
还原
mysql -u root -p123.com < /sjk123_all.sql
5.备份所有的数据库以及数据库中的表结构和表数据
mysqldump -u root -p123.com --all-databases > /all.sql
还原
mysql -u root -p123.com < /all.sql
6.只备份表结构,不备份库和数据
mysqldump -u root -p123.com -d sjk > /sjk_tab.sql
还原
mysql -u root -p123.com 库名< /sjk_tab.sql
实现增量备份的脚本
#!/bin/bash
backupDir=/backup/zengliang
mysqlDir=/usr/local/mysql/data
logFile=/backup/back.log
binFile=/usr/local/mysql/data/mysql-bin.indexmysqladmin -uroot -p123.com flush-logscount=`wc -l $binFile | awk '{print $1}'`
num=0for file in `cat $binFile`
do
base=`basename $file`
num=`expr $num + 1`
if [ $num -eq $count ]thenecho $base skip! >> $logFile
elsedest=$backupDir/$baseif [ -e $dest ]thenecho $base exist! >> $logFileelsecp $mysqlDir/$base $backupDirecho $base dump! >> $logFilefi
fi
done
实现全量备份的脚本
#!/bin/bash
backupDir=/backup/quanliang
date=`date +%Y%m%d`
cd $backupDir
dumpFile=$date.sql
GZdumpFile=$date.sql.tgzmysqldump -uroot -p123.com --all-databases --flush-logs --single-transaction > $dumpFile/bin/tar -zcf $GZdumpFile $dumpFile
rm -rf $backupDir/$dumpFile
编写计划任务实现定时备份
crontab -e
0 2 * * 1-6 /bin/bash -x /zengliang.sh
0 2 * * 0 /bin/bash -x /quanliang.sh
MySQL(数据库)相关推荐
- .net连接mysql数据_.net连接MYSQL数据库的方法及示例!
连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...
- MySQL数据库+命令大全+常用操作
格式:mysql -h主机地址 -u用户名 -p用户密码 1. 例:连接到本机上的MYSQL 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示 ...
- mysql数据库是一个软件呐_15款好用的mysql管理软件
1. Induction Induction是一款用于理解数据关系的开源管理工具,它可用来探索行/列,运行查询和数据可视化等方面.该工具支持多种数据库,包括PostgreSQL,MySQL,SQLit ...
- c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...
- C语言对mysql数据库的操作
C语言对mysql数据库的操作 原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎 ...
- JDBC连接MySQL数据库及演示样例
JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...
- python用django连接mysql_三分钟了解Django如何连接Mysql数据库
处理用户注册请求.Django连接MysqL数据库相关配置.数据库迁移命令: my_Dproject/app01/views.py 在views函数文件中添加register函数,来处理用户注册 ...
- mysql数据库比对视频教程_MySQL数据库全学习实战视频教程(27讲 )
一)mySQL数据库简介:MySQL属于关系型数据库,是当前最流行的关系型数据库管理系统之一,在WEB项目使用方面,MySQL是最好的 RDBMS应用软件. 二)本mySQL数据库视频教程目录如下: ...
- eclipse关闭mysql数据库,有关于用eclipse连接mysql数据库出现的问题以及解决办法
写帖子是为了让更多的程序员减少再调试bug中的时间,也希望大家能一起把自己遇到的错误及解决方法写出来.我是一个刚开始学java的大二学生,用的是<java开发实战经典>.在写p646的程序 ...
- bd2和mysql语法区别,经验:在MySQL数据库中,这4种方式可以避免重复的插入数据!...
最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下 ...
最新文章
- 周杰伦新动作的老朋友是谁?程序员:送分题!
- Python学习笔记:错误,测试,调试(承)
- java 图片刷新页面_js修改img的src属性刷新图片时的图片缓存问题
- 重复T次的LIS的dp Codeforces Round #323 (Div. 2) D
- C 语言 运算符怎么使用,详解C++编程中运算符的使用
- python *args **kargs
- Android学习笔记(九)——更复杂的进度对话框
- 普通话测试第四题评分标准_2017年普通话考试-评分细则
- 怎样从altera下载软件与器件库
- 相亲交友小程序,案例:情深深之恋
- 矢量绘图软件 android,sai绘图软件官方
- 使用kettle向HBase导入数据
- Anaconda创建虚拟环境时报错 InvalidArchiveError Error with archive D:\\(anaconda的路径)\\pkgs\\vs2015_runtime
- 锂离子电池热失控预警资料整理(三)
- golang GF框架
- SpringCloud + Redis + RabbitMQ + ES + Docker + React 模仿B站视频网站
- windows sql server 如何卸载干净?
- 2023美国大学生数学建模竞赛ABCDEF题思路汇总 美赛建模思路
- 适合Java老手阅读的书籍推荐:
- python论坛签到_吾爱论坛签到脚本-python
热门文章
- win7引入node16版本
- tty线路规程(discipline)设置
- P1535 游荡的奶牛
- 出来行,迟早是要还的(篇六):衣带渐宽终不悔
- openinstall与太平洋汽车达成合作
- 蓝牙地址解析(NAP/UAP/LAP)
- 《Human-Level Artificial Intelligence? Be Serious!》论文阅读报告
- https自签证书tls握手时错误或go系统错误处理
- CodeForces - 743B
- [Swift]LeetCode611. 有效三角形的个数 | Valid Triangle Number