数据库(基本SQL语句、存储引擎和数据类型、约束条件、关键字查询)
数据的演变史
以ATM为例:
1. 把数据存在了文件中,有不同的命名,不同的数据格式
文件名:user.txt,也有命名为userinfo.txt
数据格式:kevin|123、kevin@123、kevin-123
2. 软件开发目录规范
db文件夹:专门用来存储数据文件,但是,当数据文件较多时,会占用过多的资源,也会产生很多的文件。
3. 数据库阶段
解决了以上的所有问题,采用统一的存储格式
数据的发展史
1. 单机游戏阶段:
数据会单独存放在每一台计算机上,不是实现数据的共享。
2. 联网游戏阶段:
实现了数据的共享,把数据单独存放在服务器上面(在一台计算机上)
数据的分类
1. 关系型数据
MySQL、Oracle、SQLserver、postgresql、DB2、sqlite、acess、MAriaDB
MySQL数据库:开源的
MariaDB,和MySQL数据库时同一作者
Oracle:收费的
2. 非关系型数据库
Redis(缓存数据库)、memcache(缓存数据库)、mongoDB(爬虫等)
Redis(缓存数据库)是目前市面上使用的最多的:
Redis数据库把memcache淘汰了,没有用memcache(老项目之前用的,现在没有更换,还再用)
Redis能做memcahe不能做的事情。
Redis支持的数据类型要比memcache多的多
3. 两者的特点
1. 关系型数据库可以建立关系,拥有固定的表结构、表与表之间可以建立表关系
2. 非关系型数据不能够建立表关系,是以k:v键值对的形式存在的,没有表的概念,支持五种数据类型。
数据库的本质
数据库的本质:其实是一款C/S架构的软件,市面上存在很多的数据库。
SQL与NoSql的由来
对于关系型数据库,服务端为了兼容各个客户端,统一规定了,每个客户端都要使用MySQL语言,而这个MySQL语言就是我们说的SQL语句(关系型数据库)
非关系型数据库:Nosql语句
MySQL的介绍
版本的介绍:
MySQL5.0 (版本不稳定)
MySQL5.5 (用的很少,老项目还再用)
MySQL5.6 (老项目用的比较多,版本很稳定)
MySQL5.7 (新项目在选择数据库的时候,使用的就是这个版本了)
MySQL8.0 (最新版本,现在生产环境用的还不是很多)
数据库的各个版本区别不是很大,核心就是SQL语句,不管哪个版本,SQL语句几乎都是一样。
""" 在IT领域,生产环境尽量不要使用最新版本,因为,新版本没有经过大量的测试,不是很稳定。"""
生产环境:你的项目上线之后的环境
测试环境:你在本地自己玩,无所谓了
下载之后是一个压缩包,解压完成即可
3. MySQL的主要文件介绍
bin: 存放mysql的一些启动文件,客户端:mysql.exe,服务端:mysqld.exe
mysql.exe : MySQL自带的客户端
mysqld.exe:MySQL自带的服务端
data:mysql数据的存储文件夹,存数据。
my-default.ini:MySQL的配置文件,复制一份my-default.ini文件。并重命名为my.ini,以后只需要在my.ini文件中做修改。
README:MySQL的说明文件
4. MySQL如何启动
由于MySQL是有客户端和服务端的,因此,我们要启动服务端和客户端来使用
1. 记住一定是先启动服务端:mysqld.exe,窗口不要关,进程也不要关
2. 然后启动一个新的cmd窗口,让客户端去连接服务端
如何启动:
1. 先切换路径到bin目录下
打开cmd -----> 输入mysqld启动服务端 ----->在打开一个cmd窗口 -----> 输入mysql连接服务端
2. 客户端连接上服务端之后,如何退出客户端: exit
3. 服务端启动之后,如何终止(停掉)服务端:ctrl + c
"""
localhost :代表的就是本机
127.0.0.1:代表的也是本机
在某些情况下,这两者是有区别的
"""
5. 加入环境变量
D:\mysql-5.6.45-winx64\bin加入到环境变量中,达到在任何位置都可以找到服务端和客户端程序
6. 系统服务制作(使用管理员权限)
1. 先打开cmd窗口
mysqld --install 提示:Service successfully installed
第一次安装成功,需要手动启动一次
2. 如何启动服务
1. 鼠标点击启动按钮(此电脑---->管理--->服务)
2. net start mysql
3. 任务管理器
3. 如何关闭服务
1. 鼠标点击启动按钮
2. net stop mysql
3.通过杀死进程来关闭服务
taskill /pid 端口 -f
4. 如何卸载MySQL服务
mysqld --remove
"""以上操作都需要管理员权限"""
7. 卸载MySQL
1. 先卸载服务
2. 在关闭服务端
3. 直接删除MySQL的文件夹
登录MySQL
1. 游客模式登录:mysql (功能很少,权限很低 )
2. 管理员登录:mysql -u root -p (直接回车就登录成功了)
3. 如果你连接的是别人电脑上的数据库,需要指定 ip 和 port :mysql -h 127.0.0.1 -P 3306 -u root -p 123
4. 给管理员设置密码 :mysqladmin -u root -p 旧密码 password 新密码
5. 如果密码忘记了怎么办?
"""使用跳过授权表的形式"""
1. 停止服务并终止服务端
2. 使用'跳过授权表'的形式启动服务端
mysqld # 不'跳过授权表'
mysqld --skip-grant-table # '跳过授权表'
"""跳过授权表的意思是:客户端在连接服务端的时候,不需要验证密码了,直接登录成功"""
3. 再次使用客户端(管理员账号)来登录进去,就不需要密码了
进入mysSQL之后,需要修改密码
update mysql.user set password=password(123) where Host='localhost' and User='root';
flush privileges; # 刷新权限
退出客户端
退出服务端
4. 改完之后,一定要终止服务端,重新不跳过授权表,以普通模式启动服务端,再次使用管理员登录即可
MySQL的配置文件
mysql的默认配置文件:my-default.ini,ini:配置文件,将这个文件复制一份,命名为my.ini(Windows)
macOS系统:配置是my.cnf(安装的时候已经有了,就在人家的基础上改,如果没有自己创建)
程序先启动会加载配置文件中的配置之后才真正的启动
配置文件的作用:
修改字符编码:在my.ini中输入一下内容
[mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-charcater-set-utf8
只要配置文件发生了改变,一定要重启服务端,配置文件c才生效
\s:输出一些MySQL的基本信息
重要的概念
库:其实就是文件夹
表:文件夹中的文件
记录:文件夹的文件中的一行行数据
先有库,再有表,最后有记录
先创建数据库,在库里创建数据表,最后在表中插入记录。
数据库相关命名
1. 查看所有的数据库(管理员登录:mysql -u root -p),游客身份只能看见两个。
show databases;
information_schema :默认创建在内存中的数据库
mysql :MySQL默认创建的数据库,不要动
performance_schema
test :空数据
show create database 库名:查看数据库的基本信息
2. 如何选择数据库
use 库名;
use mysql;
3. 如何增加数据库
create database db1;
4. 如何删除数据库
drop database db1 charset='gbk';
一般情况下,只要创建了数据库,就不会去修改,如果要修改,就直接删掉,重新创建。
针对库的SQL语句
查看所以的数据库:show databases;
查看新建的库:show create database 库名;
创建数据库:create datbase 库名;
修改数据库:alter database 库名 charset='gbk';
删除数据库:drop database 库名;
切换数据库:use 库名;
针对表的SQL语句(重要)
有表的前提是先有库
表:相当于文件,表中的一条记录就相当于文件中的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段。
先有库:
查看当前所在库:select database();
选择库:use db1;
cmd结果:

0: 查看表
show tables;# 查看表 show create table t1; # 查看表结构 desc t1; # 格式化之后的表结构
cmd结果:


1:创建表
create table t1(id int,name varchar(20),age int);
2:修改表
alter table t1 rename tt1;
3:删除表
drop table t1;
针对记录的SQL语句
关键字:select、insert、update、delete
1. 查看表中的数据
select * from t1; # 查看表中的所有字段 select id from t1; # 查看表中单个字段:id select id,name from t1; select id,name,age from t1;


2. 增加数据
insert into t1(id,name,age) values(1,'hua',20);
insert into t1 values(1,'hua',20); insert into t1 values(2,'rui',18),(3,'lin',19),(4,'cai',17); # 单条增加数据,并且是全字段增加
3. 修改数据
update 表名 set 字段名=‘字段值’ where 条件;
update t1 set name='hua1' ,age = 18 where id =1; update t1 set name='lin',age =18 where id =3 and age=19;

在写更新语句的时候,一定别忘了检测更新条件。
4. 删除数据
delete from t1 where id =1; delete from t1 where id =1 and name='kevin';

存储引擎(存储数据的方式)
存储引擎:就是存储数据的方式
MySQL中存储数据的方式:
show engines; 查看所有的存储引擎
MySQL中共支持9种存储引擎,需要掌握两种:
MyISAM:MySQL5.5及之前的版本默认的存储引擎,存取速度很快,但数据相对InnoDB不够安全
InnoDB:MySQL5.5之后的版本默认的存储引擎,存取速度相对于MyISAM更慢了但数据更加安全了。
MEMORY:数据是在内存中存着的,内存基于电工作的,所以断电数据丢失,重启服务端也会丢失数据。
验证以上三者存储引擎所产生的文件:
create table t2(id int) engine=MyISAM; create table t3(id int) engine=InnoDB; create table t4(id int) engine=MEMORY;
MyISAM: 产生三个文件
.frm:这个文件存表结构
.MYD:这个文件存数据 data
.MYI:这个文件存数据的索引 index >>> 类似于是书的目录,加快查询速度。
InnoDB:产生两个文件
.frm:这个文件存表结构
.ibd:这个文件存数据的索引和数据 index
MEMORY:产生一个文件
.frm:这个文件存表结构
数据类型(重要)
1.整型
tinyint、smallint、mediumint、int、 bigint
不同的类型存储的范围不一样。
存储范围比较:
tinyint:1个字节 ------> 8位 ------> 2 **8 ----> 256 -----> 0-255 ----->-128-127
smallint: 2个字节存储 -----> 16位 ----> 2 ** 16 ----> 65536-----> 0-65535---->-32768-32767
int: 4个字节 ------> 32位 -----> 2 ** 32----> 21...---->
bigint:8个字节 -----> 64位 -----> 2 ** 64 ---->
默认情况整型是否带符号:
create table t5 (id tinyint);
create table t5 (id smallint);
create table t5 (id int);
create table t5 (id bigint);
检验:
insert into t5 values(999);
insert into t5 values(-129);

得出结论: 默认情况下整型是带符号的
整型的数字代表的是什么意思
char(4)、varchar(4) : 括号里的数字代表的只是存储的长度
int、tinyint、smallint :整型的存储范围跟括号中的数字没有任何关系
整型的存储范围完全是跟关键字相关,int, smallint
create table t11 (id int(3)); insert into t11 values(99999); create table t13 (id int(3) zerofill); insert into t13 values(9); create table t15 (id int(11) zerofill); insert into t15 values(9);

2. 浮点型(小数)
float、double、decimal
"""语法格式""":
float(255,30); # 255表示的是存储的位数,30代表的是小数位数。
double(255,30): # 255表示的是存储的位数,30代表的是小数位数。
decimal(65,30): # 65表示的是存储的位数,30代表的是小数位数。
比如:decimal(8,2) # 表示的最大范围是:999999.99

三者的区别:
create table t6(id float(255, 30)); create table t7(id double(255, 30)); create table t8(id decimal(65, 30)); # 插入数据 insert into t6 values(1.111111111111111111111111); insert into t7 values(1.111111111111111111111111); insert into t8 values(1.111111111111111111111111);
得出结论:三者的精确度不一样,decimal >>> double >>> float

3. 字符串
char(5)、varchar(5) # 这两个都是用来存储字符串使用的。
char(5): char 是定长,那么它就存5位,如果没有到5位,就会用空格补齐5位。
如果超出5位,(在严格模式下)报错或者就存5位

varchar(5):varchar是可变长的,不超出5位,有几位存几位,
如果超出5位,报错(在严格模式下)或者最大存5位。

验证:
create table t9(id int, name char(5)); create table t10(id int, name varchar(5)); insert into t9 values(1, 'kevin'); insert into t10 values(1, 'kevin');
如果想让报错,需要设置严格模式
如何查看严格模式
1. select @@sql_mode;
2. show variables like '%mode%' 模糊查询,变量中带有mode的。

设置严格模式
1. 永久修改:需要改配置文件
2.临时修改:
set global sql_mode='STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';

验证存储的长度:
insert into t9 values(1,'r'); insert into t10 values(1,'r'); #验证存储的长度 select char_length(name) from t10; select char_length(name) from t11;

大多数情况使用的都是varchar,如果你的存储数据就是固定的,就使用char。
4. 日期类型
datetime:年日月 时分秒 (reg_time)
date:年月日(update_time)
time:时分秒(delete_time)
year:年份
create table t14 (id int, reg_time datetime, update_time date, delete_time time, birth year ); insert into t14 values(1, '2023-10-01 11:11:11', '2023-07-10', '11:11:11', '2023');

5. 枚举类型
enum:多选一
create table t15 (id int, hobby enum('tangtou', 'hejiu', 'xijio', 'chouyan') ); insert into t15 values(1, 'tangtou');

set:多选多,也可以多选一
create table t16 (id int, hobby set('tangtou', 'hejiu', 'xijio', 'chouyan') );

创建表的完整语法结构
create table 表名(
字段名1 数据类型 约束条件 约束条件 约束条件,
字段名2 数据类型 约束条件 约束条件 约束条件,
字段名3 数据类型 约束条件 约束条件 约束条件,
字段名4 数据类型 约束条件 约束条件 约束条件,
字段名5 数据类型 约束条件 约束条件 约束条件
);
create table t17 ( id int, name varchar(16), age int )
注意事项:
1. 字段名和数据类型是必须要写的
2. 约束条件是可选的,有就有,没有就不写
3. 最后一个字段的末尾不能加逗号
约束条件
约束条件:在数据类型的基础上再添加限制条件
1. unsigned (无符号)
unsigned作用:
1. 起到约束数值的作用,只能输入正的值
2. 增加了数值的范围,以tinyint为例,原本的取值范围为-127~128,加上unsigned,取值范围:0~255
使用:
create table t1(id int unsigned);
结果:


2. zerofill
zerofill:不足位数的用0填充
使用:
create table t2(id int(5) zerofill); insert into t2 values(3); select * from t2;
结果:

3. not null(非空)
使用:
### 没有加not null 约束条件 create table t3(id int,name varchar(16)); insert into t3 values (1,''); insert into t3 values(2,null); select *from t3;
结果:

### 加了 not null约束条件 create table t4(id int,name varchar(16) not null); insert into t4 values(1,''); insert into t4 values(2,null); select * from t4;
结果:加了 not null约束条件,当往表格中写入null时会报错
""" 在MySQL中,空字符串和null不一样 """

4. unique(唯一)
单列唯一:
使用:单列的值是唯一的
create table t5(id int,name varchar(16) unique); insert into t5 values(1,'rui'); insert into t5 values(2,'rui');
结果:设定了name 的值是唯一的,所以当在插入相同的name值会报错。
如图:

联合唯一:
使用:unique(字段1,字段2),要求字段1-字段2 的值不能重复。
create table t6(id int,ip varchar(16),port int,unique(ip,port)); insert into t6 values(1,'127.0.0.1',8080); insert into t6 values(2,'127.0.0.0',8080); insert into t6 values(3,'127.0.0.1',8080); select *from t6;
结果如图:

5. default(默认值)
当没有写值时,就填入初始设定的默认值
使用:
create table t7(id int,name varchar(16) default 'hua'); insert into t7 values(1,'rui'); insert into t7(id) values(2);
结果如图:

6. 主键(primary key)
单纯从约束条件上来看,主键 = not null + unique,非空且唯一。
添加主键:
create table t8(id int primary key,name varchar(32)); insert into t8 values(1,'rui'); insert into t8 values(1,'lin'); insert into t8 values(2,'lin'); select *from t8;
结果:

InnoDB存储引擎要求每一张表必须要有一个主键,如果没有添加主键,InnoDB存储引擎内部隐藏的有一个主键字段,但是这个隐藏的字段我们看不到,这个主键的目的主要就是用来帮助我们把表创建成功,仅此而已。
一般会给id字段添加主键,sid、aid、uid等都可以。
7. auto_increment(让主键每次自动增加1)
以后创建表的时候,主键的固定写法:id int primary key auto_increment
使用:
create table t9(id int primary key auto_increment, name varchar(32)); insert into t9 values(null); # 报错 insert into t9(name) values('rui'); insert into t9(name) values('hua'); select *from t9;
结果如图:

清空表的两种方式
1. delete from t1; 清除数据但不会把主键id的值重置
2. truncate t1; 会把主键id的值重置为1开始并清除数据
推荐使用:truncate,使用truncate如果想恢复数据,还可以补救。
如何恢复数据:binlog日志,记录了你在数据库中执行SQL语句的变化过程,通过binlog日志还可以恢复数据。
补充其他SQL语句
1. 修改表名
'语法格式:' alter table 表名 rename 新表名;
2. 增加字段
在增加字段的时候,一定要考虑此时表中是否已经有数据了。
'语法格式:' alter table 表名 add 字段名 数据类型 完整的约束条件 after 字段名;# 在什么字段名之后添加
alter table 表名 add 字段名 数据类型 完整的约束条件 first; # 在第一行添加字段
alter table 表名 add 字段名 数据类型 完整的约束条件;
3. 删除字段
'语法格式:'
alter table 表名 drop 字段名;
4. 修改字段
modify只能改字段数据类型,约束条件,不能改字段名,但是change可以。
当数据表中已经有数据的时候,在修改的时候要仔细看好。
'语法格式:' alter table 表名 modify 字段名 数据类型 完整约束条件; alter table 表名 change 旧字段名 新字段名 旧数据类型 完整约束条件;
数据准备
create table emp( id int primary key auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age smallint(3) unsigned not null default 28, hire_date date not null, post varchar(50), post_comment varchar(100), salary double(15,2), office int, #一个部门一个屋子 depart_id int );
插入数据
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values ('tom','male',78,'20150302','teacher',1000000.31,401,1),#以下是教学部 ('kevin','male',81,'20130305','teacher',8300,401,1), ('tony','male',73,'20140701','teacher',3500,401,1), ('owen','male',28,'20121101','teacher',2100,401,1), ('jack','female',18,'20110211','teacher',9000,401,1), ('jenny','male',18,'19000301','teacher',30000,401,1), ('sank','male',48,'20101111','teacher',10000,401,1), ('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门 ('呵呵','female',38,'20101101','sale',2000.35,402,2), ('西西','female',18,'20110312','sale',1000.37,402,2), ('乐乐','female',18,'20160513','sale',3000.29,402,2), ('拉拉','female',28,'20170127','sale',4000.33,402,2), ('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门 ('程咬金','male',18,'19970312','operation',20000,403,3), ('程咬银','female',18,'20130311','operation',19000,403,3), ('程咬铜','male',18,'20150411','operation',18000,403,3), ('程咬铁','female',18,'20140512','operation',17000,403,3);

查询关键字—— where筛选
show variable like '%mode%'
模糊查询:没有明确的筛选条件
关键字: like
关键符号:
%:匹配任意个数任意字符
_:匹配单个个数任意字符
例题:
1.查询id大于等于3小于等于6的数据
# 方式1: select * from emp where id >=3 and id<=6;

# 方式2 select * from emp where id between 3 and 6;

2. 查询薪资是20000或者18000或者17000的数据
# 方式1 select * from emp where salary =20000 or salary = 18000 or salary=17000;

# 方式2 select * from emp where salary in (20000, 18000, 17000);

3. 查询员工姓名中包含o字母的员工姓名和薪资
select name,salary from emp where name like '%o%'; #补充1,以o开头的: select name,salary from emp where name like 'o%'; #补充2,以o结尾的: select name,salary from emp where name like '%o';

4. 查询员工姓名是由四个字符组成的员工姓名与其薪资
# 方式1: select name,salary from emp where name like '____'; #方式2: select name,salary from emp where char_length(name)=4;
结果:

5. 查询id小于3或者大于6的数据
# 方式1: select * from emp where id <3 or id >6; #方式2: select * from emp where id not between 3 and 6;
结果:

6. 查询薪资不在20000,18000,17000范围的数据
select * from emp where salary not in (20000,18000,17000);
结果:

7. 查询岗位描述为空的员工名与岗位名(针对null不能用等号,只能用is)
select name,post from emp where post_comment = NULL; # 查询结果为空! select name,post from emp where post_comment is NULL;
结果:

如果字段想设置为空,最好设置为 ‘ ’,不要使用NULL,尤其是两者混用。
归档数据:使用SQL语句把要归档的数据筛选出来。
查询关键字——group by分组
分组:把一个整体分成若干个个体
关键字:group by
分组之后,按照哪个字段分组就只能获取到这个字段的值。分组之后只能得到分组的依据。(严格模式下)
分组之后默认只能够直接过去到分组的依据,其他数据都不能直接获取。
" 针对5.6需要自己设置sql_mode = 'only_full_group_by,STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
分组正常会配合聚合函数使用,聚合函数有:sum、max、min、avg、count
1. 按部门分组
select * from emp group by post; # 进行验证: select id,name,sex from emp group by post;
结果:

2. 每个部门的最低工资
遇到每个肯定是需要分组的,按照每字后面的那个字段进行分组
select post,min(salary) from emp group by post;
结果:

3. 每个部门的平均工资
select post,avg(salary) from emp group by post;
结果:

4. 每个部门的工资总和
select post,sum(salary) from emp group by post;
结果:

5. 每个部门的人数
select post, count(*) from emp group by post; select post, count(id) from emp group by post; select post, count(1) from emp group by post; # 第一列的count
配合分组使用的其他函数,分组之后只能获取到分组的依据,通过使用group_contact 、contact_ws。
contact:用在分组之前
select concat(name,'|',sex) from emp;
group_contact:用在分组之后 ,取出每个部门的所有数据值
select post,group_concat(name,'|',age,'|',sex) from emp group by post;
结果:

concat_ws :一般用于分组前,分组后使用的话,按照什么分组就只能拿到分组 其他字段不能直接获取
select post,concat_ws('|', name, age,sex) from emp group by post;

补充 :在显示的时候还可以给字段取别名
as可以省略,但是不推荐省略,因为寓意不明确。
select post as '部门',max(salary) as '最高工资' from emp group by post;

补充:分组也可以按照多个字段分组
关键字——having过滤
having也是用来筛选数据的
功能上是跟where一样的,但是where是用在分组之前,先筛选一遍,而having是在分组之后在筛选。
题1:统计各部门年龄在30以上的员工平均薪资,并且保留平均薪资大于10000的部门。
# 第一步:先筛选出年龄在30之上的 select * from emp where age >30; #第二步:按部门分组算平均工资 select avg(salary) from emp where age >30 group by post; # 第三步:用having保留avg(salary)大于10000的部门 select avg(salary) from emp where age >30 group by post having avg(salary) >10000;
关键字——distinct去重
将重复的数据去掉,对有重复的展示数据进行去重操作(一定要是重复的数据)
select distinct age from emp; select distinct post from emp;
结果:

关键字——order by排序
select * from emp order by salary; #默认升序排,也可以写 asc进行升序排
select * from emp order by salary desc; #降序排
先按照age降序排,在年纪相同的情况下在按照薪资升序排。
select * from emp order by age desc,salary;
结果:

1. 统计各部门年龄在10岁以上的员工平均薪资,并保留平均薪资大于1000的部门,然后对平均薪资进行排序
# 1.先筛选出年龄在十岁以上的员工 select * from emp where age >10 # 2.按部门分组,求平均工资 select avg(salary) as avg_salary from emp where age >10 group by post # 3. 筛选出平均工资大于1000的部门 select avg(salary) as avg_salary from emp where age >10 group by post having avg(salary) >1000 # 4. 对平均薪资进行排序 select avg(salary) as avg_salary from emp where age > 10 group by post having avg(salary) > 1000 order by avg(salary) desc;
结果:

关键字——limit分页
1. 限制展示的条数:
select * from emp limit 3;

2. 查询工资最高的人的详细信息
select * from emp order by salary desc limit 1;

select * from emp limit 0,5; # 第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置 select * from emp limit 5,5; # 第一个参数代表的是起始位置,第二个参数是限制 的条数

关键字——regexp正则
支持正则
select * from emp where name regexp '^j.*(n|y)$';

练习题
1. 查询岗位名以及岗位包含的所有员工名字
select post,group_concat(name) from emp group by post;
结果:

2. 查询岗位名以及各岗位内包含的员工个数
select post,count(id) from emp group by post;
结果:

3. 查询公司内男员工和女员工的个数
select sex,count(sex) from emp group by sex;
结果:

4. 查询岗位名以及各岗位的平均薪资
select post,avg(salary) from emp group by post;
结果:

5. 查询岗位名以及各岗位的最高薪资
select post,max(salary) from emp group by post;
结果:

6. 查询岗位名以及各岗位的最低薪资
select post,min(salary) from emp group by post;
结果:

7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
select sex,avg(salary) from emp group by sex;
结果:

浙公网安备 33010602011771号