MySQL学习之路_SELECT语句

来源:互联网 发布:斑马网络 上汽撤资 编辑:程序博客网 时间:2024/05/18 01:16

前面几篇博客已经讲过数据库、表的创建、简单的增删改查(CRUD)语句,如果没看到的,可以点击传送。
现在来重点讲下查询语句SELECTSELECT 是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;

结果如下:
显示name
可以看出,显示的数据有一个重复的’赵六’。
使用DINSTINCT 语句避免显示数据的重复。

SELECT DISTINCT name FROM score;

显示如下:
对比图
可以看出,重复的数据’赵六’只显示了一次,而不是两次。

这里就在说一下SELECT 的另一个用法,这个用法我也不知道怎么说明好,所以就放这儿一起说了。

如果要查询每位同学的数学加了10分之后的结果,并且,不改变表中数据的值。可能大家想到的是,先用UPDATE 语句更改每行数学分数的值。这么做太麻烦,而且,最重要的是,这已经改变原来的数据了。可以用下面的方法来做。

SELECT math+10 FROM score;

为了便于观察,下图依次是查询原来数据的,原来数据上加10的:
math

math+10
我们可以再看看表中math 是否被更改:
math
可以看出,原先数据并没有被改变。为了美观,我们还可以为math+10 加上别名,这样在显示的时候,就不是math+10,而是你指定的名称了。

SELECT math+10 AS mathAdd10 FROM score;

显示的结果:
别名
可以看出,这时列名已经更改为我自己设置的mathAdd10 了。这个也很简单,只要在要添加别名的列后写AS 加上要取的别名即可。这些就不过多测试了。
再说一个查询总分的SELECT语句。

SELECT name, (math+english+chinese) AS Total FROM score;

TOTAL

WHERE 过滤结果

查询时,只想查询某个学生的成绩,或者想查询总分大于100的学生可以使用`WHERE 字句来过滤结果。

SELECT name, math, english, chinese FROM score WHERE name='张三';

WHERE

SELECT name FROM score WHERE (math+english+chinese)>100;

 dayu100
上面分别是查询名字是‘张三’的各科成绩和查询总分超过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
上面的语句使用到了运算符AND,除了这个还有OROR 的意思就是或者,不是OR之前的就是OR之前的。譬如上面语句使用OR代替AND,结果就是查询math分数大于80或者小于90的同学。

SELECT name FROM score WHERE math>80 OR math>90;

OR

查询math分数为99, 59, 69的学生名字。

SELECT name FROM score WHERE math IN (99,59,69);

SET
上面查询使用到了集合,上述查询语句意思就是查询math分数在集合(99, 59, 69)中的同学的名字。

LIKE模糊查询

查询所有姓‘李’的同学。

SELECT name FROM score WHERE name LIKE "李%";

like
这里就要科普下通配符。

通配符 说明 % 表示匹配一串任意的字符串 _ 只匹配一个任意的字符

上面语句的”李%”表示所有以李开头的字符串都可以和它匹配,而”李_”只表示以李开头的,后面只跟一个字符的字符串。

排序输出

对数学成绩从高到低排序输出。

SELECT name, math FROM score order by math;

order
MySQL提供了两种排序方式,升序(ASC)和降序(DESC)。默认是升序。
上述的例子,我们再按降序查询。

SELECT name, math FROM score order by math DESC;

DESC

函数

MySQL提供了几个合计函数供我们使用。

COUNT()函数

count函数统计记录的行数,也就是统计有多少个记录,但是不会统计行为`NULL 的记录。

SELECT phone FROM score;

count
可以看出表scorephone 有一个值为NULL

SELECT COUNT(phone) FROM score;

count
可以看出,包括NULL在内应该是有6条记录的,但是由于COUNT函数不统计NULL,所以就只显示了5条记录。
COUNT括号内包含的就是要统计的列有多少有效记录(非NULL)。
count()函数和WHERE字句一起使用,表示统计过滤后的结果有多少个。
统计english分数大于70的有多少个。

SELECT COUNT(*) FROM score WHERE english>70;

count_where

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;

result
例子都很容易看懂,就不多解释了。

ANG()函数

函数AVG 是用来求平均值的,用法也跟上面差不多。

SELECT AVG(math), AVG(english), AVG(chinese) FROM score;

AVG
例子都很简单,跟上面的函数差不多用法,就不多解释。

MAX()和MIN()

这两个函数求指定列的最大值和最小值,用法也跟上面一样,就不做示例了。

GROUP BY分组

GROUP BY 语句对所查询的列进行分组,这个也和关键字DISTINCT 一样可以达到避免重复数据的功能。

SELECT name FROM score ORDERS GROUP BY math;

group
上述语句意思是用math 进行分组并升序排序查询 学生名字。

表约束

约束类型 说明 PRIMARY KEY 主键约束,带有这个约束的列,不能为`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 为外键约束,并且它的值引用表peopleid 列的值,也就是表idcardid 列的值只能是表peopleid 列的值,不能使用id列不存在的值。

这里也就简单介绍了下。有兴趣的,可以去查查相关资料。

这篇博客比较长,也写了很久,也不太会写文章,就按照流水账来写的,如有发现错误,敬请指正。

0 0