域名和网站名要一样吗,如何做一个购物网站,wordpress 酷炫的插件,成都网络营销搜索推广目录 1.select的基本使用
1.1.查询所有列
1.2.查询特定列
1.3.DISTINCT关键字的使用——查询不重复的年级
1.4.带条件的查询
1.5.排序查询结果
1.6.LIMIT的使用——限制返回的行数
1.7.组合使用 WHERE、ORDER BY 和 LIMIT
1.8.查询字段为表达式
1.9.为查询结果指定别名…目录 1.select的基本使用
1.1.查询所有列
1.2.查询特定列
1.3.DISTINCT关键字的使用——查询不重复的年级
1.4.带条件的查询
1.5.排序查询结果
1.6.LIMIT的使用——限制返回的行数
1.7.组合使用 WHERE、ORDER BY 和 LIMIT
1.8.查询字段为表达式
1.9.为查询结果指定别名
2.SELECT的WHERE子句 2.1.查询英语不及格的同学及其英语成绩
2.2.查询语文成绩在80到90分的同学及其语文成绩
2.3.数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
2.4.姓孙的同学 及 孙某同学
2.5.查询语文成绩好于英语成绩的同学
2.6.查询总成绩在200分以下的同学
2.7.语文成绩 80 并且不姓孙的同学
2.8.孙某同学否则要求总成绩 200 并且 语文成绩 数学成绩 并且 英语成绩 80
2.9.NULL的查询
2.9.1. 查询 qq 号已知的同学姓名
2.9.2.查询QQ号未知的同学
3.结果排序
3.1. 同学及数学成绩按数学成绩升序显示
3.2.查询同学及其QQ号按QQ号排序显示
3.3.查询同学各门成绩依次按 数学降序英语升序语文升序的方式显示
3.4.查询同学及总分由高到低 3.5.查询姓孙的同学或姓曹的同学及其数学成绩按数学成绩降序显示 4.筛选分页结果 1.select的基本使用
SELECT [DISTINCT] {* | {column1 [, column2] ...}}
FROM table_name
[WHERE ...]
[ORDER BY ...]
[LIMIT ...];
组成部分解释
SELECT 关键字用于开始一个查询操作。[DISTINCT] 可选项用于确保查询结果中的每一行都是唯一的。如果指定了DISTINCT那么结果集中的重复行将被移除。{ * | {column1 [, column2] ...} } 用于指定要查询的列。* 表示选择所有列。{column1 [, column2] ...}表示选择指定的列列名之间用逗号分隔。FROM table_name 指定要从中查询数据的表名。[WHERE ...] 可选项用于指定查询条件。只有满足条件的行才会被包含在结果集中。条件通常涉及列名和比较运算符如、、、 等。[ORDER BY ...] 可选项用于指定结果集的排序顺序。可以按一个或多个列进行排序。默认情况下排序是升序的ASC。要指定降序排序可以使用 DESC 关键字。[LIMIT ...] 可选项用于限制返回的行数。可以指定一个数字来限制返回的行数。在某些数据库系统中LIMIT子句还可以接受一个偏移量offset和一个行数row count以指定从哪一行开始返回结果。
示例 假设有一个名为 students 的表包含以下列id、first_name、last_name、age 和 grade。
CREATE TABLE students ( id INT PRIMARY KEY AUTO_INCREMENT, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, age INT NOT NULL, grade VARCHAR(10)
); 我们插入一些数据进去
INSERT INTO students (id, first_name, last_name, age, grade)
VALUES
(1, John, Doe, 25, A),
(2, Jane, Smith, 19, B),
(3, Michael, Johnson, 17, A-),
(4, Emily, Davis, 14, B),
(5, Alen, walk, 24, A),
(6, David, Brown, 18, A); 1.1.查询所有列
select * from students;
这条语句会选择students表中的所有列和所有行并返回结果。*是一个通配符表示所有列。 通常情况下不建议使用* 进行全列查询
查询的列越多意味着需要传输的数据量越大MySQL采用的CS模式可能会影响到索引的使用。
1.2.查询特定列
select first_name, last_name from students;
这条语句只会选择students表中的first_name和last_name列并返回这些列的所有行。 我们看到只显示了first_name和last_name列。
1.3.DISTINCT关键字的使用——查询不重复的年级
select distinct grade from students;
这条语句会选择students表中的grade列但只返回不重复的值。DISTINCT关键字用于去除重复的行。 1.4.带条件的查询
select first_name, last_name from students where age 18;
这条语句会选择students表中的first_name和last_name列但只返回那些age列值大于18的行。WHERE子句用于指定查询条件。 我们看到只显示了first_name和last_name列再看看这三个人的age 我们发现这三个人的年龄刚好是比18大的
1.5.排序查询结果
select first_name, last_name from students order by last_name ASC;
这条语句会选择students表中的first_name和last_name列并按last_name列的值进行升序排序ASC表示升序是默认排序方式。ORDER BY子句用于指定排序的列和排序方式。 我们发现从上到下都是根据last_name列的值按A-Z来排序的
1.6.LIMIT的使用——限制返回的行数
select first_name, last_name from students limit 2;
这条语句会选择students表中的first_name和last_name列但只返回前2行。LIMIT子句用于限制返回结果的数量。 我们可以对比之前的 1.7.组合使用 WHERE、ORDER BY 和 LIMIT
SELECT first_name, last_name FROM students
WHERE age 18
ORDER BY last_name DESC
LIMIT 3;
这条语句结合了前面的几个示例。它首先选择students表中age大于18的行的first_name和last_name列然后按last_name列的值进行降序排序DESC表示降序最后只返回前3行。 1.8.查询字段为表达式
select语句是一个非常特殊的语句其在查询数据时column列表中除了能罗列表中存在的列名外我们也可以将表达式罗列到column列表中。如下
SELECT first_name, last_name,11 FROM students; 我们发现这个直接在表的后面拼接了表达式的结果。
我们现在查询一下这个到底有没有存到表里面去
select * from students; 我们发现这个表达式的值没有被存到这个表里面去。 事实上select不仅能够用来查询数据还可以用来计算某些表达式或执行某些函数。如下 select 2*3/4; 我们可以借助上面那个特性来完成一些事情 如果我们将表达式罗列到column列表中 那么每当一条记录被筛选出来时就会执行这个表达式然后将表达式的计算结果作为这条记录的一个列值进行显示。 column列表中的表达式可以包含表中已有的字段这时每当一条记录被筛选出来时就会将记录中对应的列值提供给表达式进行计算。 例如我们将每个人的年龄都加上10岁
select first_name,last_name,age10 from students; 我们发现age10的值就自动附在表的后方。同时我们要知道那些数据并不会覆盖表里的数据
select * from students; 又或者我们可以求一下同学的id和age的总和
select first_name,last_name,idage from students; 1.9.为查询结果指定别名
为查询结果指定别名的SQL语法如下
SELECT column [AS] alias_name [...] FROM table_name;说明
SQL中大写的表示关键字[ ]中代表的是可选项。
比如我们刚刚计算的idage太过于简陋了我们可以设置别名result
select first_name,last_name,idage as result from students; 2.SELECT的WHERE子句
我们在上面简单的使用了一下where子句但是那远远不够现在我们来系统学习一下where子句。
where子句添加与否的区别
如果在查询数据时没有指定where子句那么会直接将表中所有的记录作为数据源来依次执行select语句。如果在查询数据时指定了where子句那么在查询数据时会先根据where子句筛选出符合条件的记录然后将符合条件的记录作为数据源来依次执行select语句。(非常重要) where子句中可以指明一个或多个筛选条件各个筛选条件之间用逻辑运算符AND或OR进行关联下面给出了where子句中常用的比较运算符和逻辑运算符。
注意MySQL中的的NULL不能参与任何运算
比较运算符 运算符说明、、、大于、大于等于、小于、小于等于 等于。需要注意的是当比较的值中包含NULL时结果也是NULL而不是TRUE。这是因为在SQL中NULL表示未知所以任何与NULL的比较都是不确定的。 这是SQL中的一个特殊运算符用于进行NULL安全的等于比较。如果两个值都是NULL或者它们相等那么结果是TRUE。这个运算符在某些数据库系统中可能不被支持。!、不等于运算符。这两个运算符是等价的都用于表示两个值不相等。同样地当比较的值中包含NULL时结果可能是不确定的在某些数据库系统中NULL与任何值的不等于比较结果都是NULL。BETWEEN a0 AND a1范围匹配运算符。如果某个值在a0和a1之间包括a0和a1则结果为TRUE。IN(option1, option2, …) 用于判断某个值是否在一组给定的选项中。如果值在选项中则结果为TRUE。 IS NULL用于判断某个值是否为NULL。如果是则结果为TRUE。IS NOT NULL用于判断某个值是否不为NULL。如果不为NULL则结果为TRUE。LIKE模糊匹配运算符。通常与通配符一起使用如%表示任意多个字符和_表示任意一个字符。 逻辑运算符 运算符说明AND逻辑与运算符。只有当所有条件都为TRUE时结果才为TRUE。OR逻辑或运算符。只要有一个条件为TRUE结果就为TRUE。NOT逻辑非运算符。用于反转条件的布尔值。如果条件为TRUE则结果为FALSE如果条件为FALSE则结果为TRUE。
下面我们来做一些案例帮助我们理解并掌握这些运算符
为了方便我们进行演示下面创建一个成绩表表当中包含自增长的主键id、姓名、以及该同学的语文成绩、数学成绩和英语成绩。如下
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT 同学姓名,
chinese float DEFAULT 0.0 COMMENT 语文成绩,
math float DEFAULT 0.0 COMMENT 数学成绩,
english float DEFAULT 0.0 COMMENT 英语成绩
);接下来向表中插入几条测试记录以供我们进行查找。如下
INSERT INTO exam_result (name, chinese, math, english) VALUES
(唐三藏, 67, 98, 56),
(孙悟空, 87, 78, 77),
(猪悟能, 88, 98, 90),
(曹孟德, 82, 84, 67),
(刘玄德, 55, 85, 45),
(孙权, 70, 73, 78),
(宋公明, 75, 65, 30);2.1.查询英语不及格的同学及其英语成绩 在where子句中指明筛选条件为英语成绩小于60我们直接使用运算符即可。如下
select name, english from exam_result where english 60;2.2.查询语文成绩在80到90分的同学及其语文成绩
在where子句中指明筛选条件为语文成绩然后根据分数直接80 90即可然后根据其并列关系条件我们选择and逻辑运算符进行连接 。如下
select name, chinese from exam_result where chinese 80 and chinese 90;此外这里也可以使用BETWEEN a0 AND a1来指明语文成绩的的所在区间。如下
select name, chinese from exam_result where chinese between 80 and 90;2.3.数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
在where子句中指明筛选条件为数学成绩等于58或59或98或99在select的column列表中指明要查询的列为姓名和数学成绩。如下
select name ,math from exam_result where math58 or math59 or math98 or math99; 此外这里也可以通过IN(58, 59, 98, 99)的方式来判断数学成绩是否符合筛选要求。如下
select name, math from exam_result where math in (58,59,98,99);2.4.姓孙的同学 及 孙某同学
查询姓孙的同学
这里给出的查询条件是模糊条件所以在where子句中通过模糊匹配来判断当前同学是否姓孙需要用到%来匹配多个字符在select的column列表中指明要查询的列为姓名。如下
select name from exam_result where name like 孙%;查询孙某同学只查询孙x而不查询孙xx
这里给出的查询条件是同样是模糊条件在where子句中通过模糊匹配来判断当前同学是否为孙某需要用到_来严格匹配单个字符在select的column列表中指明要查询的列为姓名。如下
select name from exam_result where name like 孙_;2.5.查询语文成绩好于英语成绩的同学
在where子句中指明筛选条件为语文成绩英语成绩在select的column列表中指明要查询的列为姓名、语文成绩和英语成绩。如下
select name,chinese, english from exam_result where chinese english;2.6.查询总成绩在200分以下的同学
在select的column列表中添加表达式查询查询的表达式为语文、数学和英语成绩之和为了方便观察可以将表达式对应的列指定别名为“总分”在where子句中指明筛选条件为三科成绩之和小于200。如下
select name, chinese, math, english, chinesemathenglish as 总分 from exam_result where 总分 200;我们执行起来怎么出现错误了 因为前面我们说过where子句的执行顺序是在select之前的而我们是在select时才进行了取别名所以where子句中的总分字段找不到因此报错。 而且我们的where子句中也不支持起别名。所以我们只能完整写出
select name, chinese, math, english , chinesemathenglish 总分 from exam_result where chinesemathenglish 200;注意点在where子句中不能使用select中指定的别名
查询数据时是先根据where子句筛选出符合条件的记录。然后再将符合条件的记录作为数据源来依次执行select语句。
2.7.语文成绩 80 并且不姓孙的同学
在where子句中指明筛选条件为语文成绩大于80并且and连接下一个条件再通过模糊匹配和not否定来保证该同学不姓孙在select的column列表中指明要查询的列为姓名和语文成绩。如下
select name, chinese from exam_result where chinese 80 and name not like 孙%;2.8.孙某同学否则要求总成绩 200 并且 语文成绩 数学成绩 并且 英语成绩 80
很显然该题目是一个使用or逻辑运算符的多选题目要求是查询成绩被查询的人要么是孙某要么总成绩大于200分并且语文成绩小于数学成绩并且英语成绩大于80分查询时需要用到模糊匹配、表达式查询和逻辑运算符。如下
select name chinese,math,english, chinese math english as 总分 from exam_result
where name like 孙_ or (chinesemathenglish200 and chinese math and english 80);2.9.NULL的查询 在SQL中检查一个字段是否为NULL时不能使用等于或不等于运算符因为NULL表示未知值并且任何与NULL的比较都会返回NULL即未知而不是TRUE或FALSE。 为了方便进行演示下面创建一个学生表表当中包含自增长的主键id、学号、姓名和QQ号。如下
create table students(
id int unsigned primary key auto_increment,
sn int unsigned not null unique comment 学号,
name varchar(20) not null comment 姓名,
qq varchar(15) unique comment qq号码
);desc students; 接下来我们插入数据
INSERT INTO students (id, sn, name) VALUES
(99, 100, 唐僧),
(102, 123, 曹操),
(103, 187, 刘备),
(105, 1023, 孙行者); 这里我们将数据进行一下更新给孙行者添加一下qq号。
update students set qq1111111 where name孙行者; 2.9.1. 查询 qq 号已知的同学姓名
qq号已知即qq号不为空所以我们需要在where子句中指明筛选条件为QQ号不为NULL在select的column列表中指明要查询的列为姓名和QQ号。如下
select name, qq from students where qq is not null;2.9.2.查询QQ号未知的同学
qq号未知即qq号为空所以我们需要在where子句中指明筛选条件为QQ号为NULL在select的column列表中指明要查询的列为姓名和QQ号。如下
select name, qq from students where qq is null;当然这里也可以使用来进行判断 但需要注意的是在与NULL值作比较的时候应该使用运算符使用运算符无法得到正确的查询结果。如下
select name, qq from students where qq null;注意运算符在标准SQL中并不存在尽管在某些数据库系统中如MySQL它可能作为NULL-safe equal to运算符存在用于比较两个值如果它们相等或都为NULL则返回TRUE ——我们要尽量少用 select name, qq from students where qq null; 对于qq NULL这永远不会返回任何结果因为任何与NULL的比较使用、、、等运算符都会返回NULL而不是TRUE或FALSE而在WHERE子句中只有TRUE条件才会导致行被选中。因此应该始终使用IS NOT NULL来检查非NULL值。
3.结果排序
有些时候我们对我们查找到的数据可能要进行一下排序于是这里我们就要学习一下MySQL怎么对结果进行排序了。
结果排序的SQL如下
SELECT ... FROM table_name [WHERE ...] ORDER BY column1 [ASC | DESC] [, column2 [ASC | DESC] ...];
SQL中大写的表示关键字[ ]中代表的是可选项。SELECT ...: 指定您希望从表中检索的列。FROM table_name: 指定您要从中检索数据的表。[WHERE ...]: 是一个可选子句用于指定检索数据的条件。ORDER BY column1 [ASC | DESC]: 指定要按照哪个列对结果进行排序。ASC表示升序从小到大DESC表示降序从大到小。如果省略排序方向则默认为ASC。[, column2 [ASC | DESC] ...]: 您可以指定多个列进行排序。当指定多个列时MySQL会首先按照第一列的值进行排序如果第一列的值相同则按照第二列的值进行排序以此类推。 注意 如果查询SQL中没有order by子句那么返回的顺序是未定义的。 下面我们来进行一些简单的练习
3.1. 同学及数学成绩按数学成绩升序显示
在select的column列表中指明要查询的列为姓名和数学成绩在order by子句中指明按照数学成绩进行升序排序。如下
select name, math from exam_result order by math asc;当然我们也还可以省略order by 最后的asc默认就是升序但是这样的写法还是不太建议。
select name, math from exam_result order by math; 3.2.查询同学及其QQ号按QQ号排序显示
升序
这个需求也很简单我们只需要对qq进行order by asc就行了但是别忘了我们的students表中的qq有的是null那么结果会是什么呢
select name, qq from students order by qq asc;可以看出在MySQL中默认null是比任何数据都要小的
降序 null在下面结果符合我们的预期
3.3.查询同学各门成绩依次按 数学降序英语升序语文升序的方式显示
为了方便我们进行演示下面创建一个成绩表表当中包含自增长的主键id、姓名、以及该同学的语文成绩、数学成绩和英语成绩。如下
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT 同学姓名,
chinese float DEFAULT 0.0 COMMENT 语文成绩,
math float DEFAULT 0.0 COMMENT 数学成绩,
english float DEFAULT 0.0 COMMENT 英语成绩
);
INSERT INTO exam_result (name, chinese, math, english) VALUES
(唐三藏, 67, 98, 56),
(孙悟空, 87, 78, 77),
(猪悟能, 88, 98, 90),
(曹孟德, 82, 84, 67),
(刘玄德, 55, 85, 45),
(孙权, 70, 73, 78),
(宋公明, 75, 65, 30); 我们现在就要查询同学各门成绩依次按 数学降序英语升序语文升序的方式显示 当在SQL查询中使用ORDER BY子句对结果进行排序时如果某一列中存在相同的值我们可以指定额外的列来进一步确定这些具有相同值的行的相对顺序。这不需要使用OR逻辑运算符来连接条件而是直接在ORDER BY子句中列出要排序的列并指定每列的排序方向升序ASC或降序DESC。 以下是一个具体的例子说明如何按照数学成绩降序、英语成绩升序和语文成绩升序对学生进行排序 SELECT id, name, math_score, english_score, chinese_score
FROM students
ORDER BY math_score DESC, english_score ASC, chinese_score ASC; 在这个查询中 首先MySQL会按照math_score列的值进行降序排序。如果两行具有相同的math_score值则MySQL会进一步按照english_score列的值进行升序排序。如果两行具有相同的math_score和english_score值则最后会按照chinese_score列的值进行升序排序。 由于排序中可能存在相同值于是我们就要再进行比较其他列来确定最后的相对排序了。
排序这里我们不需要使用or来连接多个条件在order by子句中指明依次按照数学成绩排降序、英语成绩排升序和语文成绩排升序。
在select的column列表中指明要查询的列为姓名、数学成绩、英语成绩和语文成绩如下
select name,math,english,chinese from exam_result order by math desc,english asc,chinese asc; 说明
order by子句中可以指明按照多个字段进行排序每个字段都可以指明按照升序或降序进行排序各个字段之间使用逗号隔开排序优先级与书写顺序相同。例如上述SQL中当两条记录的数学成绩相同时就会按照英语成绩进行排序如果这两条记录的英语成绩也相同就会继续按照语文成绩进行排序以此类推。
3.4.查询同学及总分由高到低
在select的column列表中指明要查询的列为姓名和总分在order by子句中指明按照总分进行降序排序。如下
select name, chinese math english as 总分 from exam_result order by 总分 desc;那么这里的别名为什么我们order by中能够使用呢
因为只有有了数据才能对数据进行排序所以order by子句的执行的优先级是非常低的所以order by能够使用select 中的别名。
查询数据时是先根据where子句筛选出符合条件的记录。然后再将符合条件的记录作为数据源来依次执行select语句。最后再通过order by子句对select语句的执行结果进行排序。
也就是说order by子句的执行是在select语句之后的所以在order by子句中可以使用别名。 3.5.查询姓孙的同学或姓曹的同学及其数学成绩按数学成绩降序显示
由于这里要排序的不是所有数据所以这里面我们要结合 where 子句 和 order by子句。
这里我们先通过where子句模糊匹配找到人
select name, math from exam_result where name like 孙% or name like 曹%; 当查询到目标数据后再在查询SQL后添加order by子句在order by子句中指明按照数学成绩进行降序排序。如下
select name, math from exam_result where name like 孙% or name like 曹% order by math desc;4.筛选分页结果
有时候我们即使经过了数据的筛选但是数据依然很多如果我们直接查看的话是不利于我们进行操作的所以有时候我们还要对我们的数据进行分页显示。
筛选分页结果的语法如下
从第0条记录开始向后筛选出n条记录
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
这是最基本的分页查询其中LIMIT n表示从查询结果中返回前n条记录。由于记录的下标从0开始因此这实际上会返回第0条到第n-1条记录。
从第s条记录开始向后筛选出n条记录旧语法
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
这种语法允许您跳过前s条记录并从第s1条记录开始返回n条记录。但需要注意的是随着数据库版本的更新一些数据库系统如MySQL 8.0及以上版本已经弃用了这种带两个参数的LIMIT语法转而推荐使用LIMIT n OFFSET s。
从第s条记录开始向后筛选出n条记录新语法
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s; 这是推荐的分页查询语法其中LIMIT n表示要返回的记录数而OFFSET s表示要跳过的记录数。这样您就可以从第s1条记录开始返回n条记录了。
说明
SQL中大写的表示关键字[ ]中代表的是可选项。查询SQL中各语句的执行顺序为where、select、order by、limit。limit子句在筛选记录时记录的下标从0开始。
建议
对未知表进行查询时最好在查询SQL后加上limit 1避免在查询全表数据时因为表中数据过大而导致数据库卡死。 例、按 id 进行分页每页 3 条记录分别显示 第 1、2、3 页
我们先来看一看所有的数据 查询第1页记录时在查询全表数据的SQL后加上limit 3子句表示从第0条向后筛选出3条记录。如下
select * from exam_result limit 3;现在我们完成了第一页的显示但是我们要进行第二页的显示时我们就要指明起始位置为3了于是我们的limit子句就要变成了limit 3,3。
select * from exam_result limit 3,3; 最后一页同理我们可以使用limit 6,3也可以使用 limit 3 offset 6表明从第6条记录开始向后筛选出3条记录。如下
select * from exam_result limit 3 offset 6;因为从表中筛选出的记录不足3个所以筛选出几个就显示几个。