SQL数据分析原代码--创建表与简单查询

  • CREATE TABLE:创建表,定义字段名、类型、注释
  • INSERT INTO:插入数据,支持单条或批量插入
  • SELECT:查询数据,*表示所有字段,AS可起别名,DISTINCT去重
  • WHERE:条件筛选,支持=<=IS NULLBETWEENANDORIN
  • 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;
相关推荐
YOU OU2 小时前
Redis基础常识与命令
数据库·redis·缓存
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
Database_Cool_5 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森5 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
Database_Cool_5 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白6 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql