添加
- 使用
INSERT
语句进行添加
INSERT INTO <表名>(字段1,字段2) VALUES(数据1,数据2);
现在有如下student表:
- 执行
INSERT INTO student(id,NAME) VALUES(1,'张三');
也可以批量添加:
INSERT INTO student(id,NAME) VALUES(2,'李四'),(3,'王五');
查询
- 使用
SELECT
从表中查询数据,查询结果被存储在一个称为结果集的表中。
格式为:
SELECT <列名称> FROM <表名称>
1. 用于计算:
SELECT 1+2 FROM DUAL
//DUAL是一个虚拟表,在MySQL中因为FROM后面必须指定一张表,所以才设计的虚拟表以满足SELECT语法格式
执行会显示:
2. 查询表中的一列:
SELECT NAME FROM student
3. 查询表中的所有字段:
- 可以使用通配符
*
表示所有:
SELECT * FROM student
4. 按条件查询:
使用
SELECT 字段名 FROM 表名 WHERE 条件
查询表中id等于3的内一行的全部字段:
SELECT * FROM student WHERE id=3
5.限制查询的结果
使用 AND LIKE语句
现有如下表:
执行
SELECT * FROM student WHERE 组='B'
查询结果:
显示名字中带有三
的:
select * from student where 组='B' and name like '%三'
and
后面是限制的字段,like
后面是限制的条件%
是通配符.
6. 分组查询:
现在有一张学生表:
统计每个组完成的任务总量:
SELECT 组 ,SUM(完成的量) AS 总量 FROM student GROUP BY 组
//GROUP BY 分组显示
//SUM() 求和
结果:
列出完成量小于3的人员:
SELECT NAME,完成的量 FROM student HAVING 完成的量<3
//HAVING 用于限制输出结果
结果:
按完成的量从大到小排序:
SELECT * FROM student ORDER BY 完成的量 DESC
//ORDER BY 排序,默认从小到大
//DESC 从大到小
//ASC 从小到大
结果:
按完成的量从小到大排序,只显示前3行:
SELECT * FROM student ORDER BY 完成的量 ASC LIMIT 3
//LIMIT 限制输出的行数
//ASC 升序
//LIMIT 显示的行数,也可以用2,3表示从第二行开始向下显示3行(第一个数字的计数方式从0开始)
结果:
统计字段中值出现的次数
SELECT 其他字段,COUNT(*) AS 统计结果显示的字段 FROM 查询的表 GROUP BY 统计的字段
//其他字段 查询结果中需要显示的其他字段
已有表:
显示id中每个值出现的次数,执行:
SELECT id,COUNT(*) AS counts FROM test GROUP BY id
结果:
查询每个组中完成的量大于10的组
HAVING子句
- 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
SELECT 组,SUM(完成的量) FROM student GROUP BY 组 HAVING SUM(完成的量)>10
结果:
子查询
将一条查询的结果作为另一个查询的条件。
子查询的语法:
select * from 表名 where 列名 > (子查询)
- 子查询语句需要放在括号中
>
这个是大于号,还可以使用别的比较运算符- 先执行子查询部分,求出子查询部分的值,再执行整个父查询,返回最后的结果。
还可以和
update
,insert
,delete
一起使用。注意 :将子查询作为比较运算符的条件时,需要保证子查询返回的结果只有一条。
求完成的量大于平均数的人员**
对于下表:
执行:
SELECT * FROM student WHERE 完成的量 >(SELECT AVG(完成的量) FROM student)
AVG
求平均
结果:
ANY和ALL
- ANY:表示任意一个。
- ALL:表示所有。
对于下表:
查询B组中完成的量大于所有A组组员人:
SELECT * FROM student WHERE 组='B' AND 完成的量 > ALL (SELECT 完成的量 FROM student WHERE 组='A');
查询B组中完成的量大于任意A组的成员:
SELECT * FROM student WHERE 组='B' AND 完成的量 > ANY (SELECT 完成的量 FROM student WHERE 组='A');
多列比较
第一列比较如果相等就继续比较第二列,哪一列不同返回值就是比较那一列的结果:
- 图中第一列相等于是比较的就是第二列,2<3返回值就是1
exists 和 not exists
- EXISTS或者NOT EXISTS是把主查询的字段传到后边的查询中作为条件,返回值是TRUE或者FALSE
对于现有两表:
student:project:
SELECT * FROM project WHERE NOT EXISTS(SELECT * FROM student WHERE student.`组`=project.`P_id`)
查询project表中p_id包含于student表中组的内容:
SELECT * FROM project WHERE NOT EXISTS(SELECT * FROM student WHERE student.`组`=project.`P_id`)
查询不包含的部分
内连接
关键字:inner join on
拼合两个表,只显示满足条件的行
举例
现有a表:b表:
SELECT * FROM a INNER JOIN b ON a.`id`=b.`id`;
查询a表和b表中id相同的部分:
这条语句和下面这条效果相同:
SELECT * FROM a INNER JOIN b ON a.`id`=b.`id`;
表的别名
可以给 表起别名,表名后面可以定义表的别名用于后面的查询表达式书写
SELECT * FROM a student,b project WHERE student.`id`=project.`id`;
SELECT * FROM a student INNER JOIN b project ON student.`id`=project.`id`;
外连接
现有表a:表b:
笛卡尔积
SELECT * FROM a,b
亮亮组合不重复的所有结果
左外连接
SELECT * FROM a LEFT JOIN b ON a.`id`=b.`id`;
第一个表全显示,第二个表只显示满足条件的部分
右外连接
SELECT * FROM a RIGHT JOIN b ON a.`id`=b.`id`;
第一个表只显示满足条件的第二个表全部显示
全外连接
将左外连接和右外连接的结果拼在一起
SELECT * FROM a LEFT JOIN b ON a.`id`=b.`id` UNION SELECT * FROM a RIGHT JOIN b ON a.`id`=b.`id`;
SQL函数
函数 | 作用 | 语法格式 | 效果 |
---|---|---|---|
AVG() | 求平均 | SELECT AVG(完成的量) FROM student |
返回student表中完成的量的平均值 |
COUNT() | 计算出现的个数 | SELECT 组,COUNT(组) AS 人数 FROM student GROUP BY 组 |
统计student表中每个组的人数 |
SUM() | 求和 | SELECT SUM(完成的量) FROM student |
返回student表中完成的量的总数 |
MAX() | 最大值 | SELECT MAX(完成的量) FROM student |
返回student表中完成量的最大值 |
MIN() | 最小值 | SELECT MIN(完成的量) FROM student |
返回student表中完成量的最小值 |
UCASE() | 转换为大写 | SELECT UCASE(name) FROM c |
将表c中name列的值转为大写 |
LCASE() | 转换为小写 | SELECT LCASE(name) FROM c |
将表c中name列的值转为小写 |
MID() | 提取字符串 | SELECT MID(字段,起始位置,截取长度) FROM 表 |
从指定字段中提取字符串,截取长度可选 |
LENGTH() | 获取字符串长度 | SELECT LENGTH(字段) FROM 表 |
返回指定字符字段中的字符串的长度 |
ROUND() | 保留小数位 | SELECT ROUND(AVG(完成的量),3) FROM student |
将平均值保留3位小数 |
NOW() | 返回当前系统时间 | SELECT NOW() FROM DUAL |
DUAL是虚拟表,返回结果是当前系统时间 |
MOD() | 求余 | SELECT MOD(5,2) FROM DUAL |
求余数结果是1 |
CONCAT() | 拼接字符串 | SELECT CONCAT('hello','java') FROM DUAL |
返回值是hellojava |
FORMAT() | 格式化数字 | SELECT FORMAT(1234567.4854,1) |
结果:1,234,567f.5整数部分3位一分,小数部分保留并四舍五入,FORMAT第二个参数为保留的小数位数 |
CONCAT_WS() | 使用指定连接符链接字符串 | SELECT CONCAT_WS('-','hello','word') |
结果:hello-word |
修改数据
使用UPDATE SET
可以修改已有的数据
根据id号修改学生的姓名
UPDATE student SET NAME='王兴' WHERE id=8
将id为偶数的学生的姓名改为大刘
UPDATE student SET NAME='大刘' WHERE MOD(id,2)=0;
效果:
同时修改多行多列
UPDATE student SET NAME='张龙',完成的量=6 WHERE id BETWEEN 1 AND 3
删除数据
删除表a中id为4的内一行
DELETE FROM a WHERE id=4