数据库基本查询

1.语法

Select * | 列名1, 列名2...
From 表名1, 表名2...
Where 条件1 [and 条件2] [or 条件3]
Group by --分组查询
Having --分组比较
Order by --排序

2.全查询
– 查询全部老师的信息
–没有查询条件的时候

Select* from teacher

3.查询某几列
– 查询老师名字

Select teacher_name from teacher

4.条件查询
– 条件表达式:
– 第一种条件表达式: where 列名1 比较运算符 列名2
– 第二种条件表达式: where 列名1 比较运算符 数据
– 条件比较运算符
1)相等比较 =
2)大于; 小于比较
3)不相等比较 <>
4)多条件比较 and; or; not

– 案例:相等比较

SELECT * FROM student WHERE s_name = '路飞';

– 案例:大于,小于比较

SELECT * FROM student WHERE s_age > 17
SELECT * FROM student WHERE s_age >= 17
SELECT * FROM student WHERE s_age < 17

– 案例:不相等比较

SELECT * FROM student WHERE s_age <> 17

– 案例:多条件比较

SELECT * FROM student WHERE s_name = '路飞' AND s_age = 17;
SELECT * FROM student WHERE s_name = '路飞' OR s_age = 17;

– 案例:not关键字如何使用,针对数据为NULL,NULL是一个特殊数据

SELECT * FROM teacher WHERE teacher_name IS NOT NULL

5.模糊查询
1)通配符:_ 或 %
a. _:任意一个字符
b. %:任意0~n个字符
2)概念:可以查询相似的数据,关键字 like
– 语法:
Select * | 列名 from 表名 where 列名 like 通配符

– 案例:查询同学姓名是由两个字的组成

SELECT * FROM student WHERE s_name LIKE '__'--(LIKE后面是两个"_"以表示两个字长,如果三个则表示三个字长,以此类推)

– 案例:查询以‘路’开头的学生记录

SELECT * FROM student WHERE s_name LIKE '路%';

– 案例:查询名字第2个字符是“飞”的学生记录

SELECT * FROM student WHERE s_name LIKE '_飞%';

– 案例:查询姓名中包含“飞”的学生记录

SELECT * FROM student WHERE s_name LIKE '%飞%';

6)Between … And查询
– 可以去查询某一个范围内的数据
– 语法:

Select * | 列名... from 表名 where 列名 between 数据1 and 数据2

– 案例:

SELECT * FROM student WHERE s_age BETWEEN 16 AND 18;

– 扩展:根据记录总数来进行数据筛选
– 案例:查询第2条记录到第5条记录的数据
– limit 以后要用到数据库分页
– limit n,m
– n:从第几条记录开始,从0开始计算
– m:返回记录数(行数;总数)
我们的记录是从0开始的所以第2条记录到第5条数据实际上是1到4

SELECT * FROM student LIMIT 1,4

– 案例:查询满足16到18岁的同学中的第2条记录到第5条记录的数据
– 电商系统
– 搜索商品:手机 1000个手机记录
– 将商品数据进行分页

SELECT * FROM student WHERE s_age BETWEEN 16 AND 18 LIMIT 1,4

7)字段之间可以做运算

CREATE TABLE emp(
  emp_no INT PRIMARY KEY AUTO_INCREMENT,
  emp_name VARCHAR(50) NOT NULL,
  emp_sal DECIMAL(7,2) NOT NULL,
  emp_comm DECIMAL(7,2) NULL,
  emp_job VARCHAR(20)
);
INSERT INTO emp (emp_name, emp_sal, emp_comm, emp_job) VALUES ('沫沫', 7000, 2000, '咨询顾问');
INSERT INTO emp (emp_name, emp_sal, emp_comm, emp_job) VALUES ('嘟嘟', 5000, 1500.50, '市场销售');
INSERT INTO emp (emp_name, emp_sal, emp_comm, emp_job) VALUES ('朵朵', 10000, NULL, '工程师');
INSERT INTO emp (emp_name, emp_sal, emp_comm, emp_job) VALUES ('丁玉姐', 8000, 1000, '销售顾问');
INSERT INTO emp (emp_name, emp_sal, emp_comm, emp_job) VALUES ('丁老头', 10000, 2000, '架构师');
INSERT INTO emp (emp_name, emp_sal, emp_comm, emp_job) VALUES ('丁帅哥', 5000, NULL, '安保大队');
INSERT INTO emp (emp_name, emp_sal, emp_comm, emp_job) VALUES ('马达加尔', 3000, 6000, '信息安全顾问');
INSERT INTO emp (emp_name, emp_sal, emp_comm, emp_job) VALUES ('CC', 4000, 2000.10, '咨询顾问');
INSERT INTO emp (emp_name, emp_sal, emp_comm, emp_job) VALUES ('兔兔', 8000, 5000.80, '咨询顾问');

SELECT emp_no, emp_name, emp_sal + emp_comm, emp_job FROM emp;

– 注意:任何数据与NULL完成算术运算,则结果是NULL
– 解决方法:使用mysql提供的去除NULL的函数

SELECT emp_no, emp_name, emp_sal + IFNULL(emp_comm,0), emp_job FROM emp;

8)别名
a)字段别名
b)表别名
– 语法
Select 列名1 别名, 列名2 别名 from 表名1 别名

– 好处:
1)区分如果两个以上表进行连接查询,列名同名现象。建议大家去使用别名区分。
2)字段之间做运算,则我们可以为做运算的结果添加别名
3)字段通过函数进行运算,则我们也可以为 函数运算结果添加别名

– 字段运算后产生的别名

SELECT emp_no, emp_name, emp_sal + IFNULL(emp_comm, 0) sal, emp_job FROM emp;

– 函数运算后产生的别名

SELECT emp_comm, IFNULL(emp_comm, 0) comm,emp_sal FROM emp

– 表的别名

SELECT emp_name, emp_sal + IFNULL(emp_comm, 0) sal, emp_job FROM emp a WHERE a.emp_name = '沫沫'

– 表的别名, 两表中出现了相同的列名

SELECT s_name, sc_score FROM student a, student_course b
WHERE a.s_no = b.s_no AND a.s_name = '路飞';

9)排序
a)将数据查询结果进行排序
b)排序规则:ASC升序;DESC降序
c)对单个列进行排序,多个列进行排序
– 语法

Select * | 列名.. from 表名 
where 条件 
group by 分组 
having 分组比较 
order by 排序
limit n,m

– 查询顺序:数据检索顺序

Where > group by > having > order by > limit

– 案例:查询数学分数由高到低学生信息
– 如果连接查询有 n 张表,则条件(主外键关系)必须满足 n - 1

SELECT s_name,c_name,sc_score FROM student a, student_course b, course c
WHERE a.s_no = b.s_no AND c.c_no = b.c_no AND c.c_name = '霸气' ORDER BY sc_score DESC;

SELECT s_name,c_name,sc_score FROM student a, student_course b, course c
WHERE a.s_no = b.s_no AND c.c_no = b.c_no AND c.c_name = '霸气' ORDER BY sc_score DESC, s_name ASC;