-- 查询指定列(学号 , 姓名) SELECT `studentno`,`studentname` FROM student;
-- as取别名 SELECT `studentno` AS 学号,` studentname` AS 姓名 FROM student AS s;
-- distinct 去重 SELECT DISTINCT `studentno` FROM result;
-- where语句 SELECT Studentno,StudentResult FROM result WHERE StudentResult>=95 AND StudentResult<=100;
SELECT studentno,studentname,address FROM student WHERE address IN ('北京','南京','河南洛阳');
SELECT studentname FROM student WHERE BornDate IS NULL; SELECT studentname FROM student WHERE Address='' OR Address IS NULL;
-- like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符) SELECT studentno,studentname FROM student WHERE studentname LIKE '%嘉%'; -- 查询姓刘的同学,后面只有一个字的 SELECT studentno,studentname FROM student WHERE studentname LIKE '刘_';
连接查询
分类一:
inner join : 两个表的交集,使用时INNER 关键字是可以省略的
outer join
left join:以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充
right join 以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充
MySQL 不支持FULL JOIN(全外连接)。如果你需要实现类似于 FULL JOIN 的功能,可以通过 UNION 结合 LEFT JOIN 和 RIGHT JOIN 来模拟。
分类二:
连接类型
描述
使用场景
等值连接
连接条件使用等号(=)
基于列值相等的查询
非等值连接
连接条件使用非等号运算符(>、< 等)
范围查询或复杂逻辑条件
自连接
表与自身连接
处理层次结构或递归关系的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-- 需求:查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
-- 内连接方式实现 SELECT s.studentno,studentname,subjectno,StudentResult FROM student s INNER JOIN result r ON r.studentno = s.studentno -- 等值连接方式实现 SELECT s.studentno,studentname,subjectno,StudentResult FROM student s , result r WHERE r.studentno = s.studentno
-- 需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中 查询父栏目名称和其他子栏目名称
-- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接) SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目' FROM category AS a,category AS b WHERE a.`categoryid`=b.`pid`
多张表连接时,表与表之间关系是并列关系
排序和分页
ORDER BY :用于根据指定的列对结果集进行排序。
默认按照ASC升序。
如果希望降序使用 DESC 关键字。
limit [页数],[页中条数]
1 2 3 4 5 6 7
-- StudentResult降序,第一页的5条数据 SELECT s.studentno,studentname,subjectname FROM student s INNER JOIN result r ON r.studentno = s.studentno WHERE subjectname='数据库结构-1' ORDER BY StudentResult DESC LIMIT 0,5
SELECT studentno,subjectno,StudentResult FROM result WHERE subjectno=( SELECT subjectno FROM `subject` WHERE subjectname = '数据库结构-1' ) ORDER BY studentresult DESC;
// 记录条数 SELECT COUNT(studentname) FROM student; // 总和 SELECT SUM(StudentResult) AS 总和 FROM result; // 平均数 SELECT AVG(StudentResult) AS 平均分 FROM result; // 最大 SELECT MAX(StudentResult) AS 最高分 FROM result; // 最小 SELECT MIN(StudentResult) AS 最低分 FROM result;
分组和过滤
where写在group by前面.; 要是放在 GROUP BY 的筛选要使用HAVING。
1 2 3 4 5 6 7 8
SELECT subjectname,AVG(studentresult) AS 平均分, MAX(StudentResult) AS 最高分, MIN(StudentResult) AS 最低分 FROMresultAS r INNERJOIN `subject` AS s ON r.subjectno = s.subjectno GROUPBY r.subjectno HAVING 平均分>80;
查询语句的执行顺序
关键执行顺序:FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT。
MySQL 执行查询语句的顺序与书写顺序不同,具体如下:
FROM users:从 users 表中读取数据。
JOIN orders ON users.id = orders.user_id:将 users 表和 orders 表连接。
WHERE users.age > 18:过滤出年龄大于 18 的用户。
GROUP BY users.country:按国家分组。
HAVING user_count > 10:过滤出用户数大于 10 的国家。
SELECT users.country, COUNT(*) AS user_count:选择国家列并计算用户数。
ORDER BY user_count DESC:按用户数降序排序。
LIMIT 5:返回前 5 行。
事务
事务就是将一组SQL语句放在同一批次内去执行;
如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行;
MySQL事务处理只支持InnoDB和BDB数据表类型
ACID原则
原子性(Atomic): 要不不执行,要不一起执行
一致性(Consistency):事务操作数据前后,数据的状态是由一个有效状态到另外一个有效状态;
A 和 B,需要从 A 转账 100 元到 B。转账前后,A 和 B 账户的总金额不变。 如果 A 账户余额不足,事务应失败,确保不会出现负数余额。