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;