MySQL下对表中数据的操作

添加

  • 使用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()     求和

结果:这里写图片描述

扫描二维码关注公众号,回复: 5069798 查看本文章

列出完成量小于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 BYHAVING 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

猜你喜欢

转载自blog.csdn.net/liuchonghua/article/details/81780497