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;
相关推荐
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 _基于SpringBoot技术的“树洞”心理咨询服务平台的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
爱思德学术2 小时前
中国计算机学会(CCF)推荐学术会议-B(数据库/数据挖掘/内容检索):DASFAA 2026
数据库·区块链·数据管理·数据库系统
boonya2 小时前
Java内存模型与线程私有共享区域与直接内存的理解
java·开发语言·内存模型
axban2 小时前
QT M/V架构开发实战:QAbstractItemModel介绍
java·数据库·qt
云飞云共享云桌面2 小时前
非标自动化工厂如何10个三维设计共用一台云主机
大数据·运维·服务器·网络·数据库
哈喽姥爷2 小时前
Spring Boot--yml配置信息书写和获取
java·数据库·spring boot·mybatis
LeaderSheepH2 小时前
Java自定义比较器详解
java·开发语言
七夜zippoe3 小时前
缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(二)
java·开发语言·缓存
武昌库里写JAVA3 小时前
Java设计模式中的几种常用设计模式
vue.js·spring boot·sql·layui·课程设计