MySQL入门(6)—— 基于datagrip的SQL数据查询

目录

  • 一、准备工作
    • 1、数据准备
    • 2、执行界面准备
    • 3、数据修改准备
  • 二、查询
    • 1、语法
    • 2、简单查询
    • 3、条数限制查询
    • 4、排序
    • 5、条件查询
    • 6、模糊查询
    • 7、正则表达式

一、准备工作

1、数据准备

将文件里的数据先复制到datagrip执行,建好表

学习本章节的数据资料
MySQL入门(6)—— 基于datagrip的SQL数据查询_第1张图片

2、执行界面准备

如果你的执行界面不小心关闭成了这样
MySQL入门(6)—— 基于datagrip的SQL数据查询_第2张图片
可以这样操作:
MySQL入门(6)—— 基于datagrip的SQL数据查询_第3张图片
MySQL入门(6)—— 基于datagrip的SQL数据查询_第4张图片
就可以打开你刚才执行的界面啦

3、数据修改准备

如果你没有记住修改表中数据的命令,那你可以直接在表中修改,修改结束以后点击绿色的上传图标即可,这就是图形化工具的好处

MySQL入门(6)—— 基于datagrip的SQL数据查询_第5张图片

二、查询

1、语法

select [distinct]    #distinct可写可不写
* | 列名,列名
fromwhere 条件;

2、简单查询

以上面准备的数据为例子
MySQL入门(6)—— 基于datagrip的SQL数据查询_第6张图片

# 1、查询所有的商品
SELECT * FROM products;  
# * 是一个通配符,它和查询所有的列,效果是一样的
# 但底层数据执行的时候,效率是不一样的,所以项目开发时,一般都写出所有的列,而不用*

# 2、查询单个列:从products表中查询所有的产品名称(prod_name)
SELECT prod_name FROM products;

# 3、全限定列名和全限定表名
SELECT products.prod_name FROM mydb1.products;

# 4、查询多个列:从products表中查询产品id(prod_id)、产品名称(prod_name)、产品价格(prod_price)
SELECT prod_id,prod_name,prod_price FROM products;

# 5、在 vend_id 列有很多重复值,如何去除重复值,让每一种厂商的id只保留一份呢?
SELECT DISTINCT vend_id FROM products;
# 注意:DISTINCT关键字应用于所有列而不仅是跟它挨着的列。

3、条数限制查询

limit是MySQL特有的语法,其作用是用于限制查询结果的条数。格式:

select 列名 from 表名 limit [m,n]

不写m的时候,返回前n条数据。写m的时候,数据库会从 行m 开始,返回n条数据;
注意,MySQL中行号是从0开始的,也就是说第一条数据,是行0,而不是行1

(1)简单查询

# 查询前3条产品名称
SELECT prod_name FROM products LIMIT 3;
# 从第二条开始查询,取5条数据
SELECT prod_name FROM products LIMIT 1,5;
# 取出第3条至第6条,4条记录
select * from tablename limit 2,4

(2)Limit 做分页

分页查询格式:

SELECT * FROM 表名 LIMIT startRow,pageSize;

例如:

select * from products limit 0,5; #第一页,每页显示5条。
select * from products limit 5,5; #第二页,每页显示5条。
select * from products limit 10,5; #第三页,每页显示5条。

还有:

select * from products limit startRow,5; #第curPage页,每页显示5条

startRow的值如何计算呢?
– 后台计算出页码、页数(页大小)
– 分页需要的相关数据结果分析如下,
– 注意:下面是伪代码不用于执行

int curPage = 2; -- 当前页数
int pageSize = 5; -- 每页显示数量
int startRow = (curPage - 1) * pageSize; -- 当前页, 记录开始的位置(行数)计算
int totalSize = select count(*) from products; -- 记录总数量
int totalPage = Math.ceil(totalSize * 1.0 / pageSize); -- 总页数

4、排序

关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。
也就是说,如果不对查询结果进行排序,数据库是不保证查询的结果是有序的。如何进行排序呢?
通过order by语句,可以将查询出的结果进行排序。格式:

SELECT 列名,... FROM 表名 ORDER BY 排序字段 ASC|DESC;
# ASC 升序 (默认), 从小到大排序
# DESC 降序, 从大到小排序

(1)单列排序:查询商品表,并按价格进行递增、递减排序

SELECT prod_id,prod_name ,prod_price FROM products ORDER BY prod_price;
SELECT prod_id,prod_name ,prod_price FROM products ORDER BY prod_price DESC ;

(2)中文排序:查询商品表,并按商品名称进行排序 对中文进行排序 ,格式:

SELECT * FROM 表名 ORDER BY CONVERT(排序列名 USING gbk) ASC|DESC;
SELECT prod_id, prod_name FROM products ORDER BY CONVERT(prod_name USING gbk) ;

(3) 多列排序:如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。

#先按供应商id排序,再按产品价格排序
SELECT vend_id,prod_price FROM products ORDER BY vend_id,prod_price ;
# 先按供应商id降序,再按产品价格升序
SELECT vend_id,prod_price FROM products ORDER BY vend_id DESC ,prod_price ;

(4)用order by 和 limit 的组合找出最贵的三件商品名称

SELECT prod_name,prod_price FROM products ORDER BY prod_price DESC LIMIT 3;

5、条件查询

比较运算符 < 、>、<=、>=、= 、<>、!= 小于、大于、小于等于、大于等于、不等于、不等于
\ BETWEEN…AND… 显示在某一区间的值(含头含尾)
\ IN(set) 显示在in列表中的值,例:in(100,200)
\ LIKE ‘字符’ 模糊查询,like语句中,% 代表零个或多个任意字符,_ 代表一个字符, 例如:first_name like ‘_a%’;
\ IS NULL 判断是否为空
逻辑运行符 and 多个条件同时成立
\ or 多个条件任一成立
\ not 不成立,例:WHERE vend_id NOT IN(1001,1002);
# 查询价格为55.00的商品名称和价格
SELECT prod_name,prod_price FROM products WHERE prod_price=55.00;

# 查询价格不等于55.00的商品名称和价格
SELECT prod_name,prod_price FROM products WHERE prod_price!=55.00;
SELECT prod_name,prod_price FROM products WHERE prod_price<>55.00;

# 查询价格在5-10元之间的商品名称和价格
SELECT prod_name,prod_price FROM products WHERE prod_price>=5.00 AND prod_price<=10.00;
SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5.00 AND 10.00;

# 查询产品描述为null的商品名称和商品描述
SELECT prod_name,prod_desc FROM products WHERE prod_desc IS NULL ;

# 查询产品描述不为null的商品名称和商品描述
SELECT prod_name,prod_desc FROM products WHERE prod_desc IS NOT NULL ;

# 查询供应商id为1001 或者1002的商品名称、供应商id、商品价格
SELECT prod_name,vend_id,prod_price FROM products WHERE vend_id =1001 OR vend_id=1002;

# 查询供应商id为1001 或者1002的商品名称、供应商id、商品价格 并且价格大于10元 
# 注意优先级,and优先级大于or
SELECT prod_name,vend_id,prod_price FROM products WHERE vend_id =1001 OR vend_id=1002 AND prod_price>10;

# 查询供应商id为1001 或者1002的商品名称、供应商id、商品价格 ---用in() 实现
SELECT prod_name,vend_id,prod_price FROM products WHERE vend_id IN (1001,1002);
# 注意:in() 和 or 的作用差不多,但in()更强大,因为in里面可以包含其他select语句。

# 查询供应商id不为1001 或者1002的商品名称、供应商id、商品价格 ---用not in() 实现
SELECT prod_name,vend_id,prod_price FROM products WHERE vend_id NOT IN(1001,1002);
# 注意:MySQL支持使用NOT对IN、BETWEEN和 EXISTS子句取反 ,EXISTS子句后面会讲。

6、模糊查询

格式如下:(语句中,% 代表零个或多个任意字符,_ 代表一个字符)

SELECT 列名,... FROM 表名 WHERE 列名 LIKE 条件;

例1:查询产品名称中 i 开头的产品名称

SELECT prod_name FROM products WHERE prod_name LIKE 'i%';

注意事项一:
MySQL默认是不区分大小写的,所以查询小写 i , 大写 I 也会被查询出来
如果想区分大小写有两种方式
第一种是修改表结构,字段后面加 binary 关键字,但修改表结构一般不推荐
第二种是在SQL语句中添加 BINARY 格式:SELECT 列名 FROM 表名 WHERE BINARY 列名 LIKE '字符';

SELECT prod_name FROM products WHERE BINARY prod_name LIKE 'i%';

注意事项二:
% 可以匹配0到多个字符,但不能匹配 null

SELECT * FROM products WHERE prod_desc LIKE '%';

例2:查询产品名称中第二个字是‘王’的产品

SELECT * FROM products WHERE prod_name LIKE '_王%';

注意事项:
通配符虽然好用,但不要滥用,尽量不要把%放在最前面,比如:where like ‘%王’。因为这也搜索效率会很慢,具体原因,进阶阶段再深入探讨。

7、正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

比如判断用户输入的邮箱格式是否合法,可以使用正则表达式。判断用户密码是否包含特殊字符,可以使用正则表达式。想从一个文本文件中提取电话号码,可以使用正则表达式。

如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式,格式:

SELECT 列名 FROM 表名 WHERE 列名 REGEXP '条件';

(1)查询产品名称中包含“水”或者“40” 这两个字的产品名称 – 用 正则表达式 |

SELECT prod_name FROM products WHERE prod_name REGEXP '水|40';

(2)查询产品名称中包好字母的产品名称

SELECT prod_name FROM products WHERE prod_name REGEXP '[a-z]';

你可能感兴趣的:(数据库,数据库,mysql,sql,datagrip)