CREATE TABLE
:创建表,定义字段名、类型、注释INSERT INTO
:插入数据,支持单条或批量插入SELECT
:查询数据,*
表示所有字段,AS
可起别名,DISTINCT
去重WHERE
:条件筛选,支持=
、<=
、IS NULL
、BETWEEN
、AND
、OR
、IN
等LIKE
:模糊查询,_
匹配单个字符,%
匹配任意字符- 聚合函数:
COUNT()
(计数)、AVG()
(平均值)、MAX()
(最大值)、MIN()
(最小值)、SUM()
(求和) GROUP BY
:分组查询,结合聚合函数使用;HAVING
用于分组后筛选(区别于WHERE
的分组前筛选)
1. 创建员工表(emp)
-- 创建名为emp的员工表,定义表结构及各字段信息
create table emp(
id int comment '编号', -- id字段:整数类型,用于唯一标识员工
workno varchar(10) comment '工号', -- workno字段:字符串类型(最长10字符),存储员工工号
name varchar(10) comment '姓名', -- name字段:字符串类型(最长10字符),存储员工姓名
gender char(1) comment '性别', -- gender字段:定长字符串(1字符),存储性别(如'男'/'女')
age tinyint unsigned comment '年龄', -- age字段:无符号tinyint类型(范围0-255),存储年龄
idcard char(18) comment '身份证号', -- idcard字段:定长18字符,存储身份证号(18位)
workaddress varchar(50) comment '工作地址', -- workaddress字段:最长50字符,存储工作地址
entrydate date comment '入职时间' -- entrydate字段:日期类型,存储入职日期
) comment '员工表'; -- 表注释:说明该表为员工表
2. 插入数据(INSERT)
-- 向emp表插入一条员工数据,指定插入的字段及对应值
insert into emp(id, workno, name, gender, age, idcard, emp.workaddress, entrydate)
VALUES (10,'10','it10','女',56,null, '北京', '2016-01-01'); -- id=10的员工,idcard为null(未填写)
-- 批量插入多条员工数据(一次性插入9条记录)
insert into emp(id, workno, name, gender, age, idcard, emp.workaddress, entrydate)
VALUES
(1,'1','itcast','男',10,123456789012345678, '北京', '2000-01-01'), -- 每条记录对应字段顺序与上方一致
(2,'2','张无忌','男',30,123456789012345345, '上海', '2008-01-01'),
(3,'3','留言','女',19,673456789012345678, '南京', '2011-01-01'),
(4,'4','小昭','女',15,123456745612345678, '北京', '2000-01-01'),
(5,'5','杨晓','男',43,123455489012345678, '河南', '2009-01-01'),
(6,'6','范冰冰','女',32,123459089012345678, '河北', '1999-01-01'),
(7,'7','itc','男',14,123412789012345678, '北京', '2000-01-01'),
(8,'8','i6','男',76,123456789012345678, '天津', '1920-01-01'),
(9,'9','it76t','男',43,123468789012345678, '西安', '2021-01-01');
3. 查询数据(SELECT 基础)
-- 查询员工的姓名、工号、年龄(只返回指定字段)
select emp.name, emp.workno, emp.age from emp;
-- 查询员工表中所有字段的所有记录(*表示所有字段)
select * from emp;
-- 查询员工的工作地址,并为字段起别名为"地址"(AS用于起别名,增强可读性)
select emp.workaddress as '地址' from emp;
-- 查询不重复的工作地址(DISTINCT用于去除重复记录,只保留唯一值)
select distinct emp.workaddress as '地址' from emp; -- AS可省略,此处保留是为了明确别名
4. 条件查询(WHERE 子句)
-- 查询年龄等于14的员工
select * from emp where age = 14;
-- 查询年龄小于等于43的员工
select * from emp where age <= 43;
-- 查询身份证号为null的员工(IS NULL判断字段值是否为空)
select * from emp where idcard is null;
-- 查询身份证号不为null的员工(IS NOT NULL判断字段值是否非空)
select * from emp where idcard is not null;
-- 查询年龄不等于43的员工(!= 等同于 <>,表示不等于)
select * from emp where age != 43;
-- 查询年龄在15到40之间的员工(BETWEEN a AND b 包含a和b边界值)
select * from emp where age between 15 and 40;
-- 查询性别为女且年龄小于25的员工(AND表示"且",需同时满足两个条件)
select * from emp where gender = '女' and age < 25;
-- 查询年龄为18、19或43的员工(OR表示"或",满足任一条件即可)
select * from emp where age = 18 or age = 19 or age = 43;
-- 等价于上面的OR查询(IN表示"在指定列表中",更简洁)
select * from emp where age in (18,19,43);
5. 模糊查询(LIKE)
-- 查询姓名为2个字符的员工(_表示单个任意字符,两个_即匹配2个字符)
select * from emp where name like '__';
-- 查询身份证号以7结尾的员工(%表示任意长度的任意字符,%7即匹配"任意字符+7结尾")
select * from emp where idcard like '%7';
6. 聚合函数(统计计算)
-- 统计员工总数(COUNT(emp.id)统计id字段非空的记录数,等同于COUNT(*))
select count(emp.id) from emp;
-- 计算员工的平均年龄(AVG(age)求age字段的平均值)
select avg(emp.age) from emp;
-- 查询员工中的最大年龄(MAX(age)求age字段的最大值)
select max(emp.age) from emp;
-- 查询员工中的最小年龄(MIN(age)求age字段的最小值)
select min(emp.age) from emp;
-- 计算工作地址为"北京"的员工年龄总和(SUM(age)求和,带WHERE条件筛选范围)
select sum(emp.age) from emp where workaddress = '北京';
7. 分组查询(GROUP BY)
-- 根据性别分组,统计每组(男性/女性)的员工数量
-- GROUP BY gender:将数据按gender字段分组(相同性别为一组)
-- count(id):统计每组的记录数(即该性别的员工数量)
select gender, count(id) from emp group by gender;
-- 根据性别分组,计算每组的平均年龄
select gender, avg(age) from emp group by gender;
-- 复杂分组查询:先筛选年龄<45的员工,再按工作地址分组,最后保留员工数>=3的地址
-- 1. WHERE age < 45:分组前先过滤出年龄小于45的员工
-- 2. GROUP BY workaddress:按工作地址分组
-- 3. HAVING count(*) >=3:分组后过滤,只保留员工数量>=3的地址(HAVING用于分组后筛选)
select workaddress, count(*) from emp where age < 45 group by workaddress having count(*) >= 3;