02_数据库基础之(二)sql语句入门
1.基本增删改查操作
1 #一。 数据类型 常用的3中 2 # 1.字符串 例如:你的名字 我是中国人 在数据库中要使用 ‘’引起来 '苹果手机' 3 # 2.整数类型 例如: 你的年龄 23 ,办公室的人数 5 个 ,直接使用 5000 4 # 3.时间 当着一个字符串用 5 6 #二。几乎所有的编程标点符号都要使用 英文状态下的 7 8 #三。数据库中不区分大小写,但是 生产上的 规范 关键字大写 INSERT,其他的小写 9 10 新增 11 需求:添加一条数据到产品表 产品名称为苹果手机 卖价为5000 12 INSERT INTO product (product_name,sale_price) VALUES ('苹果手机',5000) 13 14 删除 15 需求:删除产品表中id=20的数据 16 DELETE FROM product WHERE id=20 17 # = > < >= <= 18 # product_name='联想M115' 19 # 或OR 且AND 非! 两个条件同时满足 AND 20 需求:删除产品表中id=20并且product_name='联想M115'的数据 21 DELETE FROM product WHERE id=20 AND product_name='联想M115' 22 23 需求:删除产品表中id=20或者product_name='联想M115'的数据 24 DELETE FROM product WHERE id=20 OR product_name='联想M115' 25 26 需求:删除产品表中product_name!='联想M115'的数据 27 DELETE FROM product WHERE product_name !='联想M115' 28 29 更新 30 31 #需求:把成本价大于100的所有商品的卖价修改为200,并且把名称修改为特殊商品 32 UPDATE product SET sale_price=200,product_name='特殊商品' WHERE cost_price>100 33 34 查询 35 #查询所有商品 36 SELECT * FROM product 37 #需求:查询id<8的数据 38 #过滤行 39 SELECT * FROM product WHERE id<8 40 #需求:查询id<8的数据,只看id,产品名称,卖价 41 SELECT id,product_name,sale_price FROM product WHERE id<8
2.创建表与规范命名
2.1.命名规则:
a.见名知意 千万不要使用中文拼音
b.多个单词使用下划线(数据库中不区分大小写,生产规范关键字大写,其他小写)
c.不要使用关键字 #关键字 INSERT INTO VALUES
2.2.数据库设计必备基本字段
1.id 序号
2.state 状态
3.type 类型
4.create_time 创建时间
5.update_time 更新时间
2.3.创建用户表案例
3.表结构认识
4.简单查询之列操作
1 简单查询: 2 语法: 3 SELECT {*, column [alias],...} 4 FROM table_name; 5 说明: 6 SELECT 选择查询列表 7 FROM 提供数据源(表、视图或其他的数据源) 8 如果为 * 和创建表时的顺序一致。 9 可以自己调整顺序,在select后边加上要查询的列名。 10 需求:查询所有货品信息 11 需求:查询所有货品的id,product_name,sale_price 12 -------------------------------------------------------------- 13 消除结果中重复的数据。 14 需求:查询商品的分类编号。 15 语法: 16 SELECT DISTINCT 列名,.. 17 -------------------------------------------------------------- 18 实现数学运算查询: 19 20 对NUMBER型数据可以使用算数操作符创建表达式(+ - * /) 21 22 对DATE型数据可以使用部分算数操作符创建表达式 (+ -) 23 24 运算符优先级: 25 26 1、乘法和除法的优先级高于加法和减法 27 28 2、同级运算的顺序是从左到右 29 30 3、表达式中使用"括号"可强行改变优先级的运算顺序 31 32 ----------------------------------------------------------------- 33 需求:查询所有货品的id,名称和每零售1个产品所赚取的钱(每零售1个产品所赚取的钱=零售价-成本价格) 34 SELECT id ,product_name,sale_price-cost_price FROM product 35 36 需求:查询所有货品的id,名称和批发价(批发价=卖价*折扣) 37 38 需求:查询所有货品的id,名称,和各进50个的成本价(成本=cost_price) 39 42 ------------------------------------------------------------------ 43 44 设置列名的别名。 45 46 1、改变列的标题头; 47 48 2、用于表示计算结果的含义; 49 50 3、作为列的别名; 51 52 4、如果别名中使用特殊字符,或者是强制大小写敏感,或有空格时,都需加单引号;--->英文单词 53 54 需求:查询所有货品的id,名称和每零售1个产品所赚取的钱(每零售1个产品所赚取的钱=零售价-成本价格),并取别名 55 56 SELECT id ,product_name 名称 ,sale_price-cost_price 每零售1个产品所赚取的钱 FROM product 57 58 需求:查询所有货品的id,名称,各进50个,并且每个运费1元的成本(使用别名) 59 60 ------------------------------------------------------------------ 61 62 设置显示格式: 63 64 为方便用户浏览查询的结果数据,有时需要设置显示格式,可以使用CONCAT函数来连接字符串。 65 66 需求:查询所有货品名称和每零售1个产品所赚取的钱(每零售1个产品所赚取的钱=零售价-成本价格), 67 格式为: 每零售一个XXX产品,赚取:XX元 68 SELECT CONCAT('每零售一个',product_name,'产品,赚取:',sale_price-cost_price,'元') FROM product 69 70 需求:查询商品的名字和零售价。 71 格式:xxx商品的零售价为:xxx 72 73 SELECT CONCAT(productName,'商品的零售价为:',salePrice) AS productSalePrice FROM product; 74 //CONCAT('你好','吗','?','我很好') 你好吗?我很好
5.带条件查询
1 使用WHERE子句限定返回的记录: 2 3 语法: 4 5 SELECT <selectList> 6 7 FROM table_name 8 9 WHERE 条件1 AND/OR 条件2; 10 11 注意: 12 13 WHERE子句在 FROM 子句后 14 15 ---------------------------------------------------- 16 17 比较运算符 含义 18 19 ------------------------------------------------- 20 21 = 等于 22 23 > 大于 24 25 >= 大于或等于 26 27 < 小于 28 29 <= 小于或等于 30 31 !=(<>) 不等于 32 33 --------------------------------------------------- 34 需求: 查询货品零售价大于119的所有货品信息. 35 SELECT * FROM product WHERE sale_price>119 36 37 需求: 查询货品零售价为119的所有货品信息. 38 39 需求: 查询货品名为联想G9X的所有货品信息. 40 41 需求: 查询货品名 不为 联想G9X的所有货品信息. 42 43 需求: 查询分类编号不等于2的货品信息 44 45 需求: 查询货品名称,零售价小于等于200的货品 46 47 需求: 查询id,货品名称,批发价大于350的货品 48 49 思考:where后面使用别名不行,总结select和where的执行顺序 先执行where ,在执行select 50 51 52 53 SQL的执行顺序: 54 55 1.先执行FROM子句: 确定查询哪一张表 56 57 2.接着执行WHERE : 过滤筛选条件 58 59 3.接着做SELECT : 确定选择的列 60 61 4.最后做ORDER BY: 对结果集按照某列排序 62 63 --------------------------------------------------- 64 65 注意:字符串和日期要用单引号扩起来. 66 67 要让MySQL查询区分大小写,可以:使用 BINARY 68 69 SELECT * FROM table_name WHERE BINARY product_name='g9x' 70 71 SELECT * FROM table_name WHERE BINARY product_name='G9X' 72 73 ----------------------------------------------------------------- 74 75 逻辑运算符 含义 76 77 ---------------------------------------- 78 79 AND 如果组合的条件都是TRUE,返回TRUE 80 81 OR 如果组合的条件之一是TRUE,返回TRUE 82 83 NOT(!) 如果下面的条件是FALSE,返回TRUE` 84 85 ------------------------------------------------------------- 86 87 需求: 选择id,货品名称,批发价在300-400之间的货品 88 89 需求: 选择id,货品名称,分类编号为2,4的所有货品 90 91 需求: 选择id,货品名词,分类编号不为2的所有商品 92 93 需求: 选择id,货品名称,分类编号的货品零售价大于等于250或者是成本大于等于200 94 95 ----------------------------------------------------------------------- 96 优先级 运算符 97 ------------------------------------ 98 1 所有比较运算符 99 2 NOT 100 3 AND 101 4 OR 102 103 注意:括号将跨越所有优先级规则
1 使用BETWEEN运算符显示某一值域范围的记录,这个操作符最常见的使用在数字类型数据的范围上,但对于字符类型数据和日期类型数据同样可用。 2 格式: 3 SELECT <selectList> 4 FROM table_name 5 WHERE 列名 BETWEEN minvalue AND maxvalue:闭区间。 6 需求: 选择id,货品名称,批发价在300-400之间的货品 7 需求: 选择id,货品名称,批发价不在300-400之间的货品 8 -------------------------------------------------------- 9 使用IN运算符,判断列的值是否在指定的集合中。 10 格式: 11 SELECT <selectList> 12 FROM table_name 13 WHERE 列名 IN (值1,值2....); 14 15 需求:选择id,货品名称,分类编号为2,4的所有货品 16 需求:选择id,货品名称,分类编号不为2,4的所有货品 17 -------------------------------------------------------- 18 IS NULL:判断列的值是否为空。 19 格式:WHERE 列名 IS NULL; 20 需求:查询商品名为NULL的所有商品信息。 21 -------------------------------------------------------- 22 使用LIKE运算符执行通配查询,查询条件可包含文字字符或数字: 23 %:通配符:可表示零或多个字符。 24 _:通配符:可表示一个字符。 25 通配符:用来实现匹配部分值得特殊字符。 26 ----------------------------------------------------- 27 需求: 查询id,货品名称,货品名称匹配'%联想M9_' 28 需求: 查询id,货品名称,分类编号,零售价大于等于200并且货品名称匹配'%联想M1__'
6.排序
使用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
7.分页
1 分页查询: 2 分页设计: 3 假分页(逻辑分页): 把数据全部查询出来,存在于内存中,翻页的时候,直接从内存中去截取. 4 真分页(物理分页): 每次翻页都去数据库中去查询数据. 5 6 假分页: 翻页比较快,但是第一次查询很慢,若数据过大,可能导致内存溢出. 7 真分页: 翻页比较慢,若数据过大,不会导致内存溢出. 8 ---------------------------------------------------------------------------------------- 9 规定:每页显示3条数据. pageSize = 3 10 第一页: SELECT * FROM `product` LIMIT 0, 3 11 第二页: SELECT * FROM `product` LIMIT 3, 3 12 第三页: SELECT * FROM `product` LIMIT 6, 3 13 第 N页: SELECT * FROM `product` LIMIT (N-1)*3, 3 14 ---------------------------------------------------------------------------------------- 15 分页查询的SQL: 16 SELECT * FROM table_name LIMIT ?,?; 17 SELECT * FROM table_name LIMIT beginIndex,pageSize; 18 beginIndex = (currentPage-1) * pageSize; 19 第一个?: 表示本页,开始索引(从0开始). 20 第二个?: 每页显示的条数
8.函数
1 什么是聚集函数:统计函数. 2 聚集函数作用于一组数据,并对一组数据返回一个值。 3 ------------------------------------------------------- 4 聚集函数: 5 COUNT:统计结果记录数 6 MAX: 统计计算最大值 7 MIN: 统计计算最小值 8 SUM: 统计计算求和 9 AVG: 统计计算平均值 10 ------------------------------------------------------- 11 需求:查询所有商品平均零售价
SELECT AVG(sale_price) FROM product 12 需求:查询商品总记录数 13 需求:查询分类为2的商品总数 14 需求:查询商品的最小零售价,最高零售价,以及所有商品零售价总和
9.分组
1 分组查询: 2 可以使用GROUP BY 子句将表中的数据分成若干组,再对分组之后的数据做统计计算,一般使用聚集函数才使用GROUP BY. 3 语法格式: 4 SELECT <selectList>,聚集函数 5 FROM table_name 6 WHERE 条件 7 GROUP BY 列名 8 注意:GROUP BY 后面的列名的值要有重复性分组才有意义。 9 10 ---------------------------------------------------------------------- 11 需求:查询每个商品分类编号和每个商品分类各自的平均零售价
SELECT classify_id,AVG(sale_price) FROM product GROUP BY classify_id 12 需求:查询每个商品分类编号和每个商品分类各自的商品总数。 13 需求:查询每个商品分类编号和每个商品分类中零售价大于100的商品总数: 14 需求:查询零售价总和大于1500的商品分类编号以及总零售价和:
10.笛卡尔积
1 单表查询:从一张表中查询数据 2 多表查询:从多张表中联合查询出数据 3 ------------------------------------ 4 单表查询: 5 SELECT <selectList> 6 FROM table_name 7 ----------------------------------- 8 多表查询(最简单的): 9 SELECT <selectList> 10 FROM 表名A,表名B 11 ---------------------------------------------------------------------- 12 笛卡尔积: 13 需求:查询所有的货品信息+对应的货品分类信息 14 没有连接条件的表关系返回的结果。 15 多表查询会产生笛卡尔积: 16 17 假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。 18 19 实际运行环境下,应避免使用全笛卡尔集。 20 21 解决方案: 在WHERE加入有效的连接条件---->等值连接 22 注意: 23 连接 n张表,至少需要 n-1个连接条件。
11.内连接查询
1 内连接查询: 2 内连接查询:是相对于外连接。 3 内连接分为:隐式内连接、显示内连接(推荐),其查询效果相同,仅仅只是语法不同而已。 4 ----------------------------------------------- 5 隐式内连接: 6 SELECT <selectList> 7 FROM A ,B WHERE A.列 = B.列 8 ----------------------------------------------- 9 显示内连接(推荐写法):. 10 SELECT <selectList> 11 FROM A [INNER] JOIN B ON A.列 = B.列 12 ----------------------------------------------- 13 需求:查询所有商品的名称和分类名称: 14 隐式内连接: SELECT p.product_name,pc.classify_name FROM product p,product_classify pc WHERE p.classify_id = pc.id 15 显示内连接: SELECT p.product_name,pc.classify_name FROM product p INNER JOIN product_classify pc ON p.classify_id = pc.id 16 显示内连接: SELECT p.product_name,pc.classify_name FROM product p JOIN product_classify pc ON p.classify_id = pc.id 17 ----------------------------------------------- 18 在做等值连接的时候,若A表中和B表中的列名相同. 则可以简写: 19 SELECT <selectList> 20 FROM A [INNER] JOIN B USING(同名的列) 21 前提:在emp员工和dept部门表中都有deptno部门编号列. 并且是外键关系。 22 则: SELECT * FROM emp JOIN dept USING (deptno) 23 --------------------------------------------------------------------- 24 使用表名前缀在多个表中区分相同的列。 25 在不同表中具有相同列名的列可以用表的别名加以区分。 26 使用别名可以简化查询。 27 使用表名前缀可以提高执行效率。 28 如果使用了表的别名,则不能再使用表的真名 29 --------------------------------------------------------------------- 30 需求: 查询货品id,货品名称,货品所属分类名称 31 需求: 查询零售价大于200的无线鼠标 32 需求: 查询零售价大于200的无线鼠标(使用表的别名) 33 需求: 查询每个货品对应的分类以及对应的库存 34 需求: 如果库存货品都销售完成,按照利润从高到低查询货品名称,零售价,货品分类(三张表).
12.外连接查询
1 外连接查询: 2 左外连接:查询出JOIN左边表的全部数据查询出来,JOIN右边的表不匹配的数据使用NULL来填充数据. 3 右外连接:查询出JOIN右边表的全部数据查询出来,JOIN左边的表不匹配的数据使用NULL来填充数据. 4 ---------------------------- 5 语法格式: 6 SELECT <selectList> 7 FROM A LEFT/RIGHT [OUTER] JOIN B 8 ON (A.column_name = B.column_name)]; 9 查询所有的商品信息和对应的分类信息. 10 左连接: 11 SELECT * FROM product p LEFT JOIN product_classify pc ON p.classify_id = pc.id 12 右连接: 13 SELECT * FROM product p RIGHT JOIN product_classify pc ON p.classify_id = pc.id 14 ---------------------------------------------- 15 在做等值连接的时候,若A表中和B表中的列名相同. 则可以简写: 16 SELECT <selectList> 17 FROM A LEFT JOIN B USING(同名的列) 18 前提:在emp员工和dept部门表中都有deptno部门编号列. 并且是外键关系 19 如: SELECT * FROM emp LEFT JOIN dept USING (deptno) 20 21 思考:查询每种商品分类的名称和包含的的商品总数: 22 23 SELECT pc.classify_name,COUNT(p.id) 24 25 FROM product p RIGHT JOIN product_classify pc ON p.classify_id = pc.id 26 27 GROUP BY pc.classify_name
13.自连接查询
1 自连接查询: 2 把一张表看成两张来做查询. 3 需求: 查询每个商品分类的名称和父分类名称: 4 5 隐式内连接: 6 SELECT sub.classify_name,super.classify_name 7 FROM product_classify super,product_classify sub 8 WHERE sub.parent_id = super.id 9 10 显示内连接: 11 SELECT sub.classify_name,super.classify_name 12 FROM product_classify super JOIN product_classify sub 13 14 ON sub.parent_id = super.id
14.子查询
1 什么是子查询(嵌套查询):一个查询语句中嵌套在另一个查询语句中,内层查询的结果可以作为外层查询条件或者临时表。 2 一般的,嵌套在WHERE或者FROM字句中。 3 为什么使用子查询: 4 多表连接查询过程: 5 1):两张表做笛卡尔积。 6 2):筛选匹配条件的数据记录。 7 若,笛卡尔积记录数比较大,可能造成服务器崩溃。 8 ----------------------------------------------------------------------- 9 单行单列子查询: 10 需求: 查询零售价比联想MX1100更高的所有商品信息。 11 SELECT * FROM product 12 WHERE salePrice > ( 13 SELECT salePrice FROM product WHERE productName = '联想MX1100' 14 ) 15 单行多列子查询: 16 需求: 查询分类编号和折扣与联想M100相同的所有商品信息。 17 SELECT * FROM product 18 WHERE (dir_id,cutoff)=( 19 SELECT dir_id,cutoff FROM product WHERE productName = '联想M100' 20 ) 21 多行多列子查询: 22 需求: 查询各商品分类的分类编号,分类名称,商品数量,平均零售价。 23 24 内连接: 25 SELECT pc.id, pc.classify_name,COUNT(p.id),AVG(p.sale_price) 26 27 FROM product p JOIN product_classify pc ON p.classify_id = pc.id 28 29 GROUP BY pc.id 30 31 产生的笛卡尔积记录:80条 32 SELECT COUNT(*) FROM product,product_classify 33 34 子查询: 35 SELECT pc.id,pc.classify_name,countNum,avgSalePrice 36 37 FROM product_classify pc JOIN ( 38 39 SELECT classify_id ,COUNT(id) countNum,AVG(sale_price) avgSalePrice 40 41 FROM product 42 43 GROUP BY classify_id) p 44 45 ON pc.id = p.classify_id
15.保存之前先检查该数据是否存在
举例:角色不能一样
INSERT INTO tab_pc_role (role_name,remark) SELECT 'testMast2','测试权限' FROM DUAL WHERE NOT EXISTS (SELECT id FROM tab_pc_role WHERE role_name='testMast2')
16.考查与评估
a.练习题
1 1.基本增删改查操作 2 需求:添加一条数据到产品表 产品名称为苹果手机 卖价为5000 3 需求:删除产品表中id=20的数据 4 需求:删除产品表中id=20并且product_name='联想M115'的数据 5 需求:删除产品表中id=20或者product_name='联想M115'的数据 6 需求:删除产品表中product_name!='联想M115'的数据 7 需求:把成本价大于100的所有商品的卖价修改为200,并且把名称修改为特殊商品 8 需求:查询所有商品 9 需求:查询id<8的数据 10 需求:查询id<8的数据,只看id,产品名称,卖价 11 12 2.简单查询之列操作 13 需求:查询所有货品信息 14 需求:查询所有货品的id,product_name,sale_price 15 需求:查询商品的分类编号。 16 需求:查询所有货品的id,名称和每零售1个产品所赚取的钱(每零售1个产品所赚取的钱=零售价-成本价格) 17 需求:查询所有货品的id,名称和批发价(批发价=卖价*折扣) 18 需求:查询所有货品的id,名称,和各进50个的成本价(成本=cost_price) 19 需求:查询所有货品的id,名称和每零售1个产品所赚取的钱(每零售1个产品所赚取的钱=零售价-成本价格),并取别名 20 需求:查询所有货品的id,名称,各进50个,并且每个运费1元的成本(使用别名) 21 需求:查询所有货品名称和每零售1个产品所赚取的钱(每零售1个产品所赚取的钱=零售价-成本价格), 22 需求:查询商品的名字和零售价。格式:xxx商品的零售价为:xxx 23 24 3.带条件查询 25 需求: 查询货品零售价大于119的所有货品信息. 26 需求: 查询货品零售价为119的所有货品信息. 27 需求: 查询货品名为联想G9X的所有货品信息. 28 需求: 查询货品名 不为 联想G9X的所有货品信息. 29 需求: 查询分类编号不等于2的货品信息 30 需求: 查询货品名称,零售价小于等于200的货品 31 需求: 查询id,货品名称,批发价大于350的货品 32 需求: 选择id,货品名称,批发价在300-400之间的货品 33 需求: 选择id,货品名称,分类编号为2,4的所有货品 34 需求: 选择id,货品名词,分类编号不为2的所有商品 35 需求: 选择id,货品名称,分类编号的货品零售价大于等于250或者是成本大于等于200 36 需求: 选择id,货品名称,批发价在300-400之间的货品 37 需求: 选择id,货品名称,批发价不在300-400之间的货品 38 需求: 选择id,货品名称,分类编号为2,4的所有货品 39 需求: 选择id,货品名称,分类编号不为2,4的所有货品 40 需求: 查询商品名为NULL的所有商品信息。 41 需求: 查询id,货品名称,货品名称匹配'%联想M9_' 42 需求: 查询id,货品名称,分类编号,零售价大于等于200并且货品名称匹配'%联想M1__' 43 需求:选择id,货品名称,分类编号,零售价并且按零售价降序排序 44 需求: 选择id,货品名称,分类编号,零售价先按分类编号排序,再按零售价排序 45 需求:查询M系列并按照批发价排序(加上别名) 46 需求:查询分类为2并按照批发价排序(加上别名) 47 48 4.函数 49 需求:查询所有商品平均零售价 50 需求:查询商品总记录数 51 需求:查询分类为2的商品总数 52 需求:查询商品的最小零售价,最高零售价,以及所有商品零售价总和 53 54 5.分组 55 需求:查询每个商品分类编号和每个商品分类各自的平均零售价 56 需求:查询每个商品分类编号和每个商品分类各自的商品总数。 57 需求:查询每个商品分类编号和每个商品分类中零售价大于100的商品总数: 58 需求:查询零售价总和大于1500的商品分类编号以及总零售价和 59 60 6.综合查询 61 需求:查询所有的货品信息+对应的货品分类信息 62 需求:查询所有商品的名称和分类名称 63 需求: 查询货品id,货品名称,货品所属分类名称 64 需求: 查询零售价大于200的无线鼠标 65 需求: 查询零售价大于200的无线鼠标(使用表的别名) 66 需求: 查询每个货品对应的分类以及对应的库存 67 需求: 如果库存货品都销售完成,按照利润从高到低查询货品名称,零售价,货品分类(三张表). 68 需求: 查询每个商品分类的名称和父分类名称 69 需求: 查询零售价比联想MX1100更高的所有商品信息。 70 需求: 查询分类编号和折扣与联想M100相同的所有商品信息。 71 需求: 查询各商品分类的分类编号,分类名称,商品数量,平均零售价。
b.需求:以常见OA系统中的员工部门为案例完成:
1.设计员工表
2.设计部门表
3.sql语句练习
3.1查询所有员工按照年龄排序
3.2查询各部门的平均工资
3.3查询各部门人数并按照部门人数排序
3.4查询研发部门的所有员工
3.5查询工资高于10000的员工信息
3.6查询工资低于平均工资的员工信息
17.练习题sql语句答案
1 CREATE TABLE `product` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `product_name` varchar(50) DEFAULT NULL, 4 `classify_id` int(11) DEFAULT NULL, 5 `sale_price` double(10,2) DEFAULT NULL, 6 `supplier` varchar(50) DEFAULT NULL, 7 `brand` varchar(50) DEFAULT NULL, 8 `cutoff` double(2,2) DEFAULT NULL, 9 `cost_price` double(10,2) DEFAULT NULL, 10 PRIMARY KEY (`id`) 11 ) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8; 12 13 1.基本增删改查操作 14 需求:添加一条数据到产品表 产品名称为苹果手机 卖价为5000 15 INSERT INTO product (product_name,sale_price) VALUES ('苹果手机',5000); 16 17 需求:删除产品表中id=20的数据 18 DELETE FROM product WHERE id=20; 19 需求:删除产品表中id=20并且product_name='联想M115'的数据 20 DELETE FROM product WHERE id=20 AND product_name='联想M115'; 21 22 需求:删除产品表中id=20或者product_name='联想M115'的数据 23 DELETE FROM product WHERE id=20 OR product_name='联想M115'; 24 25 26 需求:删除产品表中product_name!='联想M115'的数据 27 DELETE FROM product WHERE product_name='联想M115'; 28 29 30 需求:把成本价大于100的所有商品的卖价修改为200,并且把名称修改为特殊商品 31 UPDATE product SET sale_price=200,product_name='特殊商品' WHERE cost_price>100 32 33 34 需求:查询所有商品 35 SELECT * FROM product 36 37 需求:查询id<8的数据 38 SELECT * FROM product WHERE id<8 39 40 需求:查询id<8的数据,只看id,产品名称,卖价 41 42 SELECT id,product_name,sale_price FROM product WHERE id<8 43 44 2.简单查询之列操作 45 需求:查询所有货品信息 46 47 SELECT * FROM product 48 49 需求:查询所有货品的id,product_name,sale_price 50 SELECT id,product_name,sale_price FROM product 51 52 53 需求:查询商品的分类编号。 54 SELECT classify_id FROM product 55 56 需求:查询所有货品的id,名称和每零售1个产品所赚取的钱(每零售1个产品所赚取的钱=零售价-成本价格) 57 58 SELECT id,product_name,sale_price,cost_price,(sale_price-cost_price)*1 FROM product 59 60 需求:查询所有货品的id,名称和批发价(批发价=卖价*折扣) 61 SELECT id,product_name,sale_price,cutoff,(sale_price*cutoff) FROM product 62 63 需求:查询所有货品的id,名称,和各进50个的成本价(成本=cost_price) 64 SELECT id,product_name,cost_price,cost_price*50 FROM product 65 66 需求:查询所有货品的id,名称和每零售1个产品所赚取的钱(每零售1个产品所赚取的钱=零售价-成本价格),并取别名 67 SELECT id,product_name,sale_price,cost_price,(sale_price-cost_price)*1 每零售1个产品所赚取的钱 FROM product 68 69 70 需求:查询所有货品的id,名称,各进50个,并且每个运费1元的成本(使用别名) 71 SELECT id,product_name,cost_price,(cost_price+1)*50 成本 FROM product 72 73 74 需求:查询所有货品名称和每零售1个产品所赚取的钱(每零售1个产品所赚取的钱=零售价-成本价格) 75 SELECT product_name,sale_price,cost_price,(sale_price-cost_price) 利润 FROM product 76 77 需求:查询商品的名字和零售价。格式:xxx商品的零售价为:xxx 78 79 SELECT product_name,'商品的零售价为:',sale_price FROM product 80 SELECT CONCAT(product_name,'商品的零售价为:',sale_price) FROM product 81 82 3.带条件查询 83 需求: 查询货品零售价大于119的所有货品信息. 84 SELECT * FROM product WHERE sale_price>119 85 86 需求: 查询货品零售价为119的所有货品信息. 87 SELECT * FROM product WHERE sale_price=119 88 89 90 需求: 查询货品名为联想G9X的所有货品信息. 91 SELECT * FROM product WHERE product_name='联想G9X' 92 93 94 需求: 查询货品名 不为 联想G9X的所有货品信息. 95 SELECT * FROM product WHERE product_name !='联想G9X' 96 97 98 需求: 查询分类编号不等于2的货品信息 99 100 SELECT * FROM product WHERE classify_id!=2 101 102 需求: 查询货品名称,零售价小于等于200的货品 103 104 SELECT product_name,sale_price FROM product WHERE sale_price=200 105 106 需求: 查询id,货品名称,批发价大于350的货品 107 108 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff>350 109 110 需求: 选择id,货品名称,批发价在300-400之间的货品 111 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff>300 AND sale_price*cutoff<400 112 113 114 需求: 选择id,货品名称,分类编号为2,4的所有货品 115 SELECT id, product_name,classify_id FROM product WHERE classify_id=2 OR classify_id=4 116 117 SELECT id, product_name,classify_id FROM product WHERE classify_id IN (2,4) # (推荐使用这种) 118 119 120 121 需求: 选择id,货品名词,分类编号不为2的所有商品 122 SELECT id, product_name,classify_id FROM product WHERE classify_id !=2 # (推荐使用这种) 123 124 SELECT id, product_name,classify_id FROM product WHERE classify_id NOT IN (2) 125 126 127 128 需求: 选择id,货品名称,分类编号的货品零售价大于等于250或者是成本大于等于200 129 130 SELECT id, product_name,classify_id FROM product WHERE sale_price>=250 OR cost_price>=200 131 需求: 选择id,货品名称,批发价在300-400之间的货品 132 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff>300 AND sale_price*cutoff<400 #推荐这种 133 134 135 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff BETWEEN 300 AND 400 136 137 138 139 需求: 选择id,货品名称,批发价不在300-400之间的货品 140 141 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff<=300 OR sale_price*cutoff>=400 #推荐这种 142 143 SELECT id, product_name,sale_price*cutoff FROM product WHERE sale_price*cutoff NOT BETWEEN 300 AND 400 144 145 146 需求: 选择id,货品名称,分类编号为2,4的所有货品 147 SELECT id, product_name,classify_id FROM product WHERE classify_id=2 OR classify_id=4 148 149 SELECT id, product_name,classify_id FROM product WHERE classify_id IN (2,4) # (推荐使用这种) 150 151 需求: 选择id,货品名称,分类编号不为2,4的所有货品 152 SELECT id, product_name,classify_id FROM product WHERE classify_id!=2 AND classify_id!=4 153 154 SELECT id, product_name,classify_id FROM product WHERE classify_id NOT IN (2,4) # (推荐使用这种) 155 156 需求: 查询商品名为NULL的所有商品信息。 157 SELECT * FROM product WHERE product_name IS NULL 158 159 SELECT * FROM product WHERE product_name = NULL (这是错误的写法 必须重视,初学者很容易犯错) 160 161 需求: 查询id,货品名称,货品名称匹配'%联想M9_' 162 SELECT id, product_name FROM product WHERE product_name LIKE '%联想M9_' 163 164 165 需求: 查询id,货品名称,分类编号,零售价大于等于200并且货品名称匹配'%联想M1__' 166 SELECT id, product_name,classify_id,sale_price FROM product WHERE product_name LIKE '%联想M1__' AND sale_price>=200 167 168 169 需求:选择id,货品名称,分类编号,零售价并且按零售价降序排序 170 SELECT id, product_name,classify_id,sale_price FROM product ORDER BY sale_price DESC (默认的ASC是升序) 171 SELECT id, product_name,classify_id,sale_price FROM product ORDER BY sale_price ASC 172 173 需求: 选择id,货品名称,分类编号,零售价先按分类编号排序,再按零售价排序 174 SELECT id, product_name,classify_id,sale_price FROM product ORDER BY classify_id ASC ,sale_price ASC 175 176 177 需求:查询M系列并按照批发价排序(加上别名) 178 179 #ORDER BY sc 可以使用别名,因为执行select在执行order。。by.. 180 SELECT id, product_name,classify_id,sale_price,cutoff,(sale_price*cutoff) sc FROM product WHERE product_name LIKE '%M%' ORDER BY sc 181 182 需求:查询分类为2并按照批发价排序(加上别名) 183 184 SELECT id, product_name,classify_id,sale_price,cutoff,(sale_price*cutoff) sc FROM product WHERE classify_id=2 ORDER BY sc 185 186 187 4.函数 188 需求:查询所有商品平均零售价 189 190 SELECT AVG(sale_price) FROM product 191 192 需求:查询商品总记录数 193 SELECT COUNT(1) FROM product 194 195 需求:查询分类为2的商品总数 196 SELECT COUNT(1) FROM product WHERE classify_id=2 197 198 需求:查询商品的最小零售价,最高零售价,以及所有商品零售价总和 199 200 SELECT MIN(sale_price),MAX(sale_price),SUM(sale_price) FROM product 201 202 5.分组 203 需求:查询每个商品分类编号和每个商品分类各自的平均零售价 204 205 SELECT classify_id,AVG(sale_price) FROM product GROUP BY classify_id 206 207 需求:查询每个商品分类编号和每个商品分类各自的商品总数。 208 SELECT classify_id,COUNT(1) FROM product GROUP BY classify_id 209 210 需求:查询每个商品分类编号和每个商品分类中零售价大于100的商品总数: 211 SELECT classify_id,COUNT(1) FROM product WHERE sale_price>100 GROUP BY classify_id 212 213 需求:查询零售价总和大于1500的商品分类编号以及总零售价和 214 215 SELECT classify_id,SUM(sale_price) s FROM product GROUP BY classify_id HAVING s>1500 216 217 6.综合查询 218 需求:查询所有的货品信息+对应的货品分类信息 219 220 SELECT * FROM product p LEFT JOIN product_classify pc ON (p.classify_id=pc.id) 221 222 需求:查询所有商品的名称和分类名称 223 224 SELECT p.product_name,pc.classify_name FROM product p LEFT JOIN product_classify pc ON (p.classify_id=pc.id) 225 226 227 需求: 查询货品id,货品名称,货品所属分类名称 228 SELECT p.id,p.product_name,pc.classify_name FROM product p LEFT JOIN product_classify pc ON (p.classify_id=pc.id) 229 230 231 需求: 查询零售价大于200的无线鼠标 232 SELECT p.id,p.product_name,pc.classify_name,p.sale_price 233 FROM product p LEFT JOIN product_classify pc ON (p.classify_id=pc.id) 234 WHERE p.sale_price>200 AND pc.classify_name='无线鼠标' 235 236 需求: 查询零售价大于200的无线鼠标(使用表的别名) 237 SELECT p.id,p.product_name,pc.classify_name,p.sale_price 238 FROM product p LEFT JOIN product_classify pc ON (p.classify_id=pc.id) 239 WHERE p.sale_price>200 AND pc.classify_name='无线鼠标' 240 241 需求: 查询每个货品对应的分类以及对应的库存 242 SELECT * 243 FROM product p 244 LEFT JOIN product_classify pc ON (p.classify_id=pc.id) 245 LEFT JOIN product_stock ps ON (ps.product_id=p.id) 246 247 需求: 如果库存货品都销售完成,按照利润从高到低查询货品名称,零售价,货品分类(三张表). 248 SELECT p.product_name,p.sale_price,pc.classify_name,(p.sale_price-p.cost_price)*ps.store_num c 249 FROM product p 250 LEFT JOIN product_classify pc ON (p.classify_id=pc.id) 251 LEFT JOIN product_stock ps ON (ps.product_id=p.id) 252 ORDER BY c DESC 253 254 需求: 查询每个商品分类的名称和父分类名称 255 256 SELECT * 257 FROM product_classify a 258 LEFT JOIN product_classify b ON (a.parent_id=b.id) 259 260 261 需求: 查询零售价比联想MX1100更高的所有商品信息。 262 263 SELECT sale_price FROM product WHERE product_name='联想MX1100' #sale_price=119 264 265 SELECT * FROM product WHERE sale_price>119 266 267 使用的是子查询 268 269 SELECT * FROM product WHERE sale_price>(SELECT sale_price FROM product WHERE product_name='联想MX1100' ) 270 271 272 273 需求: 查询分类编号和折扣与联想M100相同的所有商品信息。 274 275 SELECT classify_id,cutoff FROM product WHERE product_name='联想M100' 276 277 SELECT * FROM product WHERE (classify_id,cutoff) = (3,0.9) 278 279 #单行多列 子查询 280 281 最后: 282 SELECT * FROM product WHERE (classify_id,cutoff) = (SELECT classify_id,cutoff FROM product WHERE product_name='联想M100') 283 284 285 需求: 查询各商品分类的分类编号,分类名称,商品数量,平均零售价。 286 287 SELECT p.classify_id,pc.classify_name,COUNT(1),AVG(p.sale_price) 288 FROM product p 289 LEFT JOIN product_classify pc ON (p.classify_id=pc.id) 290 GROUP BY p.classify_id
到此数据库第一阶段课程类容就完了,每一位学习者必须认真的把博客上的需求写完整,然后我们做一个习题讲解!