MySQL学习之路_SELECT语句
来源:互联网 发布:斑马网络 上汽撤资 编辑:程序博客网 时间:2024/05/18 01:16
前面几篇博客已经讲过数据库、表的创建、简单的增删改查(CRUD)语句,如果没看到的,可以点击传送。
现在来重点讲下查询语句SELECT
,SELECT
是MySQL中最复杂也是功能强大的语句,这篇博文也几乎囊概了前几篇的内容,所以,借这个机会,顺便也复习下前几篇博文所讲内容,当然,也会涵盖一些新的内容。
为了更好的说明,我们先创建几张表,便于接下来的内容直接使用。
-- 创建一个数据库CREATE DATABASE school;-- 使用创建的数据库schoolUSE school;-- 创建表CREATE TABLE score (id SMALLINT NOT NULL AUTO_INCREMENT, name VARCHAR(10) NOT NULL, math INT NOT NULL, english VARCHAR(10) NOT NULL, chinese VARCHAR(10) NOT NULL, phone VARCHAR(10), PRIMARY KEY(id));-- 往表里插入数据INSERT INTO score(name, math, english, chinese, phone) VALUES ('张三', 89, 34, 25, '123456789');INSERT INTO score(name, math, english, chinese, phone) VALUES ('李四', 69, 78, 90, '111111111');INSERT INTO score(name, math, english, chinese, phone) VALUES ('王五', 99, 70, 88, '22222222');INSERT INTO score(name, math, english, chinese, phone) VALUES ('赵六', 59, 66, 77, '33333');INSERT INTO score(name, math, english, chinese, phone) VALUES ('赵六', 90, 58, 88, '44444444444');-- 查看所有数据SELECT * FROM score;
下图表示的是我们插入的所有数据的显示。
代码中都写了注释,就不多解释了,下面开始进入正题。
过滤表中重复的数据
在使用SELECT
查询数据时,可能会遇到查询的数据重复的情况,这时候就要用到关键字DISTINCT
了。这个关键字可以让查询的数据中重复的数据只显示一次。
没有对比,就没有差异,先看看所有的数据。
SELECT name FROM score;
结果如下:
可以看出,显示的数据有一个重复的’赵六’。
使用DINSTINCT
语句避免显示数据的重复。
SELECT DISTINCT name FROM score;
显示如下:
可以看出,重复的数据’赵六’只显示了一次,而不是两次。
这里就在说一下SELECT
的另一个用法,这个用法我也不知道怎么说明好,所以就放这儿一起说了。
如果要查询每位同学的数学加了10分之后的结果,并且,不改变表中数据的值。可能大家想到的是,先用UPDATE
语句更改每行数学分数的值。这么做太麻烦,而且,最重要的是,这已经改变原来的数据了。可以用下面的方法来做。
SELECT math+10 FROM score;
为了便于观察,下图依次是查询原来数据的,原来数据上加10的:
我们可以再看看表中math
是否被更改:
可以看出,原先数据并没有被改变。为了美观,我们还可以为math+10
加上别名,这样在显示的时候,就不是math+10
,而是你指定的名称了。
SELECT math+10 AS mathAdd10 FROM score;
显示的结果:
可以看出,这时列名已经更改为我自己设置的mathAdd10
了。这个也很简单,只要在要添加别名的列后写AS
加上要取的别名即可。这些就不过多测试了。
再说一个查询总分的SELECT
语句。
SELECT name, (math+english+chinese) AS Total FROM score;
WHERE
过滤结果
查询时,只想查询某个学生的成绩,或者想查询总分大于100的学生可以使用`WHERE
字句来过滤结果。
SELECT name, math, english, chinese FROM score WHERE name='张三';
SELECT name FROM score WHERE (math+english+chinese)>100;
上面分别是查询名字是‘张三’的各科成绩和查询总分超过100的学生名字。
查询math
在 80-90分的同学。
SELECT name FROM score WHERE math>80 AND math<90;-- 也可以这么写-- SELECT name FROM score WHERE math BETWEEN 80 AND 90;-- BETWEEN AND表示一个范围,在什么和什么范围。固定的语法-- 区别是后者包括90,前者不包括90。
上面的语句使用到了运算符AND
,除了这个还有OR
,OR
的意思就是或者,不是OR之前的就是OR之前的。譬如上面语句使用OR
代替AND
,结果就是查询math分数大于80或者小于90的同学。
SELECT name FROM score WHERE math>80 OR math>90;
查询math
分数为99, 59, 69的学生名字。
SELECT name FROM score WHERE math IN (99,59,69);
上面查询使用到了集合,上述查询语句意思就是查询math分数在集合(99, 59, 69)中的同学的名字。
LIKE
模糊查询
查询所有姓‘李’的同学。
SELECT name FROM score WHERE name LIKE "李%";
这里就要科普下通配符。
上面语句的”李%”表示所有以李开头的字符串都可以和它匹配,而”李_”只表示以李开头的,后面只跟一个字符的字符串。
排序输出
对数学成绩从高到低排序输出。
SELECT name, math FROM score order by math;
MySQL
提供了两种排序方式,升序(ASC)和降序(DESC)。默认是升序。
上述的例子,我们再按降序查询。
SELECT name, math FROM score order by math DESC;
函数
MySQL提供了几个合计函数供我们使用。
COUNT()函数
count函数统计记录的行数,也就是统计有多少个记录,但是不会统计行为`NULL
的记录。
SELECT phone FROM score;
可以看出表score
列phone
有一个值为NULL
。
SELECT COUNT(phone) FROM score;
可以看出,包括NULL
在内应该是有6条记录的,但是由于COUNT
函数不统计NULL
,所以就只显示了5条记录。 COUNT
括号内包含的就是要统计的列有多少有效记录(非NULL
)。 count()
函数和WHERE
字句一起使用,表示统计过滤后的结果有多少个。
统计english
分数大于70的有多少个。
SELECT COUNT(*) FROM score WHERE english>70;
SUM() 函数
sum()函数只对列类型为数字的有效。 作用是统计列数字的和,sum()括号内可以放入要统计的列,也可以放多列。
SELECT SUM(math) AS math_total, SUM(english) AS english_total, SUM(chinese) AS chinese_total, SUM(math+english+chinese) AS TOTAL FROM score;
例子都很容易看懂,就不多解释了。
ANG()函数
函数AVG
是用来求平均值的,用法也跟上面差不多。
SELECT AVG(math), AVG(english), AVG(chinese) FROM score;
例子都很简单,跟上面的函数差不多用法,就不多解释。
MAX()和MIN()
这两个函数求指定列的最大值和最小值,用法也跟上面一样,就不做示例了。
GROUP BY分组
GROUP BY
语句对所查询的列进行分组,这个也和关键字DISTINCT
一样可以达到避免重复数据的功能。
SELECT name FROM score ORDERS GROUP BY math;
上述语句意思是用math
进行分组并升序排序查询 学生名字。
表约束
`NULL
,不能重复 AUTO_INCREMENT 用于主键自动增长,有自增长的列,就不需要程序员自己管理,而是交给MySQL管理。不能重复 外键约束 表示列的值是另一个表的列值表约束前两个已经讲过了,就说说外键约束。
CREATE TABLE person( id INT PRIMARY KEY name VARCHAR(20));CREATE TABLE idcard( id INT PRIMARY KEY, address VARCHAR(40), CONSTRAINT id_FK FOREIGN KEY(id) REFERENCES person(id));
上述创建的两个表中,表idcard
的列id
是一个外键约束的列,CONSTRAINT id_FK FOREIGN KEY(id) REFERENCES person(id)
意思是定义id
为外键约束,并且它的值引用表people
的id
列的值,也就是表idcard
的id
列的值只能是表people
的id
列的值,不能使用id列不存在的值。
这里也就简单介绍了下。有兴趣的,可以去查查相关资料。
这篇博客比较长,也写了很久,也不太会写文章,就按照流水账来写的,如有发现错误,敬请指正。
- MySQL学习之路_SELECT语句
- mysql 操作语句_select子句、数据库的操作
- 02_SELECT语句
- MySQL进阶_SELECT篇
- MySQL进阶_SELECT篇
- sql语句_SELECT INTO 语句
- MySQL进阶_SELECT篇(三)
- MySQL进阶_SELECT篇(一)
- MySQL进阶_SELECT篇(二)
- mysql学习之三:sql语句学习
- MySQL学习笔记之基本语句
- MySql之SQL语句学习总结
- [学习笔记]MySql之SQL语句优化
- MySQL数据库学习五 之 SELECT语句
- MySQL 之 SQL 语句优化学习
- MySQL学习之三:select语句
- sql语句的学习之mysql
- 【MySql】MySql之语句
- 1622-5 孔富晨 总结《2016年11月11日》 【连续第42天总结】
- jQuery总结
- HDU 3966 [树链剖分]
- Python Dict and File -- python字典与文件读写
- 约瑟夫环,出圈游戏
- MySQL学习之路_SELECT语句
- 解决pip升级问题:关闭Mac的System Integrity Protection的方法
- Ubuntu Error : panic --not syncing: Attempt to kill init!
- 导出PDF文件中的公式LaTeX源码:翻译英文文献时的一些有用工具和心得
- Windows下交换Capslock和左Ctrl的方法
- C练习(二)
- VS2010无法启动调试问题解决方法小结
- 关于三维重建Cosplayer手办应用探讨
- python常用模块