打开cmd窗口
- window + r 输入 cmd
- 输入mysql -u用户名 -p密码; 示例:mysql -uroot -p1234; 这种方式登录mysql,会出现警告,建议使用下面这种。
- mysql -uroot -p 然后回车 输入密码,在回车就登录到了mysql。
演示:
打开cmd
效果:
- window + r 输入 cmd 输入mysql -u用户名 -p密码; 示例:mysql -uroot -p1234; 这种方式登录mysql,不会出现警告,建议使用下面这种。
- mysql -uroot -p 然后回车 输入密码,在回车就登录到了mysql。
语法:mysql -uroot 用户名 -p密码[-h数据库服务器地址 -p端口号]
连接测试:mysql -h47.98.197.98 -P3306 -uroot -p 回车然后输入密码。
建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
- 使用表存储数据,格式统一,便于维护。
- 使用SQL语言操作,标准统一,使用方便,用于复杂查询。
SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。
Data Definition Language 数据库定义语言,定义数据库对象(数据库,表,字段)
Data Manipulation Language 数据操作语言,用来对数据库表中的数据进行增删改
Data Query Language 数据库查询语言,用来查询数据库中表的记录
Data Control Language 数据控制语言,控制创建数据库用户,控制数据库的访问权限
- SQL语句可以单行或多行书写,以分号结尾。
- SQL语句可以使用空格/缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写。
- 单行注释:-- 注释内容或者#注释内容
- 多行注释:/* 注释内容*/
show databases;
效果:
select database();
效果:
use 数据库名 use 数据库名
效果:
create database [if not exists]数据库名 [default charset utf8mb4];
效果:
效果2:
drop database [if exists] 数据库名;
效果:
上述语法中的database,也可以替换成 schema。
如:create schema db01; MySQL8版本中,默认字符集为utf8mb4
create table 表名( 字段1 字段类型 [约束] [comment 字段1注释])comment '表注释';
代码:
create table if not exists depts(
id int unsigned comment 'ID',
name varchar(10) comment '部门名称',
address varchar(50) comment '部门地址'
) comment '部门表';
create table employee(
id int unique comment 'ID',
emp_name varchar(10) comment '员工姓名',
gender char(1) comment '1 代表男 2代表女'
) comment '员工表';
效果:
约束是作用于表中字段上的规则,用于限制存储在表中的数据
限制该字段值不能为null not null
唯一约束:
保证字段的所有数据都是唯一、不重复的 unique
主键约束:
主键是一行数据的唯一标识,要求非空且唯一 primary key auto_increment
保存数据时,如果未指定该字段值,则采用默认值 default
让两张表的数据建立连接,保证数据的一致性和完整性 foreign key
目的:
保证数据库中数据的正确性、有效性和完整性。
代码:
create table emp(
id int unsigned primary key auto_increment comment 'ID,主键',
username varchar(20) not null unique comment '用户名',
password varchar(50) default '123456' comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '1 代表男,2 代表女',
phone char(11) not null unique comment '手机号',
job tinyint unsigned comment '1 代表班主任,2 代表讲师,3 代表学工主管,4 代表教研主管,5 代表咨询师' comment '职位',
salary int unsigned comment '薪资',
image varchar(300) comment '头像',
entry_date date comment '入职日期',
create_time datetime comment '创建时间',
update_time datetime comment '最后修改时间'
)comment '员工表';
show table --查询当前数据库的所有表
show tables ;
desc employee;
show create table 表名; -- 查询建表语句
show create table employee;
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束]; -- 添加字段
alter table employee add qq char(11) ;
alter table 表名 modify 字段名 新数据类型(长度); -- 修改字段类型
alter table employee modify qq char(13);
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束]; -- 修改字段名与字段类型
alter table employee change qq qq_num char(15);
alter table 表名 drop column 字段名; -- 删除字
alter table employee drop column qq_num;
alter table 表名 to 新表名; -- 修改表名
alter table employee rename to emps;
drop table [if exists] 表名; -- 删除表
drop table if exists emps;
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
- tinyint
- int
- bigint
- float float(5,2) 5表示整个数字长度 2 表示小数位数的个数
- double double(6,3) 6表示整个数字的长度 3表示小数位数的个数
- decimal decimal(5,2) 5 表示整个数字长度,3 表示小数位数的个数
年龄 tinyint unsigned
ID int unsigned
char 定长字符串char(10) A 占用10个空间;ABC 占用10个空间 ;ABCDE 占用10个空间;性能高
varchar 变长字符串varchar(10) A 占用10个空间;ABC 占用3个空间 ABCDE 占用5个空间
- date 日期格式 年月日
- time 时间格式 时分秒
- datetime 年月日 时分秒
-- 指定字段添加数据
insert into 表名(字段名1, 字段名2) values (值1, 值2);
-- 指定字段添加数据 (username name password gender phone )
insert into emp(username, name,password,gender,phone,create_time,update_time)
values('Tom','汤姆','1234',1,'12345678911',now(),now());
-- 全部字段添加数据
insert into 表名 values (值1, 值2, ...);
# 所有字段插入数据
insert into emp(id, username, password, name, gender, phone, job, salary, image, entry_date, create_time, update_time)
values(null,'Tom1','汤姆1','1234',1,'12345678912',2,5980,'1.png','2021-09-12',now(),now());
# 简写
insert into emp values(null,'Tom2','汤姆2','1234',1,'12345678913',2,5980,'1.png','2021-09-12',now(),now());
-- 批量添加数据(指定字段)
insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);
#批量插入指定字段
insert into emp(username,name,password,gender,phone)
values('jom','吉姆','1234',2,'12343434342',now(),now()),
('jom','吉姆','1234',2,'12343434342',now(),now());
-- 批量添加数据(全部字段)
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);
# 批量插入
insert into emp
values(null,'Tom3','汤姆3','1234',1,'12345678914',2,5980,'1.png','2021-09-12',now(),now()),
(null,'Tom4','汤姆4','1234',1,'12345678915',2,5980,'1.png','2021-09-12',now(),now());
-- 修改数据
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [ where 条件 ]
-- 1. 将 emp 表的ID为1员工 姓名name字段更新为 '张三'
update emp set name = '张三' where id = 1;
修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
-- 2. 将 emp 表的所有员工的 入职日期(entry_date) 更新为 '2010-01-01'
update emp set entry_date = '2010-01-01';
-- 删除数据 delete from 表名 [where 条件]
-- 1. 删除 emp 表中 ID为1的员工
delete from emp where id = 1;
- DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据
- DELETE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)
-- 2. 删除 dept 表中的所有员工
delete from dept;
create table emp(
id int unsigned primary key auto_increment comment 'ID,主键',
username varchar(20) not null unique comment '用户名',
password varchar(32) not null comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '性别, 1:男, 2:女',
phone char(11) not null unique comment '手机号',
job tinyint unsigned comment '职位, 1:班主任,2:讲师,3:学工主管,4:教研主管,5:咨询师',
salary int unsigned comment '薪资',
image varchar(300) comment '头像',
entry_date date comment '入职日期',
create_time datetime comment '创建时间',
update_time datetime comment '修改时间'
) comment '员工表';
-- 准备测试数据
INSERT INTO emp(id, username, password, name, gender, phone, job, salary, image, entry_date, create_time, update_time)
VALUES (1,'shinaian','123456','施耐庵',1,'13309090001',4,15000,'1.jpg','2000-01-01','2023-10-27 16:35:33','2023-10-27 16:35:35'),
(2,'songjiang','123456','宋江',1,'13309090002',2,8600,'2.jpg','2015-01-01','2023-10-27 16:35:33','2023-10-27 16:35:37'),
(3,'lujunyi','123456','卢俊义',1,'13309090003',2,8900,'3.jpg','2008-05-01','2023-10-27 16:35:33','2023-10-27 16:35:39'),
(4,'wuyong','123456','吴用',1,'13309090004',2,9200,'4.jpg','2007-01-01','2023-10-27 16:35:33','2023-10-27 16:35:41'),
(5,'gongsunsheng','123456','公孙胜',1,'13309090005',2,9500,'5.jpg','2012-12-05','2023-10-27 16:35:33','2023-10-27 16:35:43'),
(6,'huosanniang','123456','扈三娘',2,'13309090006',3,6500,'6.jpg','2013-09-05','2023-10-27 16:35:33','2023-10-27 16:35:45'),
(7,'chaijin','123456','柴进',1,'13309090007',1,4700,'7.jpg','2005-08-01','2023-10-27 16:35:33','2023-10-27 16:35:47'),
(8,'likui','123456','李逵',1,'13309090008',1,4800,'8.jpg','2014-11-09','2023-10-27 16:35:33','2023-10-27 16:35:49'),
(9,'wusong','123456','武松',1,'13309090009',1,4900,'9.jpg','2011-03-11','2023-10-27 16:35:33','2023-10-27 16:35:51'),
(10,'lichong','123456','林冲',1,'13309090010',1,5000,'10.jpg','2013-09-05','2023-10-27 16:35:33','2023-10-27 16:35:53'),
(11,'huyanzhuo','123456','呼延灼',1,'13309090011',2,9700,'11.jpg','2007-02-01','2023-10-27 16:35:33','2023-10-27 16:35:55'),
(12,'xiaoliguang','123456','小李广',1,'13309090012',2,10000,'12.jpg','2008-08-18','2023-10-27 16:35:33','2023-10-27 16:35:57'),
(13,'yangzhi','123456','杨志',1,'13309090013',1,5300,'13.jpg','2012-11-01','2023-10-27 16:35:33','2023-10-27 16:35:59'),
(14,'shijin','123456','史进',1,'13309090014',2,10600,'14.jpg','2002-08-01','2023-10-27 16:35:33','2023-10-27 16:36:01'),
(15,'sunerniang','123456','孙二娘',2,'13309090015',2,10900,'15.jpg','2011-05-01','2023-10-27 16:35:33','2023-10-27 16:36:03'),
(16,'luzhishen','123456','鲁智深',1,'13309090016',2,9600,'16.jpg','2010-01-01','2023-10-27 16:35:33','2023-10-27 16:36:05'),
(17,'liying','12345678','李应',1,'13309090017',1,5800,'17.jpg','2015-03-21','2023-10-27 16:35:33','2023-10-27 16:36:07'),
(18,'shiqian','123456','时迁',1,'13309090018',2,10200,'18.jpg','2015-01-01','2023-10-27 16:35:33','2023-10-27 16:36:09'),
(19,'gudasao','123456','顾大嫂',2,'13309090019',2,10500,'19.jpg','2008-01-01','2023-10-27 16:35:33','2023-10-27 16:36:11'),
(20,'ruanxiaoer','123456','阮小二',1,'13309090020',2,10800,'20.jpg','2018-01-01','2023-10-27 16:35:33','2023-10-27 16:36:13'),
(21,'ruanxiaowu','123456','阮小五',1,'13309090021',5,5200,'21.jpg','2015-01-01','2023-10-27 16:35:33','2023-10-27 16:36:15'),
(22,'ruanxiaoqi','123456','阮小七',1,'13309090022',5,5500,'22.jpg','2016-01-01','2023-10-27 16:35:33','2023-10-27 16:36:17'),
(23,'ruanji','123456','阮籍',1,'13309090023',5,5800,'23.jpg','2012-01-01','2023-10-27 16:35:33','2023-10-27 16:36:19'),
(24,'tongwei','123456','童威',1,'13309090024',5,5000,'24.jpg','2006-01-01','2023-10-27 16:35:33','2023-10-27 16:36:21'),
(25,'tongmeng','123456','童猛',1,'13309090025',5,4800,'25.jpg','2002-01-01','2023-10-27 16:35:33','2023-10-27 16:36:23'),
(26,'yanshun','123456','燕顺',1,'13309090026',5,5400,'26.jpg','2011-01-01','2023-10-27 16:35:33','2023-10-27 16:36:25'),
(27,'lijun','123456','李俊',1,'13309090027',5,6600,'27.jpg','2004-01-01','2023-10-27 16:35:33','2023-10-27 16:36:27'),
(28,'lizhong','123456','李忠',1,'13309090028',5,5000,'28.jpg','2007-01-01','2023-10-27 16:35:33','2023-10-27 16:36:29'),
(29,'songqing','123456','宋清',1,'13309090029',5,5100,'29.jpg','2020-01-01','2023-10-27 16:35:33','2023-10-27 16:36:31'),
(30,'liyun','123456','李云',1,'13309090030',NULL,NULL,'30.jpg','2020-03-01','2023-10-27 16:35:33','2023-10-27 16:36:31');
为了演示下面的案例,我们先创建一个表,并插入一些数据
-- 查询多个字段
select 字段1,字段2,字段3 from 表名;
-- 1. 查询指定字段 name,entry_date 并返回
select name,entry_date from emp;
-- 查询所有字段(通配符)
select * from 表名;
-- 2. 查询返回所有字段
-- 方式一
select id, username, password, name, gender, phone, job, salary, image, entry_date, create_time, update_time from emp;
-- 方式二
select * from emp;
-- 为查询字段设置别名,as关键字可以省略
select 字段1 [as 别名1], 字段2 [as 别名2] from 表名
-- 3. 查询所有员工的 name,entry_date, 并起别名(姓名、入职日期)
-- 方式一
select name as '姓名',entry_date as '入职日期' from emp;
-- 方式二 as 是可以省略的
select name '姓名',entry_date '入职日期' from emp;
-- 去除重复记录
select distinct 字段列表 from 表名
-- 4. 查询已有的员工关联了哪几种职位(不要重复)
select distinct job '职位' from emp;
-- 条件查询
select 字段列表 from 表名 where 条件列表
-- =================== DQL: 条件查询 ======================
-- 1. 查询 姓名 为 柴进 的员工
select * from emp where name = '柴进';
-- 2. 查询 薪资小于等于5000 的员工信息
select * from emp where salary <= 5000;
select * from emp where salary between 0 and 5000;
-- 3. 查询 没有分配职位 的员工信息
select * from emp where job is null ;
-- 4. 查询 有职位 的员工信息
select * from emp where job is not null ;
-- 5. 查询 密码不等于 '123456' 的员工信息
select * from emp where password != '123456';
select * from emp where password <> '123456';
-- 6. 查询 入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01';
-- 7. 查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from emp where entry_date between '2000-01-01' and '2010-01-01' and gender = 2;
-- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
select * from emp where job = 2 or job = 3 or job = 4;
select * from emp where job in (2,3,4);
-- 9. 查询 姓名 为两个字的员工信息
select * from emp where name like '__';
-- 10. 查询 姓 '李' 的员工信息
select * from emp where name like '李%';
-- 11. 查询 姓名中包含 '二' 的员工信息
select * from emp where name like '%二%';
将一列数据作为一个整体,进行纵向计算
null值不参与所有聚合函数的运算 。
统计数量可以使用:count(*) count(字段) count(常量),推荐使用count(*)
-- 聚合函数
-- 1. 统计该企业员工数量
#通配符
select count(*) from emp;
# 字段 null值 不参与聚合函数
select count(id) from emp; -- 30
select count(job) from emp; -- 29
# 常量
select count(0) from emp;
select count('A') from emp;
select count('孙') from emp;
-- 2. 统计该企业员工的平均薪资
select avg(salary) from emp;
-- 3. 统计该企业员工的最低薪资
select min(salary) from emp;
-- 4. 统计该企业员工的最高薪资
select max(salary) from emp;
-- 5. 统计该企业每月要给员工发放的薪资总额(薪资之和)
select sum(salary) from emp;
-- 分组查询
select 字段列表 from 表名 [where 条件列表] group by 分组字段名 [having 分组后过滤条件];
-- 1. 根据性别分组 , 统计男性和女性员工的数量
select gender,count(*) from emp group by gender;
-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job,count(*) from emp where entry_date <= '2015-01-01' group by job having count(*) >= 2;
where和having的区别:
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
- 执行顺序: where > 聚合函数 > having 。
-- 排序查询 select 字段列表 from 表名 [where 条件列表] [group by 分组字段名 having 分组后过滤条件] order by 排序字段 排序方式
排序方式:
升序(asc),降序(desc);默认为升序asc,是可以不写的。
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
-- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 更新时间 进行降序排序
select * from emp order by entry_date asc ,update_time desc;
-- 排序查询 select 字段 from 表名 [where 条件] [group by 分组字段 having 过滤条件] [order by 排序字段] limit 起始索引,查询记录数
- 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
-- 1. 从起始索引0开始查询员工数据, 每页展示5条记录
select * from emp limit 5;
-- 2. 查询 第1页 员工数据, 每页展示5条记录
select * from emp limit 1,5;
-- 3. 查询 第2页 员工数据, 每页展示5条记录
select * from emp limit 5,5;
-- 4. 查询 第3页 员工数据, 每页展示5条记录
select * from emp limit 10,5;