首先创建表
CREATE TABLE `fruits1` (
`f_id` CHAR(10) NOT NULL,
`s_id` INT(11) NOT NULL,
`f_name` CHAR(30) NOT NULL,
`f_price` DECIMAL(8,2) NOT NULL,
PRIMARY KEY (`f_id`)
);
1.单表查询
**1.1查询所有字段**,在SELECT 语句中使用(*)通配符查询所有字段。
语法格式如下:
**select * from 表名;**
1.2查询指定字段
查询表中的某一个字段,语法格式为:
SELECT 查询的列名 FROM 表名;
1.3查询多个字段
语法:SELECT 查询的列名1,查询的列名2,...查询的列名N FROM 表名;
1.4查询指定记录
在SELECT语句中可以使用WHERE 子句可以对数据进行过滤,语法如下:
SELECT 字段1,字段2,....,字段N;
FROM 表名
WHERE 查询条件
注:WHERE 条件判断符------》等于”=“,不相等”<>“,”!=“,小于”<“,大于”>“,大于等于”>=“,小于或者等于"<=",BETWEEN"位于两值之间"
1.5带IN的关键字查询
IN操作符用来查询满足指定范围内的条件的记录,使用IN操作符,将所有的检索条件用括号括起来,检索条件之间用逗号隔开,只要满足条件范围内的一个值即为匹配项
例:查询A表中的a.id为100,200,的记录,语句如下
SELECT * FROM A WHERE a.id IN (100,200);
相反可以使用Not查询不再范围内的
SELECT * FROM A WHERE a.id NOT IN (100,200);
1.6带BETWEEN AND 的范围查询
BETWEEN AND用来查询某个范围内的值,该操作符需要两个参数,即范围的开始和结束值,如果字段值满足指定的范围的查询条件,则这些记录被返回。
1.7带LIKE的字符匹配查询
通配符是一种在sql的where条件子句中拥有特殊意思的字符,sql语句中支持多种通配符,可以和LIKE一起使用的通配符有“%”和“_”;
1.7.1百分号通配符“%”,匹配所有任意长度的字符,甚至包括零字符
例:查询所有以“b”字符开头的水果,sql语句如下
SELECT f_id,f_name FROM fruits WHERE f_name LIKE ‘b%’;
注:该语句查询结果返回所有以“b”开头的id和name,不管“b”后面有多少个字符。
在搜索匹配时通配符“%”可以放在任意位置。
例:查询f_name种包含g的记录,语句如下
SELECT f_id,f_name FROM fruits WHERE f_name LIKE ‘%g%’;
例::查询f_name种以b开头以y结尾的记录,语句如下:
SELECT f_id,f_name FROM fruits WHERE f_name LIKE ‘b%y’;
1.7.2 下划线通配符’‘ ,一次只能匹配任意一个字节
**"“与”%"的区别,”%“可以匹配多个字符,”“只能匹配单个字符,若要匹配多个字符,则需要使用多个”“;**
例:查询以字符y开头后面有三个字目的记录;
SELECT f_id,f_name FROM fruits WHERE f_name LIKE ‘y___’;
1.8 查询空值
注:空值不同于0,也不同于空字符串,在查询语句中使用IS NULL子句,查询某字段内为空的记录
创建表---》读者自行插入数据
CREATE TABLE `customers` (
`c_id` int(11) NOT NULL AUTO_INCREMENT,
`c_name` char(50) NOT NULL,
`c_address` char(50) NULL,
`c_city` char(50) NULL,
`c_zip` char(50) NULL,
`c_contact` char(5) NULL,
`c_email` char(50) NULL,
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
例:查询表中c_email 为空记录的c_id,c_name,c_email字段值;
SELECT c_id,c_name,c_email FROM customers WHERE c_email IS NULL;
注:与IS NULL 相反的是NOT IS NULL,该关键字查询不为空的记录;
例:查询表中c_email 不为空记录的c_id,c_name,c_email字段值;
SELECT c_id,c_name,c_email FROM customers WHERE c_email NOT IS NULL;
1.9带and的多条件查询
可以使用AND 连接两个甚至以上的条件。多个条件表达式之间用AND 分开。
例:
在fruits表中查询s_id=101,并且f_price大于等于5的水果价格和名称;
SELECT f_id,f_price,f_name FROM fruits WHERE s_id=10 AND f_price>=5;
1.10 带OR关键字的多条件查询
OR也可以连接两个甚至多个查询条件,多个条件表达式之间用OR分开
例:查询s_id=101或则s_id=102 的水果供应商的f_price,f_name;
SELECT sid,f_name,f_price FROM fruits WHERE s_id=101 OR s_id=102;
1.11查询结果不重复
在select 语句中可以使用DISTINCT 消除重复值的记录值,语法如下:
select DISTINCT 字段名 FROM 表明;
例:查询frutits表中s_id字段的值,返回s_id 字段值且不重复;
select DISTINCT s_id FROM fruits;
1.11 对查询结果排序
mysql语句中可以通过order by 子句,对查询的结果进行排序;
1.11.1 单列排序
例:查询fruits表的f_name 字段值,并对其排序
SELECT f_name FROM fruits ORDER BY f_name;
1.11.2 多列排序
例:查询fruits表的f_name ,f_price字段值,并对其先f_name,f_price排序
SELECT f_name,f_price FROM fruits ORDER BY f_name,f_price;
1.11.3 指定排序方向
默认情况,查询数据按字母升序进行排序(A-Z),还可以使用 order by 对查询结果进行降序(z-a),通过关键字DESC实现。
例:查询fruits表的f_name ,f_price字段值,并对其f_price降序排序
SELECT f_name,f_price FROM fruits ORDER BY f_price DESC;
例:查询fruits表的f_name ,f_price字段值,对f_price升序序排序,按f_name升序排序:
SELECT f_name,f_price FROM fruits ORDER BY f_price DESC,f_name;
1.12 分组查询
分组查询是对数据按照某个或多个字段进行分组,mysql中使用Group by 关键字对数据进行分组,基本语法如下:
【GROUP BY 字段】 【HAVING <条件表达式>】
字段值为纪念性分组是所依据的列名称:“HAVING <条件表达式>” 指定满足表达式限定条件的结果将被显示。
1.12.1 创建分组
GROUP BY 经常与集合函数一起使用:MAX(),MIN();COUNT();SUM();AVG();
例:根据s_id 对fruits 表中的数据进行分组,sql语句如下:
SELECT s_id,COUNT(*) AS Total FROM fruits GROUP BY s_id;
例:根据s_id 对fruits 表中的数据进行分组,将每个供应商的水果名称显示出来,sql语句如下:
SELECT s_id,GROUP_CONCAT(f_name) AS NAMES FROM fruits GROUP BY s_id;
注:group_concat()函数将每个分组中的名称显示出来了,和count()相同;
1.12.2 使用HAVING 过滤分组
GROUP BY可以和HAVING 一起限定显示记录所需满足的条件,只有满足条件的分组才会被显示出来
例:根据s_id 对fruits 表中的数据进行分组,并显示水果种类大于1的分组信息,sql语句如下:
SELECT s_id,GROUP_CONCAT(f_name) AS NAMES FROM fruits GROUP BY s_id HAVING COUNT(f_name)>1;
知识点:HAVING关键字和Where 关键字都是用来过滤数据,两者什么区别?
HAVING在数据分组之后进行过滤来选择分组。
WHERE在分组之前用来选择记录。
另外where 排出的记录不在包括在分组中。
1.12.3 在GROUP BY 子句张使用WITH ROLLUP
使用WITH ROLLUP 关键字之后,在所有查出的记录之后增加一条记录,该记录查询出所有记录的总和,即统计记录数量。
例:根据s_id 对fruits 表中的数据进行分组,并显示记录数量,sql语句如下:
SELECT s_id,COUNT(*) AS Total FROM fruits GROUP BY s_id WITH ROLLUP;
1.12.4 多字段分组
使用GROUP by 进行多字段分组,关键字后面跟需要分组的字段,分组层次从左到右
例:根据s_id 和f_name对fruits 表中的数据进行分组,并显示记录数量,sql语句如下:
SELECT * FROM fruits GROUP BY s_id,f_name;
1.12.5 GROUP BY 和ORDER BY 一起使用
首先创建表-》读者可以自行插入数据
CREATE TABLE `orderitems` (
`o_num` int(11) NOT NULL,
`o_item` int(11) NOT NULL,
`f_id` char(10) NOT NULL,
`quantity` int(11) NOT NULL,
`item_price` decimal(8,2) NOT NULL,
PRIMARY KEY (`o_num`,`o_item`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
例:查询订单价格大于100的订单号和总订单价格,sql语句如下
SELECT o_num,SUM(quantity * item_price) AS orderTotal FROM orderitems GROUP BY o_num HAVING SUM(quantity*item_price) >=100 ORDER BY orderTotal;
注:GROUP BY子句按订单号对数据进行分组,sum()函数便可以返回总订单价格,HAVING()子句对分组数据进行过滤,使用order by 进行排序。
ROLLUP与ORDER BY子句相互排斥,不能同时使用;
1.12.6 使用LIMIT限制查询结果的数量(分页查询)
使用LIMIT 关键字 语法如下:
LIMIT [位置偏移量,] 行数
例:显示fruits 表查询结果的前四行:
SELECT * FROM fruits LIMIT 4;
注:mysql查询下表第一个数代表0,即是和数组一样查询从零开始。
例:显示fruits 表查询结果返回第五个开始,长度为三的记录:
SELECT * FROM fruits LIMIT 4,3;
1.13 使用集合函数查询
| 函数 | 作用 |
| AVG() | 平均值 |
| COUNT() | 行数 |
| MAX() | 最大值 |
| MIN() |- 最小值 - |
| SUM() | 求和 |
1.13.1 COUNT()函数
- COUNT(*)计算表中总的行数,不管某列有数值或者为空值
- COUNT(字段名) 计算指定列下总的行数,计算时将忽略空值的行。
例:查询customers表中的总的行数
SELECT COUNT(*) FROM AS cust_num FROM customers;
例:查询customers表中的电子邮箱的行数
SELECT COUNT(c_email) FROM AS email_num FROM customers;
例:查询customers表中使用COUNT() 函数统计不同订单号中订购的水果种类 ,sql语句如下:
SELECT o_num,COUNT(f_id) FROM orderitems GROUP BY o_num;
1.13.2 sum()函数
sum()函数是一个求和函数,返回指定列值的总和。
例:在orderitems表中查询30005号订单的水果总量;
SELECT SUM(quantity) AS item_total FROM orderitems WHERE o_num=30005;
例:在orderitems表中使用sum()统计不同订单中订购的水果总量:
SELECT o_num,SUM(quantity) AS item_total FROM orderitems GROUP BY o_num;
1.13.3 AVG()函数
AVG函数 通过计算返回的行数和每一行数据的和,求得指定列数据的平均值
例:在fritus 表中,查询s_id=103的供应商的水果价格的平均值,sql语句如下:
SELECT AVG(f_price) AS avg_price FROM fruits WHERE s_id=103;
AVG可以与GROUP BY一起使用,计算每个分组的平均值;
例:在fritus 表中,查询每一个供应商的水果价格的平均值,sql语句如下:
SELECT s_id,AVG(f_price) AS avg_price FROM fruits GROUP BY s_id
1.13.4 MAX()函数
MAX()函数返回指定列的最大值
例:在fruits 表中查询价格最大的水果
SELECT MAX(f_price) AS max_price FROM fruits
max()也可以和GROUP BY 关键字一起使用,求每个分组中的最大值。
SELECT s_id,MAX(f_price) AS max_price FROM fruits GROUP BY s_id