数据操作语言 (DML):
INSERT:用于向表中插入新行数据。添加数据中自动递增的列可以不指定,自动递增不会回撤,不会补齐,从最大值开始递增。可以不指定列但是需要将全部列指定数据。
DELETE:删除表中符合条件的行。
UPDATE:更新表中符合条件的行的数据。
查询语言 (MQL):
SELECT:用于从数据库中检索数据。
INSERT 语句:
插入单行数据和多行数据。
可选地指定列名进行插入。
自动递增列的处理。
DELETE 语句:
DELETE FROM table_name WHERE condition;用于删除满足条件的行。
TRUNCATE table_name;用于清空表的所有数据,比DELETE更高效。
UPDATE 语句:
更新符合条件的行的数据。
可以对列进行数学运算和字符串操作。
SELECT 语句:
SELECT 列名 FROM 表名 WHERE 条件:基本的数据检索。
使用通配符*选择所有列。
使用AS指定别名。(列,方法结果,表,视图)
使用ORDER BY对结果排序。
使用DISTINCT去重。对整个查询结果去重。
条件筛选:
使用WHERE子句指定条件进行筛选。
支持等于(=)、不等于(!=或者<>)、大于、小于、IN、BETWEEN、LIKE等操作符。
对NULL值的处理:使用IS NULL和IS NOT NULL。等于null(<=>)。
模糊查询:
占位符:%任意个数任意字符 。 _有且只有一个字符。
聚合函数:
COUNT():计算行数或符合条件的行数。count(列)时会忽略null,不计数,count(常量或者*),不忽略null值,计数。
SUM():计算列的总和。
AVG():计算列的平均值。
MAX():计算列的最大值。
MIN():计算列的最小值。
可以与GROUP BY结合使用,进行分组统计。
分组查询:
使用GROUP BY对数据进行分组。
使用HAVING对分组后的数据进行条件筛选,类似于WHERE但作用于分组后的结果集。
其他功能:
CASE WHEN:条件表达式,根据条件返回不同的值。
UNION:合并多个查询结果集,支持去重和不去重的操作。UNION ALL 不会去重。
是否存在 EXISTS:()中得不到内容,前面的查询不会返回结果,()能查到结果,前面的查询给出结果。
排序 order by:正序 asc 倒序 desc (默认正序)。
部分查询:查询第三到第五 LIMIT START,COUNT;(start是下标,从0开始)。
拼接(合并)查询结果:类型可以不同,数量必须相同,可以是不同表的查询。
sql
-- DML 数据管理语言 对数据增删改
-- 新增
-- 指定列添加数据
INSERT INTO staff(id,code,name,salary) VALUE
(2,'10002','李四',9000);
-- 自动递增列可以不指定
INSERT INTO staff(code,name,salary) VALUES
('10003','王五',10000),
('10004','赵六',11000);
-- 自动递增不会回撤,不会补齐 从该列最大值递增
-- not null 的列必须指定数据
INSERT INTO staff(code,name) VALUE ('10006','张三');
-- 可以不指定列但是需要将全部列指定数据
INSERT INTO staff VALUE(6,'10006','魏琛',12000);
-- 删除 DELETE (删除数据)
DELETE FROM staff WHERE id=2;
-- 修改/编辑 UPDATE
UPDATE staff SET name ='李清照' WHERE id =4;
UPDATE staff SET salary=salary+2000 WHERE name ='李清照';
UPDATE staff SET salary=salary-2000,`name`='aa' WHERE id=6;
-- 清空表
DELETE FROM staff;-- 删除每一行数据
TRUNCATE staff;-- 清空表 性能更快
-- 查询 MQL
SELECT 1;
SELECT NOW();
-- 查询表格
-- 指定列名查询
SELECT `name`,salary FROM staff;
-- 可以使用*代替所有的列
SELECT * FROM staff;
-- 使用as指定别名(列,方法结果,表,视图)
SELECT `name` AS `姓名` FROM staff;
-- where 指定条件语句
SELECT * FROM staff WHERE id=3;
-- 不等于
SELECT * FROM staff WHERE id!=3;-- 或者id<>3
-- 大于小于
SELECT * FROM staff where id>4;
SELECT * FROM staff where id>=4;
SELECT * FROM staff where id<=4;
-- 对null的判断
SELECT *FROM staff WHERE salary=NULL;-- 错误
SELECT * FROM staff WHERE salary IS NULL;
SELECT * FROM staff WHERE salary IS NOT NULL;
-- 等于null
SELECT * FROM staff WHERE salary <=> NULL;
-- 多条件
SELECT * FROM staff WHERE id<=100 AND salary >=10000;
SELECT * FROM staff WHERE salary>11000 OR salary<10000;
-- in not in
SELECT * FROM staff WHERE id=1 OR id=3....
SELECT * FROM staff WHERE id IN(2,4,6,8);
SELECT * FROM staff WHERE id NOT IN(2,4,6,8);
-- BETWEEN AND
SELECT * FROM staff WHERE salary BETWEEN 200 AND 12000;
-- 模糊查询 占位符:%任意个数任意字符 _有且只有一个字符
SELECT * FROM staff WHERE `name` LIKE '%a%';
SELECT * FROM staff WHERE `name` LIKE '李';
SELECT * FROM staff WHERE `name` LIKE '李_';-- 李某
-- 是否存在 EXISTS
SELECT * FROM staff WHERE EXISTS (SELECT * FROM staff WHERE 1=2);-- ()中得不到内容,前面的查询不会返回结果
SELECT * FROM staff WHERE EXISTS (SELECT * FROM staff WHERE id=2);-- ()能查到结果,前面的查询给出结果
-- any all
SELECT * FROM staff WHERE salary > ANY(SELECT 25);
SELECT * FROM staff WHERE salary > ALL(SELECT 25);
-- 排序 order by
SELECT * FROM staff ORDER BY salary;
-- 正序 asc 倒序 desc (默认正序)
SELECT * FROM staff ORDER BY salary asc;
SELECT * FROM staff ORDER BY salary desc;
SELECT * FROM staff ORDER BY salary asc,`code` DESC;
-- 拼接(合并)查询结果
-- 类型可以不同,数量必须相同
-- 可以是不同表的查询
SELECT `name`,salary FROM staff UNION
SELECT `code`,`name` FROM staff;
-- UNION去重效果
SELECT `name`,salary FROM staff UNION
SELECT `name`,salary FROM staff;
-- UNION ALL 不会去重
SELECT `name`,salary FROM staff UNION ALL
SELECT `name`,salary FROM staff;
-- 去重 DISTINCT 对整个查询结果去重
SELECT DISTINCT salary ,`name` FROM staff ;
-- 部分查询
-- 查询前两名
SELECT * FROM staff ORDER BY salary DESC LIMIT 2;
-- 查询第三到第五 LIMIT START,COUNT;
SELECT * FROM staff ORDER BY salary DESC LIMIT 2,3;
-- CASE WHEN THEN
SELECT * ,CASE WHEN salary<10000 THEN '薪资较低'
WHEN salary>=10000 AND salary<=12000 THEN '薪资正常'
ELSE '薪资较高'
END
FROM staff ;
SELECT * ,CASE salary WHEN 9000 THEN '还行'
WHEN 10000 THEN '还可以'
WHEN 11000 THEN '挺高'
WHEN 8000 THEN '不行'
WHEN 13000 THEN '牛'
END AS `level` FROM staff;
-- 分组 聚合函数 将多个数据聚合成一个
SELECT MAX(salary) FROM staff;-- 最大值
SELECT MIN(salary) FROM staff;-- 最小值
-- 计算平均数
SELECT AVG(salary) FROM staff;
-- 求和
SELECT SUM(salary) FROM staff;
-- 求个数
SELECT COUNT(salary) FROM staff;
-- 分组查询
SELECT department,AVG(salary) as 平均薪资 ,SUM(salary) AS 薪资和 FROM staff GROUP BY department;
-- 分组筛选
-- HAVING 对分组之后数据再筛选
SELECT department FROM staff GROUP BY department HAVING AVG(salary)<10000;
-- NULL
-- count(列)时会忽略null,不计数
-- count(常量或者*),不忽略null值,计数
链接查询 (JOIN):
左连接 (LEFT JOIN):会返回左表中的所有记录,即使右表中没有匹配的记录。右表没有匹配的记录将显示为NULL。
右连接 (RIGHT JOIN):与左连接相反,会返回右表中的所有记录,即使左表中没有匹配的记录。左表没有匹配的记录将显示为NULL。
内连接 (INNER JOIN):只返回两个表中有匹配的行。
全外连接 (FULL JOIN):MySQL不直接支持,但可以通过左连接和右连接的组合实现类似效果。
交叉连接 (CROSS JOIN):
返回两个表的笛卡尔积,即左表中每一行与右表中每一行的组合。不需要ON子句。
子查询 (Subquery):
可以作为一个表达式嵌入到另一个查询中。
可以用在SELECT、FROM、WHERE等子句中。
子查询一般用于限制结果集或者作为计算字段的数据源。
sql
-- 链接查询
-- 老师的姓名以及教授的课程
-- teacher Tname course cname
-- teacher.tid=course.tid
SELECT tname ,cname FROM teacher LEFT JOIN course ON teacher.TId=course.TId;
-- AS 起别名
SELECT a.Tname,b.Cname FROM teacher AS a LEFT JOIN course as b ON a.TId=b.TId;
SELECT a.Tname,b.Cname FROM teacher AS a RIGHT JOIN course as b ON a.TId=b.TId;
-- 链接查询 外连接,内连接
-- 主表会显示所有的数据,附表只会显示和主表有关系的数据
-- 外连接:左外连接 LEFT JOIN 左表为主表
-- 右外连接 RIGHT JOIN 右表为主表
-- 全外连接 FULL JOIN (mysql默认不支持)
-- 内连接:INNER JOIN 也可以写作join
-- 只显示有对应关系的数据
SELECT a.Tname,b.Cname FROM teacher AS a INNER JOIN course as b ON a.TId=b.TId;
-- 交叉连接 CROSS JOIN
SELECT * FROM teacher a ,course b WHERE a.TId=b.TId ;
-- 子查询
SELECT sname FROM student WHERE sid IN (
SELECT sid FROM sc WHERE score<60);
-- 将子查询当作一个表进行查询
SELECT sname FROM (SELECT * FROM student WHERE sid=01) AS a;