定义:
SQL语句,即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一 种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名
SQL语句分类
一、DDL
1、显示所有库
SHOW DATABASES;
2、创建一个库 CREATE DATABASE 库名;库只能被创建一次
3、删除一个库 DROP DATABASE 库名;
4、使用库 USE 库名;
5、改变字段属性
-- ALTER TABLE 表名 MODIFY 字段名 属性
ALTER TABLE teacher MODIFY money DECIMAL(11,2);
6、修改字段名
-- ALTER TABLE 表名 CHANGE 字段名 新字段名 属性
ALTER TABLE student CHANGE birthday shengri DATE;
7、添加字段
-- ALTER TABLE 表名 ADD 字段名 属性
ALTER TABLE teacher ADD address VARCHAR(30) DEFAULT '陕西';
8、删除字段
-- ALTER TABLE 表名 DROP 字段名;
删除一个字段
ALTER TABLE teacher DROP telephone;
9、修改表名
-- ALTER table 表名 RENAME AS 新表名;
二、DML
1、新增
INSERT INTO 表名 (字段名1,字段名2……)VALUES(值1,值2……);
&--- INSERT INTO teacher(name,sex,birthday,money,cid)VALUES
('王老大','男','2001-02-02',10000.00,001),('杨老二','男','2003-03-03',88888.00,002);
2、修改
UPDATE 表名 SET 字段名=值,字段名=值 WHERE [子句]
&--- UPDATE student SET name = '杰克逊' WHERE birthday = '2004-04-09';
&--- 在一定范围内写修改语句
UPDATE student SET ssex='女' ,classid = 9 WHERE Sid>= 9 AND Sid <=13;
&--- 等价语句 小数据在前,大数据在后
UPDATE student SET ssex='男' ,classid = 9 WHERE Sid BETWEEN 9 AND 13;
3、删除
&--- delete from teacher WHERE name ='周老十';
DELETE FROM student WHERE birthday = '1990-10-01';
三、DQL
1、SELECT * FROM student;-- (全查)
2、SELECT * FROM student WHERE classid = 1;-- (查找classid是1的人员)
3、-- 根据选择字段查询
SELECT sname,ssex FROM student;
4、-- 给字段起别名(3种方式—— as\''\直接放别名)
-- 一旦起别名了,字段名就是别名
SELECT sname AS '姓名',birthday '生日',ssex 性别 FROM student;
5、-- DISTINCT 去除重复(字段中完全相同的去掉)
SELECT DISTINCT Ssex FROM student;
SELECT DISTINCT ssex,classid FROM student;
6、-- 带条件的查询语句 WHERE
SELECT * FROM student WHERE ssex = '男';
SELECT * FROM student WHERE ssex = '男' AND classid = 1;
7、-- 生日大于1991.01.01的学生
SELECT * FROM student WHERE birthday < '1991-01-01';
8、模糊查询 LIKE
8.1 -- 模糊符号 % 任意多的任意字符
SELECT * FROM student WHERE Sname LIKE '%猴%';
8.2 -- 后模糊 xx%,结果是以xx开头的数据
SELECT * FROM student WHERE Sname LIKE '猴%';
8.3 -- 前模糊 %xx,结果是以xx结尾的数据
SELECT * FROM student WHERE Sname LIKE '%猴';
9、-- IN 在哪个范围内
SELECT * FROM student WHERE Sid IN(2,5,6,7,8,15);
10、-- 没有生日的学生 关键词 IS,不能是null
SELECT * FROM student WHERE birthday IS NULL;
SELECT * FROM student WHERE birthday IS NOT NULL;
11、聚合函数
count(字段) 统计个数,COUNT 不统计null
-- 统计表里一共有多少学生
SELECT COUNT(*) FROM student;
-- 统计表里一共有多少女同学
SELECT COUNT(*) FROM student WHERE Ssex = '女';
-- 可以使用常量去统计
SELECT COUNT(1) FROM student WHERE Ssex = '女';
SELECT COUNT('aaa') FROM student WHERE Ssex = '女';
-- 可以使用主键统计
SELECT COUNT(Sid) FROM student WHERE Ssex = '女';
avg (平均分)
-- 统计所有学生的平均分
SELECT AVG(score) FROM sc;
sum(总数)
-- 所有学生的总成绩
SELECT SUM(score) FROM sc;
max(最高分)
-- 最高成绩
SELECT MAX(score) FROM sc;
min(最低分)
-- 最低成绩
SELECT MIN(Score) FROM sc;
12、分组
-- 按照性别分组,男有多少,女有多少
SELECT ssex, COUNT(*) FROM student GROUP BY Ssex;
-- 每个班有多少学生
SELECT classid,COUNT(*)FROM student GROUP BY classid;
-- 总成绩
SELECT Sid,SUM(score) 总分 FROM sc GROUP BY Sid;
-- 分类合计
SELECT Sid,SUM(score) 总分 ,AVG(score) 平均分,MAX(Score) 最高分,MIN(Score) 最低分,COUNT(Score) 次数 FROM sc GROUP BY Sid;
13、 HAVING 数据聚合之后的分组;HAVING 不能单独出现,必须要和 GROUP BY 一起出现
-- 平均分大于80分的
SELECT sid,AVG(score) FROM sc GROUP BY Sid
HAVING AVG(Score)>80;
14、排序 ORDER BY 升序asc\降序desc
-- 成绩降序(由高到低)
SELECT * FROM sc ORDER BY Score DESC; 15、LIMIT 做分页
分页公式 (页码——1)*步长,步长,写的是确定值,不是表达式
SELECT * FROM student LIMIT 4,4;
16、多表联查
-- 非等值联查 迪卡尔积(两个集合相乘的结果) from之后多张表表名
SELECT * FROM student,class;
-- 内联查询
SELECT * FROM student INNER JOIN class ON student.classid=class.classid;
-- 1、先执行虚拟表,第一张的查询结果,作为最大的基础数据表;2、链接class表,复制了之前虚拟表的,进行条件判断拼数据。虚拟表最大结果集是最大表的个数。
-- 2、等值查询,内联查询的选择场景使用。表的数量多、字段名较多。数据量小,表非常多的时候使用等值联查。
内联多张表
-- 查询上过李四老师课程的学生;where写条件
SELECT student.* FROM student INNER JOIN sc ON student.Sid=sc.Sid INNER JOIN course ON sc.Cid=course.Cid INNER JOIN teacher ON course.Tid=teacher.Tid WHERE Tname='李四';
-- 外联查询 做外联查询,主要查询什么。主表在join的左边,称之为左外联。右外联亦是如此。
-- LEFT JOIN 左外联 主表是student
SELECT * FROM student LEFT JOIN class ON student.classid=class.classid;
-- RIGHT JOIN 右外联 主表是class
SELECT * FROM student RIGHT JOIN class ON student.classid=class.classid ORDER BY Sid;
UNION 上下两个结果并成一个虚拟表;union和数据类型无关;union并列的时候,上下两个表之间的字段名数量要一致;union去重复
SELECT * FROM student LEFT JOIN class ON student.classid=class.classid WHERE class.classid=NULL
UNION
SELECT * FROM student RIGHT JOIN class ON student.classid=class.classid WHERE student.Sid=NULL;
17、WHERE 子查询
使用where子查询实现 -- 子查询必须要有小括号;结果以主句为主,副句是条件。
查询id最大的一个学生
SELECT * FROM student WHERE Sid=(SELECT MAX(Sid) FROM student);
18、FROM 子查询
查询大于3人的班级名称和人数
SELECT classname,a 人数 FROM class LEFT JOIN
(SELECT classid,COUNT(*) a FROM student GROUP BY classid) t1
ON class.classid=t1.classid WHERE a > 3; 19、控制sql语句
IF(expr1,case,expr3)
SELECT tid,tname,IF(tsex=1,'男','女'),tbirthday FROM teacher;
case、when、then、end语句
-- 第一种,简单case(常量)
SELECT tname,tbirthday,
CASE tsex
WHEN 1 THEN '男'
WHEN 0 THEN '女'
END 性别,
taddress FROM teacher;
-- 第二种,搜索case
查询学生的成绩,
-- 并将大于90分的用A显示,
-- 大于80分的用B显示,
-- 大于70分的用C显示,
-- 大于60分的用D显示,
-- 小于60分的显示不及格
------------------------------------------------语法------------------------------------------
SELECT sname,cname,
CASE
WHEN score>=90 THEN 'A'
WHEN score>=80 AND score <90 THEN 'B'
WHEN score>=70 AND score <80 THEN 'C'
WHEN score>=60 AND score <70 THEN 'D'
WHEN score<60 THEN '不及格'
END 成绩评分
FROM student LEFT JOIN sc on student.sid=sc.sid
LEFT JOIN course ON sc.Cid = course.Cid ORDER BY 成绩评分;
以上便是MySQL中DDL、DML、DQL的使用和实例解析,牢记“增删改查”。