SELECT 语法
-
SELECT 列名称 FROM 表名称
- SELECT LastName,FirstName FROM Persons
-
SELECT * FROM 表名称
- mysql> select * from mytable;
-
Select+where条件
- select Name,age from mytable where age >=20 and age <=25 addre = ‘gucheng’;
- 或select * from mytable where age >=20 and age <=25 addre = ‘gucheng’;
-
Select+where+like条件
- select Name from mytable where Name like ‘y%’ or Name like ‘n%’;
-
使用 Rlike 筛选已mny开头的用户(正则表达式)。
- select Name from mytable where Name Rlike ‘1.*$’;
-
使用 in 关键字,后面跟上一个列表
- select Name from student where age in (18,20,25);
-
students 中有个字段课程(CID2)。查找出改字段,里面为空的字段的,学生姓名 Name
- select Name from students where CID2 is null ;
查询不为空就是要 is not null - is null 和 is not null可以实现判断字段是否为空
- select Name from students where CID2 is null ;
-
limit 子句:用于显示 结果的前 N 行
只显示前3行- select * from students limit 3;
-
只显示3行,从第5行开始计算
- select * from students limit 3,5;
-
group by 子句 :
-
用于分组,比如把students 表的 学生 按照男女进行分组
-
select age,Gender from students group by gender
-
students 表中的字段 有个课程的字段 CID 求出该字段中,需要将课程的人数,大于等于2的显示出来
-
-
having 子句
- 只能和group by 搭配使用,使用group by 分组之后,再用having 过滤
- select CID from students where having CID >=2
-
多表查询如mytable(name,sex,addre,job),mypersons(name,birth)表,已知name,求douzi的年纪,生日,地址。
select mytable.sex,mytable.addre ,mypersons.birth
from mytable ,mypersons
where mytable.name = mypersons.name;
- 多表查询2个表中相同名称的人。
Select *
from mytable join mypersons
on mytable.name=mypersons.name;
SQL UNION 实例
查询2个表中相同字段下不同值
SELECT 列名
FROM 表名
UNION # Union All 是可以不去重的
SELECT 列名
FROM 表名
ORDER BY 列名;
SELECT country FROM Websites UNION SELECT country FROM apps ORDER BY country;
- UNION all 输出列名下所有值
SELECT 列名
FROM 表名
UNION
SELECT 列名
FROM 表名
ORDER BY 列名;
SELECT country
FROM Websites
UNION ALL
SELECT country
FROM apps
ORDER BY country;
- 带有 WHERE 的 SQL UNION ALL
SELECT 列名, 列名
FROM 表名
WHERE 列名='CN'UNION ALL
SELECT 列名, 列名
FROM 表名
WHERE 列名='CN'ORDER BY 列名;
SELECT country, name
FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name
FROM apps
WHERE country='CN'
ORDER BY country;
- 匹配列前缀查询
指匹配列值的开头部分,如:查询用户名以feinik开头的所有用户
Select *
from mytable
where name like ‘jing%’;
- MySQL 排序
我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列
SELECT *
from 表名
ORDER BY 列名 ASC;
如SELECT * from runoob_tbl ORDER BY submission_date ASC;
- MySQL GROUP BY 语句
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
Select name ,count(*)
from mytable
group by name;
Select执行顺序
SELECT a.customer_id, COUNT(b.order_id) as total_orders
FROM table1 AS a
LEFT JOIN table2 AS b
ON a.customer_id = b.customer_id
WHERE a.city = 'hangzhou'
GROUP BY a.customer_id
HAVING count(b.order_id) < 2
ORDER BY total_orders DESC;
1、FORM: 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1。
2、ON: 对虚表VT1进行ON过滤,只有那些符合的行才会被记录在虚表VT2中。
3、JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3。
4、WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
5、GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5。
6、HAVING: 对虚拟表VT5应用having过滤,只有符合的记录才会被 插入到虚拟表VT6中。
7、SELECT: 执行select操作,选择指定的列,插入到虚拟表VT7中。
8、DISTINCT: 对VT7中的记录进行去重。产生虚拟表VT8.
9、ORDER BY: 将虚拟表VT8中的记录按照<order_by_list>进行排序操作,产生虚拟表VT9.
10、LIMIT:取出指定行的记录,产生虚拟表VT10, 并将结果返回。
where 和 join on区别
总结一下就是
可得到on条件是在left join之前先进行条件筛选,而后才对两个表格join操作
在这里是以left join为例,对于inner join来说由于其性质,这两种条件得到的结果会是一样,但中间内部过程还是有差异的
on比where起作用更早,,先根据on条件进行多表的连接操作,生成一个临时表再通过where来筛选
group by 与Having 的使用方法
group by 用于对多条记录中有一个相同属性的集合
如 一个学生可以有多个课程
然后我们就可以对这些多个课程做聚集函数的一些操作
LIMIT与OFFSET的使用
limit 与 offset:从下标0开始
offset X 是跳过X个数据
limit Y 是选取Y个数据
limit X,Y 中X表示跳过X个数据,读取Y个数据
例如: select * from table limit 2,1; // 跳过2个数据,读取1个数据
常与order by使用:如,
select distinct Salary
from Employee
order by Salary desc
limit 1 offset 1;
从Employee(员工)表中,读取第二高的salary(薪水),排序后,跳过第一个下标,读取一个元素
MNY ↩︎