前提:
数据库:books
里面有table:
customers
orders
查看存在的所有数据库
show databases
选择数据库
use books
查询所有表格
show tables
查询单个表格
select × from orders
显示表格的结构
describe ----;
查询表格的数据类型
show create table orders
修改数据类型
alter table orders modify id vaechar(20)
增加两行数据
insert into orders values('','','',''),('','','','')
增加特定位置的数据
insert into orders(amount) values('45.45')
修改数据
update orders set date='2000-02-02' where orderid=1;
五种统计函数
(1)max:求最大值
select max(goods_price) from goods
这里会取出最大的价格的值,只有值
#查询每个栏目下价格最高的
select cat_id,max(goods_price) from goos group by cat_id;
#查出价格最高的商品编号
select goods_id,max(goods_price) from goods group by goods_id;
(2)min:求最小值
(3)sum:求总数和
(4)avg:求平均值
(5)count:求总行数
#求每个栏目下商品种类
select count(*) from goods;
可以给结果取别名(as)
select amount-orderid as distance from orders;
-----------------------------
(1)where
(2)having
(3)group by
(4)order by
(5)limit
(--1)where
where price>=100 and price<=200 or price>=500 and price<=800
(--2)having
where针对表中的列发挥作用,用于查询表格
having对查询结果中的列发挥作用,用于筛选结果
#查询本店商品价格比市场价低多少钱,输出低200元以上的商品
select goods_id,good_name,market_price - shop_price as s from goods having s>200 ;
//这里不能用where因为s是查询结果,而where只能对表中的字段名筛选
如果用where的话则是:
select goods_id,goods_name from goods where market_price - shop_price > 200;
综合应用,例如:
#查询两门及两门以上科目不及格的学生的平均分
思路:
#先计算所有学生的平均分
select name,avg(score) as pj from stu group by name;
#查出所有学生的挂科情况
select name,score<60 from stu;
#这里score<60是判断语句,所以结果为真或假,mysql中真为1假为0
#查出两门及两门以上不及格的学生
select name,sum(score<60) as gk from stu group by name having gk > 1;
#综合结果
select name,sum(score<60) as gk,avg(score) as pj from stu group by name having gk>1;
(--3)group by
group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。
SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。
某个员工信息表结构和数据如下:
id name dept salary edlevel hiredate
1 张三 开发部 2000 3 2009-10-11
2 李四 开发部 2500 3 2009-10-01
3 王五 设计部 2600 5 2010-10-02
4 王六 设计部 2300 4 2010-10-03
5 马七 设计部 2100 4 2010-10-06
6 赵八 销售部 3000 5 2010-10-05
7 钱九 销售部 3100 7 2010-10-07
8 孙十 销售部 3500 7 2010-10-06
想列出每个部门最高薪水的结果,sql语句如下:
SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
查询结果如下:
DEPT MAXIMUM
开发部 2500
设计部 2600
销售部 3500
(--4)order by
Order by语句是用来排序的,经常我们会使用到Order by来进行排序
(--4.1)desc 降序
select * from orders order by amount desc;// 降序排列amount
(--4.2) rand() 随机
select * from orders order by rand() limit 3; // 随机选择3行数据
(--5)limit
Mysql中limit的用法:在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已
经为我们提供了这样一个功能。 SELECT*FROMtableLIMIT[offset,]rows|rowsOFFSEToffset LIMIT 子句可以被用于强制 SELECT
语句返回值
select * from orders order by amount limit 4 // 检索前 4 个
select * from orders order by amount limit 4,6 // 检索从4开始,一共6个// 第二个参数是数量
(--6)字段联合
concat:将字段合并后返回查询
select concat(emp_id," ",emp_name) from emp;
---------------------------------
高级查询内容
----子查询(括号里面的查询),是嵌套查询必不可少的部分。
(1)where子查询(把内层查询结果当作外层查询的比较条件)
(2)from型子查询(把内层的查询结果供外层再次查询)
(3)exists型子查询(把外层查询结果拿到内层,看内层的查询是否成立)
----Union用法
UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。
UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL;
----Join的类型
1. 内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
2. 外联结:分为外左联结和外右联结。
内连结:
SELECT * FROM java JOIN mysql ON java.name=mysql.name;
select * from java,mysql where java.name=mysql.name;
SELECT * FROM java JOIN mysql ON java.name=mysql.name;
SELECT * FROM java INNER JOIN mysql ON java.name=mysql.name;
SELECT * FROM java CROSS JOIN mysql ON java.name=mysql.name;
SELECT * FROM java STRAIGHT_JOIN mysql ON java.name=mysql.name;
·table_reference条目中的每个逗号都看作相当于一个内部联合
·默认的JOIN都是INNER JOIN
·CROSS JOIN从语法上说与INNER JOIN等同
·STRAIGHT_JOIN与JOIN相同。除了有一点不一样,左表会在右表之前被读取。
STRAIGH_JOIN可以被用于这样的情况,即联合优化符以错误的顺序排列表。
外连结-左连结
以左侧table为根本,如果右侧table中有与左侧table相同的,则给出结果;没有则标记NULL;
SELECT * FROM java LEFT JOIN mysql ON java.name=mysql.name;
+-------+------+
| name | name |
+-------+------+
| java1 | NULL |
| java2 | NULL |
| blue | blue |
+-------+------+
外连接-右连结
SELECT * FROM java RIGHT JOIN mysql ON java.name=mysql.name;
+------+--------+
| name | name |
+------+--------+
| NULL | mysql1 |
| NULL | mysql2 |
| blue | blue |
+------+--------+