从零开始学后端(2)——MySql常用语句

这里写图片描述

简单查询

语法:
SELECT  {*, column [alias],...}
FROM    table_name;
SELECT               <select_list>
FROM    table_name;

说明:
SELECT   选择查询列表
FROM    提供数据源(表、视图或其他的数据源)

*表示表中所有的列,但是 * 和创建表时的顺序一致。
可以自己调整顺序,在select后边加上要查询的列名。
------------------------------------------------------------
需求:查询所有货品信息
需求:查询所有货品的id,productName,salePrice
避免重复数据-DISTINCT:
需求:查询商品的分类编号。
语法:
SELECT  DISTINCK 列名,...
FROM    table_name;----------------------------------------------------------------------------------------------
实现数学运算查询:
对NUMBER型数据(整数和小数)可以使用算数操作符创建表达式(+  -  *  /)
对DATE型数据可以使用部分算数操作符创建表达式 (+  -)
运算符优先级:
1、乘法和除法的优先级高于加法和减法
2、同级运算的顺序是从左到右
3、表达式中使用"括号"可强行改变优先级的运算顺序
-----------------------------------------------------------------
需求:查询所有货品的id,名称和批发价(批发价=卖价*折扣)
需求:查询所有货品的id,名称,和各进50个的成本价(成本=costPirce)
需求:查询所有货品的id,名称,各进50个,并且每个运费1元的成本
设置列名的别名。
1、改变列的标题头;
2、用于表示计算结果的含义;
3、作为列的别名;
4、如果别名中使用特殊字符,或者是强制大小写敏感,或有空格时,都需加单引号;
`
不建议列的别名使用单引号,因为一旦使用,该列就不能再排序了.
需求:查询所有货品的id,名称,各进50个,并且每个运费1元的成本(使用别名)

SELECT id,productName,costPrice,(costPrice + 1)  * 50 AS totalCostPrice FROM product
AS可以省略:
SELECT id,productName,costPrice,(costPrice + 1)  * 50  totalCostPrice FROM product
设置显示格式查询:
为方便用户浏览查询的结果数据,有时需要设置显示格式,可以使用CONCAT函数来连接字符串。
需求:查询商品的名字和零售价。
     格式:xxx商品的零售价为:xxx
SELECT CONCAT(productName,'商品的零售价为:',salePrice) AS productSalePrice FROM product;

过滤查询

使用WHERE子句限定返回的记录:
语法:
SELECT               <selectList> 
FROM    table_name
WHERE   条件1   AND/OR  条件2;

注意:WHERE子句在 FROM 子句后

SQL的各个子句执行先后顺序:
1):FROM 子句: 确定了从哪一张表中去做查询.
2):WHERE子句:从表中直接筛选出符合条件数据.
3):SELECT子句:从筛选之后的结果集中显示出某些列.
4):ORDER BY子句:对查询结果做排序操作

比较运算符:

运算符            含义

=                  等于
>                  大于
>=                 大于或等于
<                  小于
<=                 小于或等于
!=(<>)                 不等于

需求: 查询货品零售价为119的所有货品信息.
需求: 查询货品名为罗技G9X的所有货品信息.
需求: 查询货品名 不为 罗技G9X的所有货品信息.
需求: 查询分类编号不等于2的货品信息
需求: 查询货品名称,零售价小于等于200的货品
需求: 查询id,货品名称,批发价大于350的货品
思考:使用where后面使用别名不行,总结select和where的执行顺序
注意:字符串和日期要用单引号扩起来.
要让MySQL查询区分大小写,可以:

SELECT * FROM table_name WHERE BINARY productName='g9x'
SELECT * FROM table_name WHERE BINARY productName='G9X'

逻辑运算符:

运算符             含义

AND(&&)          如果组合的条件都是TRUE,返回TRUE
OR(||)           如果组合的条件之一是TRUE,返回TRUE
NOT(!)           如果下面的条件是FALSE,返回TRUE`

需求: 选择id,货品名称,批发价在300-400之间的货品
需求: 选择id,货品名称,分类编号为2,4的所有货品
需求: 选择id,货品名词,分类编号不为2的所有商品
需求: 选择id,货品名称,分类编号的货品零售价大于等于250或者是成本大于等于200

如果有多个查询条件,尽量把过滤最多的条件放在 WHERE之后,提高性能.

优先级         运算符
------------------------------------
1               所有比较运算符
2               NOT
3               AND
4               OR

注意:括号将跨越所有优先级规则

分析SQL:
SELECT id,productName FROM product WHERE     ((NOT productName = 'M')  AND salePrice > 100  )    OR      (dir_id = 2)
范围查询-BETWEEN AND:
使用BETWEEN运算符显示某一值域范围的记录,这个操作符最常见的使用在数字类型/日期类型数据的范围上,但对于字符类型数据和日期类型数据同样可用。
格式:
SELECT *  FROM table_name  WHERE 列名 BETWEEN  最小值 AND  最大值:闭区间。
需求: 选择id,货品名称,批发价在300-400之间的货品
需求: 选择id,货品名称,批发价不在300-400之间的货品
--------------------------------------------------------------------
使用IN运算符,判断列的值是否在指定的集合中。
格式:SELECT *  FROM  table_name   WHERE 列名 IN (值1,值2....);
需求:选择id,货品名称,分类编号为2,4的所有货品
需求:选择id,货品名称,分类编号不为2,4的所有货品
空值查询-IS NULL:
NULL表示某一列没有数据,也不是空字符串.
IS NULL:判断列的值是否为空。
格式:WHERE  列名 IS NULL;
需求:查询商品名为NULL的所有商品信息。
-----------------------------------------------------------------------
模糊查询:
使用LIKE运算符执行通配查询,查询条件可包含文字字符或数字:
通配符表示匹配模式:
%通配符:可表示零或多个字符任意。
_通配符:可表示一个字符。
通配符:用来实现匹配部分值得特殊字符。'_木%'
-----------------------------------------------------
需求: 查询id,货品名称,货品名称匹配'%罗技M9_'
需求: 查询id,货品名称,分类编号,零售价大于等于200并且货品名称匹配'%罗技M1__'

结果排序

使用ORDER BY子句将查询记录进行排序,
ASC   : 升序,缺省。
DESC : 降序。
ORDER BY 子句出现在SELECT语句的最后。
格式:
SELECT <selectList> 
FROM table_name
WHERE 条件
ORDER BY 列名1 [ASC/DESC],列名2 [ASC/DESC]...;
-------------------------------------------------------
按单列排序:
需求:选择id,货品名称,分类编号,零售价并且按零售价降序排序
按多列排序:
需求: 选择id,货品名称,分类编号,零售价先按分类编号排序,再按零售价排序
------------------------------------------------------
需求:查询M系列并按照批发价排序(加上别名)
需求:查询分类为2并按照批发价排序(加上别名)

注意:不能使用中文的别名排序。
--------------------------------------------------------------------------
SELECT语句执行顺序:
先执行FROM--->接着执行WHERE--->再执行SELECT--->最后执行ORDER BY
--------------------------------------------------------------------------

分页查询

假分页/逻辑分页/内存分页:
            一次性查询出所有的数据,存放在内存中(List集合),每次翻页的时候,都从内存中取出指定的条数.
            特点:翻页比较快,如果数据量过大,可能造成内存溢出.
真分页/物理分页/数据库分页(推荐):
            每次翻页都从数据库中截取指定的条数,假设每页10条数据,第一页:查询0~9条数据,第二页:查询10~19条数据.
            特点:翻页比较慢,不会造成内存溢出.
---------------------------------------------------------------------------------------------------------
MySQL的分页设计:
             int pageSize = 3;//表示每页最多显示3条数据.
分页查询结果集的SQL:
       SELECT * FROM  表名    LIMIT  ?,?;
       第一个?:(currentPage - 1) * pageSize;
       第二个?:pageSize
第一页:SELECT * FROM `product` LIMIT 0, 3
第二页:SELECT * FROM `product` LIMIT 3, 3
第三页:SELECT * FROM `product` LIMIT 6, 3

聚集函数

什么是聚集函数:
聚集函数作用于一组数据,并对一组数据返回一个值。
-------------------------------------------------------
COUNT:统计结果记录数  
MAX:  统计计算最大值
MIN:  统计计算最小值
SUM:  统计计算求和
AVG:  统计计算平均值
-------------------------------------------------------
需求:查询所有商品平均零售价
需求:查询商品总记录数(注意在Java中必须使用long接收)
需求:查询分类为2的商品总数
需求:查询商品的最小零售价,最高零售价,以及所有商品零售价总和

多表查询

单表查询:从一张表中查询数据
多表查询:从多张表中联合查询出数据
------------------------------------
单表查询:
SELECT <selectList>
FROM  表名
------------------------------------
多表查询(最简单的):
SELECT <selectList>
FROM  表名A , 表名B
---------------------------------------------------------------------------
多表查询,如果没有连接条件,则会产生笛卡尔积:
数学中定义:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。
实际运行环境下,应避免使用全笛卡尔集。
需求:查询所有的货品信息+对应的货品分类信息
解决方案: 在WHERE加入有效的连接条件---->等值连接
注意:
连接 n张表,至少需要 n-1个连接条件。

这里写图片描述

外键约束

这里写图片描述

主键约束(PRIMARY KEY): 约束在当前表中,指定列的值非空且唯一.
外键约束(FOREIGN KEY): A表中的外键列的值必须引用于于B表中的某主键列.

为了保证数据的合理性,我们需要建立外键约束关系.
   规定: employee表中的deptno列的值,应该来源于department表中的主键列deptno,
             我们就把employee表中的deptno列称之为外键列.
------------------------------------------------------------------------------------------------------------
注意:在MySQL中,InnoDB支持事务和外键.
修改表的存储引擎为InnDB:
ALTER TABLE 表名 ENGINE='InnoDB';

这里写图片描述

这里写图片描述

一般的,我们在定义外键的时候,习惯这样来起名:
引用表名(缩写)_引用列名.
product /productdir表: 外键列:dir_id

在开放中,我们有时候为了提高性能会故意删除外键约束,此时我们可以通过Java代码来控制数据的合理性.

InnoDB存储引擎,支持外键又支持事务.

多表查询

这里写图片描述

内连接查询:是相对于外连接。
内连接分为:隐式内连接、显示内连接,其查询效果相同。

隐式内连接:
SELECT
FROM A ,B WHERE A.列 = B.列

显示内连接(推荐写法):.
SELECT
FROM A [INNER] JOIN B ON A.列 = B.列

需求:查询所有商品的名称和分类名称:

使用表名前缀在多个表中区分相同的列。
在不同表中具有相同列名的列可以用表的别名加以区分。
使用别名可以简化查询。
使用表名前缀可以提高执行效率。
如果使用了表的别名,则不能再使用表的真名

需求: 查询货品id,货品名称,货品所属分类名称
需求: 查询零售价大于200的无线鼠标
需求: 查询零售价大于200的无线鼠标(使用表的别名)
需求: 查询每个货品对应的分类以及对应的库存
需求: 如果库存货品都销售完成,按照利润从高到低查询货品名称,零售价,货品分类(三张表).

操作数据(DML)

DDL语句:操作之后什么都不返回.
DQL语句:操作之后会返回一个查询的结果集.
DML语句:操作之后会返回一个受影响的行数(成功操作几条数据).
------------------------------------------------------
插入操作:
插入语句:一次插入操作只插入一行数据.
INSERT       INTO    table_name (column1,column2,column3...)
VALUES      (value1,value2,value3...);
-------------------------------------------
1.插入完整数据记录
INSERT INTO productdir (id,dirName,parent_id) VALUES(10,'美女鼠标',1)
INSERT INTO productdir  VALUES(20,'美女鼠标',1)
2.插入数据记录一部分
INSERT INTO productdir (id,dirName,parent_id) VALUES(NULL,'美女鼠标',1)
INSERT INTO productdir (dirName,parent_id) VALUES('儿童鼠标',1)
INSERT INTO productdir (dirName) VALUES(NULL)
INSERT INTO productdir (dirName) VALUES('')
3.插入多条数据记录(MySQL特有)
INSERT INTO productdir (dirName,parent_id) VALUES('办公鼠标1',1),('办公鼠标2',1),('办公鼠标2',1)
4.插入查询结果(测试)
INSERT INTO productdir (dirName) SELECT dirName FROM productdir
更新操作: 不能更改主键.
UPDATE  table_name
SET columnName = value [, columnName = value] …
[WHERE  condition];
如果省略了where子句,则全表的数据都会被修改。注意:没有FROM
-----------------------------------------------------------------
需求:将零售价大于300的货品零售价上调0.2倍
需求:将零售价大于300的有线鼠标的货品零售价上调0.1倍
删除操作:
DELETE                FROM  table_name
[WHERE  condition];
如果省略了where子句,则全表的数据都会被修改

小结

数据备份和恢复:
注意:在企业中修改数据之前,先备份.
--------------------------------------------------------------
MySQL自身的数据库维护:
通过cmd命令进入dos窗口:
1.导出:mysqldump -u账户 -p密码 数据库名称>脚本文件存储地址
   mysqldump -uroot -padmin jdbcdemo> C:/shop_bak.sql
2.导入:mysql -u账户 -p密码 数据库名称< 脚本文件存储地址
   mysql -uroot -padmin jdbcdemo< C:/shop_bak.sql
-------------------------------------------------------------
Navicat工具的导入和导出:
Navicat工具的备份和还原:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012124438/article/details/81428759