目录
- 3.1.查询表中的单个字段
-
- SELECT last_name FROM t_mysql_employees;
-
- 3.2.查询表中的多个字段
- SELECT last_name,salary,email FROM t_mysql_employees;
-
- 3.3.查询表中的所有字段
-
- 方式一:
- SELECT
- `employee_id`,
- `first_name`,
- `last_name`,
- `phone_number`,
- `last_name`,
- `job_id`,
- `phone_number`,
- `job_id`,
- `salary`,
- `commission_pct`,
- `manager_id`,
- `department_id`,
- `hiredate`
- FROM
- t_mysql_employees ;
- 方式二:
- SELECT * FROM t_mysql_employees;
-
- 3.4.查询常量值
- SELECT 100;
- SELECT 'john';
-
- 3.5.查询表达式
- SELECT 100%98;
-
- 3.6.查询函数
-
- SELECT VERSION();
SELECT DISTINCT department_id FROM t_mysql_employees;
- 语法:
- select
- 查询列表
- from
- 表名
- where
- 筛选条件;
-
- 分类:
- 一、按条件表达式筛选
-
- 简单条件运算符:> < = != <> >= <=
-
- 二、按逻辑表达式筛选
- 逻辑运算符:
- 作用:用于连接条件表达式
- && || !
- and or not
-
- &&和and:两个条件都为true,结果为true,反之为false
- ||或or: 只要有一个条件为true,结果为true,反之为false
- !或not: 如果连接的条件本身为false,结果为true,反之为false
-
- 三、模糊查询
- like
- between and
- in
- is null
-
- */
- #一、按条件表达式筛选
-
- #案例1:查询工资>12000的员工信息
-
- SELECT
- *
- FROM
- t_mysql_employees
- WHERE
- salary>12000;
-
-
- #案例2:查询部门编号不等于90号的员工名和部门编号
- SELECT
- last_name,
- department_id
- FROM
- t_mysql_employees
- WHERE
- department_id<>90;
-
-
- #二、按逻辑表达式筛选
-
- #案例1:查询工资z在10000到20000之间的员工名、工资以及奖金
- SELECT
- last_name,
- salary,
- commission_pct
- FROM
- t_mysql_employees
- WHERE
- salary>=10000 AND salary<=20000;
- #案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
- SELECT
- *
- FROM
- t_mysql_employees
- WHERE
- NOT(department_id>=90 AND department_id<=110) OR salary>15000;
- #三、模糊查询
- /*
- like
-
- between and
- in
- is null|is not null
-
- */
- #1.like
- /*
- 特点:
- ①一般和通配符搭配使用
- 通配符:
- % 任意多个字符,包含0个字符
- _ 任意单个字符
- *、
-
- #案例1:查询员工名中包含字符a的员工信息
-
- select
- *
- from
- employees
- where
- last_name like '%a%';#abc
- #案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
- select
- last_name,
- salary
- FROM
- t_mysql_employees
- WHERE
- last_name LIKE '__n_l%';
-
-
-
- 案例3:查询员工名中第二个字符为_的员工名
-
- SELECT
- last_name
- FROM
- t_mysql_employees
- WHERE
- last_name LIKE '_$_%' ESCAPE '$';
- 2.between and
- /*
- ①使用between and 可以提高语句的简洁度
- ②包含临界值
- ③两个临界值不要调换顺序
-
- */
-
-
- #案例1:查询员工编号在100到120之间的员工信息
-
- SELECT
- *
- FROM
- t_mysql_employees
- WHERE
- employee_id <= 120 AND employee_id>=100;
- #----------------------
- SELECT
- *
- FROM
- t_mysql_employees
- WHERE
- employee_id BETWEEN 100 AND 120;
-
-
- #3.in
- /*
- 含义:判断某字段的值是否属于in列表中的某一项
- 特点:
- ①使用in提高语句简洁度
- ②in列表的值类型必须一致或兼容
- ③in列表中不支持通配符
-
- */
- #案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
-
- SELECT
- last_name,
- job_id
- FROM
- t_mysql_employees
- WHERE
- job_id = 'IT_PROT' OR job_id = 'AD_VP' OR JOB_ID ='AD_PRES';
-
-
- #------------------
-
- SELECT
- last_name,
- job_id
- FROM
- t_mysql_employees
- WHERE
- job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');
-
- #4、is null
- /*
- =或<>不能用于判断null值
- is null或is not null 可以判断null值
-
-
-
-
- */
-
- #案例1:查询没有奖金的员工名和奖金率
- SELECT
- last_name,
- commission_pct
- FROM
- t_mysql_employees
- WHERE
- commission_pct IS NULL;
-
-
- #案例1:查询有奖金的员工名和奖金率
- SELECT
- last_name,
- commission_pct
- FROM
- t_mysql_employees
- WHERE
- commission_pct IS NOT NULL;
-
- #----------以下为×
- SELECT
- last_name,
- commission_pct
- FROM
- t_mysql_employees
-
- WHERE
- salary IS 12000;
-
-
- #安全等于 <=>
-
-
- #案例1:查询没有奖金的员工名和奖金率
- SELECT
- last_name,
- commission_pct
- FROM
- t_mysql_employees
- WHERE
- commission_pct <=>NULL;
-
-
- #案例2:查询工资为12000的员工信息
- SELECT
- last_name,
- salary
- FROM
- t_mysql_employees
-
- WHERE
- salary <=> 12000;
-
-
- #is null pk <=>
-
- IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
- <=> :既可以判断NULL值,又可以判断普通的数值,可读性较低
- 1、按单个字段排序
- 案例:按员工表薪资排序
- SELECT * FROM t_mysql_employees ORDER BY salary DESC;
- 2、添加筛选条件再排序
- 案例:查询部门编号>=90的员工信息,并按员工编号降序
- SELECT * FROM t_mysql_employees WHERE department_id>=90 ORDER BY employee_id DESC;
- 3、按表达式排序
- 案例:查询员工信息 按年薪降序
- SELECT *,salary*12*(1+IFNULL(commission_pct,0)) FROM t_mysql_employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
- 4、按别名排序
- 案例:查询员工信息 按年薪升序
- SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM t_mysql_employees
- 5、按函数排序
- 案例:查询员工名,并且按名字的长度降序
- SELECT LENGTH(last_name),last_name FROM t_mysql_employees ORDER BY LENGTH(last_name) DESC;
- 6、按多个字段排序
- 案例:查询员工信息,要求先按工资降序,再按employee_id升序
- SELECT * FROM t_mysql_employees ORDER BY salary DESC,employee_id ASC;
- 1.查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
- select last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) from t_mysql_employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) desc,last_name asc
- 2.选择工资不在8000到17000的员工的姓名和工资,按工资降序
- SELECT last_name,salary from t_mysql_employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) desc,salary not in(8000,17000)
- 3.查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
- SELECT * from t_mysql_employees where email like '%e%' ORDER BY LENGTH(email) desc ,department_id asc
- -- 1.学生表-t_student
- -- sid 学生编号,sname 学生姓名,sage 学生年龄,ssex 学生性别
- CREATE TABLE t_student(
- sid VARCHAR(20),
- sname VARCHAR(20),
- sage date,
- ssex VARCHAR(20)
- )
-
- -- 2.教师表-t_teacher
- -- tid 教师编号,tname 教师名称
- create table t_teacher(
- tid VARCHAR(20),
- tname VARCHAR(20)
- )
-
- -- 3.课程表-t_course
- -- cid 课程编号,cname 课程名称,tid 教师名称
- create table t_course(
- cid VARCHAR(20),
- cname VARCHAR(20),
- tid VARCHAR(20)
- )
-
- -- 4.成绩表-t_score
- -- sid 学生编号,cid 课程编号,score 成绩
- CREATE table t_score(
- sid VARCHAR(20),
- cid VARCHAR(20),
- score INT
- )
-
-
-
-
-
- -- 学生表
- insert into t_student values('01' , '赵雷' , '1990-01-01' , '男');
- insert into t_student values('02' , '钱电' , '1990-12-21' , '男');
- insert into t_student values('03' , '孙风' , '1990-12-20' , '男');
- insert into t_student values('04' , '李云' , '1990-12-06' , '男');
- insert into t_student values('05' , '周梅' , '1991-12-01' , '女');
- insert into t_student values('06' , '吴兰' , '1992-01-01' , '女');
- insert into t_student values('07' , '郑竹' , '1989-01-01' , '女');
- insert into t_student values('09' , '张三' , '2017-12-20' , '女');
- insert into t_student values('10' , '李四' , '2017-12-25' , '女');
- insert into t_student values('11' , '李四' , '2012-06-06' , '女');
- insert into t_student values('12' , '赵六' , '2013-06-13' , '女');
- insert into t_student values('13' , '孙七' , '2014-06-01' , '女');
-
- -- 教师表
- insert into t_teacher values('01' , '张三');
- insert into t_teacher values('02' , '李四');
- insert into t_teacher values('03' , '王五');
-
- -- 成绩表
- insert into t_score values('01' , '01' , 80);
- insert into t_score values('01' , '02' , 90);
- insert into t_score values('01' , '03' , 99);
- insert into t_score values('02' , '01' , 70);
- insert into t_score values('02' , '02' , 60);
- insert into t_score values('02' , '03' , 80);
- insert into t_score values('03' , '01' , 80);
- insert into t_score values('03' , '02' , 80);
- insert into t_score values('03' , '03' , 80);
- insert into t_score values('04' , '01' , 50);
- insert into t_score values('04' , '02' , 30);
- insert into t_score values('04' , '03' , 20);
- insert into t_score values('05' , '01' , 76);
- insert into t_score values('05' , '02' , 87);
- insert into t_score values('06' , '01' , 31);
- insert into t_score values('06' , '03' , 34);
- insert into t_score values('07' , '02' , 89);
- insert into t_score values('07' , '03' , 98);
-
-
-
- -- 课程表
- insert into t_course values('01' , '语文' , '02');
- insert into t_course values('02' , '数学' , '01');
- insert into t_course values('03' , '英语' , '03');
-
- select * from t_course
-
- select * from t_score
-
- select * from t_teacher
-
- select * from t_student
- SELECT a.*,b.score 01score,c.score 02score
- FROM t_student as a
- INNER JOIN t_score as b
- ON a.sid = b.sid
- INNER JOIN t_score as c
- ON a.sid = c.sid and b.cid = '01' and c.cid = '02'
- where b.score > c.score;
- SELECT * FROM
- (SELECT * FROM t_score WHERE cId = '01') AS a
- INNER JOIN (SELECT * FROM t_score WHERE cId = '02') AS b
- ON a.sId = b.sId;
- SELECT * from
- (SELECT * from t_score where cid ='01') as a
- LEFT JOIN t_score AS b
- ON a.sId = b.sId AND b.cId = '02';
- select * from t_score where sid not in (
- SELECT sid FROM t_score WHERE cId = '01'
- )and cid = '02'
- SELECT a.sid,a.sname,b.c from
- t_student as a
- INNER JOIN (SELECT sid,AVG(score) AS c
- FROM t_score
- GROUP BY sid
- HAVING AVG(score) >= 60) AS b
- ON a.sid = b.sid;
- SELECT b.* from
- (SELECT sid from t_score GROUP BY sid) a
- LEFT JOIN t_student b
- on a.sid=b.sid
- SELECT a.sid,a.sname,b.zs,b.zcj
- FROM t_student AS a
- LEFT JOIN (SELECT sid,COUNT(cid) AS zs,SUM(score) AS zcj
- FROM t_score
- GROUP BY sid) AS b
- ON a.sid = b.sid;
select count(*) from t_teacher where tname like '李%'
- select * from t_student where sid in (
- select sid from t_score where cid =(
- select cid from t_course where tid =(
- select tid from t_teacher where tname ='张三'
- )
- )
- )
- SELECT a.*,kc
- FROM t_student AS a
- INNER JOIN (SELECT sid,COUNT(cid) AS kc
- FROM t_score
- GROUP BY sid
- HAVING kc < (SELECT COUNT(cid) FROM t_course)) AS b
- ON a.sid = b.sid;
- SELECT sname
- FROM t_student AS a
- WHERE sid NOT IN (SELECT sid
- FROM t_score AS a
- LEFT JOIN t_course AS b
- ON a.cid = b.cid
- INNER JOIN t_teacher AS c
- ON b.tid = c.tid
- WHERE tname = '张三');
- SELECT c.sid,d.sname,pjf
- FROM(SELECT a.sid,AVG(score) AS pjf
- FROM t_score AS a
- INNER JOIN(SELECT sid
- FROM t_score
- WHERE score < 60
- GROUP BY sid
- HAVING COUNT(cid) >= 2) AS b
- ON a.sid = b.sid
- GROUP BY a.sid) AS c
- LEFT JOIN t_student AS d
- ON c.sid = d.sid;
- SELECT b.*,a.score
- FROM(SELECT sid,score
- FROM t_score
- WHERE cid = '01' AND score < 60) AS a
- LEFT JOIN t_student AS b
- ON a.sid = b.sid
- ORDER BY a.score desc;
- SELECT a.sid,a.cid,a.score,pjcj
- FROM(SELECT a.sid,b.cid,b.score
- FROM t_student AS a
- LEFT JOIN t_score AS b
- ON a.sid = b.sid) AS a
- LEFT JOIN (SELECT sid,AVG(score) AS pjcj
- FROM t_score
- GROUP BY sid) AS b
- ON a.sid = b.sid
- ORDER BY b.pjcj DESC;
- SELECT a.*,b.Cname
- FROM(SELECT
- cid,
- COUNT(*) AS 选修人数,
- MAX(score) AS 最高分,
- MIN(score) AS 最低分,
- AVG(score) AS 平均分,
- SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*) AS 及格率,
- SUM(CASE WHEN score >= 70 AND score < 80 THEN 1 ELSE 0 END) / COUNT(*) AS 中等率,
- SUM(CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优良率,
- SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优秀率
- FROM t_score
- GROUP BY cid
- ORDER BY COUNT(*) DESC,CId ASC) AS a
- LEFT JOIN t_course AS b
- ON a.cid = b.cid;