where 是全等查询
on 是模糊查询
1、简单查询
-- 查询所有
SELECT * from js_user;
-- 查询指定的字段
select id,name,sex from js_user;
-- 别名 as
SELECT id as 编号,name as 姓名 from js_user;
-- 别名可以用来计算
-- id+1 as 自增后的id
-- 拼接字符串 concat()
select CONCAT("姓名:",name) as 新名字 from js_user;
-- 去重 DISTINCT
SELECT DISTINCT name FROM js_user;
示例
mysql> select CONCAT("姓名:",name) as 新名字 from js_user;
+-------------+
| 新名字 |
+-------------+
| 姓名:xiao |
| 姓名:zhong |
| 姓名:da |
+-------------+
3 rows in set
mysql> SELECT id+1 as 自增后的id,name as 姓名 from js_user;
+------------+-------+
| 自增后的id | 姓名 |
+------------+-------+
| 2 | xiao |
| 3 | zhong |
| 4 | da |
+------------+-------+
3 rows in set
2、模糊查询
运算符 | 语法 | 描述 |
is null | a is null | 操作符为null 返回真 |
is not null | a is not null | 操作符不为null 返回真 |
between | between a and b | 若在 [a,b]之间 返回真 |
like | a lick b | 匹配,a【匹配b 则结果为真 |
in | a in (a1,a2,a3…) | 假设 a 在 a1 a2 。。中的某一值为真 |
-- like结合 %(代表任意个字符) _(一个字符)
-- 查询两个字的 姓刘的
select * from js_user where name like '刘_';
-- 查询所有姓刘的
select * from js_user where name like '刘%';
-- 查询名字中带有在 国字的
select * from js_user where NAME LIKE '%国%';
-- in 是一个具体的值
select * from js_user where address in ('天津','上海','北京');
例子
mysql> select * from js_user where NAME LIKE '%国%';
+----+----------+--------+-----+---------+--------------+---------+
| id | name | pwd | sex | address | telephone | gradeid |
+----+----------+--------+-----+---------+--------------+---------+
| 4 | 刘国梁 | 123456 | 男 | 北京 | 18863 | 4 |
| 6 | 欧阳国一 | 123456 | 男 | NULL | NULL | 4 |
| 7 | 杨国忠 | 123456 | 男 | NULL | NULL | 3 |
+----+----------+--------+-----+---------+--------------+---------+
3 rows in set
3、联表查询
操作 | 描述 |
iner join 内连接 或等值连接 | 如果表中有一个值匹配上 就返回行 |
left join 左连接 | 会从左表中返回结果 即使右表中没有匹配 |
right join 右连接 | 会从右表中返回数据 即使左表中没有匹配 |
思路
/*
1、明确要查询的数据 来自哪些数据表
2、确定使用哪种查询?
3、找到各个表相同的部分 确定判断条件
*/
- 两个表
select u.id,name,subject,score from js_user as u INNER JOIN js_sub as s on s.id = u.id;
mysql> select u.id,name,subject,score from js_user as u INNER JOIN js_sub as s on s.id = u.id;
+----+------+----------+-------+
| id | name | subject | score |
+----+------+----------+-------+
| 1 | 刘翔 | 离散数学 | 90 |
| 1 | 刘翔 | 高等数学 | 89 |
| 1 | 刘翔 | 线性代数 | 86 |
| 2 | 姚明 | 离散数学 | 93 |
| 2 | 姚明 | 高等数学 | 94 |
| 2 | 姚明 | 线性代数 | 89 |
| 3 | 马龙 | 离散数学 | 90 |
| 3 | 马龙 | 高等数学 | 93 |
| 3 | 马龙 | 线性代数 | 96 |
+----+------+----------+-------+
9 rows in set
- 三个表
-- 查询学生的基本信息和考试情况
select u.id,gradename,name,subject,score from js_user as u
INNER JOIN js_sub as s
on s.id = u.id
LEFT JOIN grade as g
on g.gradeid = u.gradeid;
mysql> select u.id,gradename,name,subject,score from js_user as u INNER JOIN js_sub as s on s.id = u.id LEFT JOIN grade as g on g.gradeid = u.gradeid;
+----+-----------+------+----------+-------+
| id | gradename | name | subject | score |
+----+-----------+------+----------+-------+
| 1 | 研二 | 刘翔 | 离散数学 | 90 |
| 1 | 研二 | 刘翔 | 高等数学 | 89 |
| 1 | 研二 | 刘翔 | 线性代数 | 86 |
| 2 | 大三 | 姚明 | 离散数学 | 93 |
| 2 | 大三 | 姚明 | 高等数学 | 94 |
| 2 | 大三 | 姚明 | 线性代数 | 89 |
| 3 | 大二 | 马龙 | 离散数学 | 90 |
| 3 | 大二 | 马龙 | 高等数学 | 93 |
| 3 | 大二 | 马龙 | 线性代数 | 96 |
+----+-----------+------+----------+-------+
9 rows in set
多个表一起的时候
- 先做两个的
- 一一分解即可。
4、自查询
- 样例表
mysql> select * from js_cate;
+------+---------+------------+
| p_id | cate_id | sub_name |
+------+---------+------------+
| 0 | 3 | 数学 |
| 3 | 9 | 高等数学 |
| 3 | 2 | 线性代数 |
| 0 | 6 | 物理学 |
| 6 | 4 | 量子力学 |
| 6 | 5 | 热力学 |
| 0 | 7 | 计算机科学 |
| 7 | 1 | 操作系统 |
| 7 | 8 | 数据结构 |
+------+---------+------------+
9 rows in set
-- 父子关系
select p.sub_name as 父栏目, s.sub_name as 子栏目 from js_cate as p, js_cate as s where p.cate_id=s.p_id;
+------------+----------+
| 父栏目 | 子栏目 |
+------------+----------+
| 数学 | 高等数学 |
| 数学 | 线性代数 |
| 物理学 | 量子力学 |
| 物理学 | 热力学 |
| 计算机科学 | 操作系统 |
| 计算机科学 | 数据结构 |
+------------+----------+
6 rows in set