zoukankan      html  css  js  c++  java
  • mysql数据库的十种查询方式及多表查询

    --mysql数据库的十种查询方式


    -- (1)查询时起别名

    SELECT id AS '编号',NAME AS '姓名',age AS '年龄'
     FROM student;

    -- (2)查询时添加常量列

    SELECT id AS '编号',NAME AS '姓名',age AS '年龄',
    '软件工程' AS '班级' FROM student;

    -- (3)查询时合并列
    -- 注意:只能合并数值列

    SELECT id,NAME,age,math,english,
    (math+english) AS '总成绩' FROM  student;

    -- (4)查询时去除重复

    SELECT DISTINCT(address) FROM student;

    -- 另一种方式

    SELECT DISTINCT address FROM student;

    -- (5)条件查询
    -- 1.逻辑条件(and与 or或)
    -- 1.1查询id=1且age=18的学生信息

    SELECT * FROM student WHERE id=1 AND age=18;

    -- 1.2查询age=18或age=20的学生

    SELECT * FROM student WHERE age=18 OR age=20;

    -- 1.3查询(id=1且age=18)或者(age=20)的学生

    SELECT * FROM student WHERE id=1 AND age=18 OR age = 20;

    -- 2.比较条件(> < >= <= = <>(不等于))
    -- 2.1查询年龄>=19的学生

    SELECT * FROM student WHERE age >= 19;

    -- 2.2查询年龄大于等于18且id不为2的学生

    SELECT * FROM student WHERE age>=18 AND id<>2;

    -- 2.3查询id大于1或者age小于等于19的学生

    SELECT * FROM student WHERE id> 1 OR age <=19;

    -- 2.4查询姓名不为''空字符串的学生
    -- 注意:<>''将空字符串和null都去除了

    SELECT * FROM student WHERE NAME <> '';

    -- 3.判空条件(is not null不为空,is null为空)
    -- 3.1查询姓名为null的学生

    SELECT * FROM student WHERE NAME IS NULL;

    -- 3.2查询姓名不为null的学生
    -- 注意:''空字符串和null是不同的

    SELECT * FROM student WHERE NAME IS NOT NULL;

    -- 4.模糊查询(like)
    -- %表示占位符或统配符,代表任意字符串或什么都不写
    -- _表示占位符,代表任意单个字符
    -- 4.1查询姓张的学生

    SELECT * FROM student WHERE NAME LIKE '张%';

    -- 4.2查询姓名中包含'三'的学生

    SELECT * FROM student WHERE NAME LIKE '%三%';

    -- 4.3查询名字中包含三的学生,且名字为3个字

    SELECT * FROM student WHERE NAME LIKE '_三_';

    -- (6)聚合函数
    -- max()最大值 min()最小值 AVG()平均值 
    -- round()保留几位小数 count()统计记录数
    -- 1.求出数学成绩的最高分

    SELECT MAX(math) FROM student;

    -- 2.查询数学成绩最高分的学生信息
    -- 使用子查询(in),表示在某个范围

    SELECT * FROM student WHERE math IN
     (SELECT MAX(math) FROM student);

    -- 3.求出英语成绩的最低分

    SELECT MIN(english) FROM student;

    -- 4.求数学成绩的平均成绩

    SELECT AVG(math) FROM student;

    -- 5.保留2位小数(四舍五入)

    SELECT ROUND(math,2) FROM student;

    -- 6.统计姓名字段有多少条记录
    -- 注意:不包含null数据

    SELECT COUNT(NAME) FROM student;

    -- 7.查询student里共有多少条记录(数据)
    -- *通配符,表示查询所有字段

    SELECT COUNT(*) FROM student;

    -- (7)查询后排序(order by)
    -- 注意:order by必须写在where条件的后面
    -- asc升序:按照字典序a-z从小到大排序
    -- desc降序:按照字典序从大到小排序
    -- 1.对英语成绩降序排序

    SELECT * FROM student ORDER BY english DESC;

    -- 2.对英语成绩降序排序,对数学成绩升序排序
    -- 注意:先按照英语成绩降序排序,
    -- 当英语成绩相同时按数学成绩升序排序

    SELECT * FROM student ORDER BY english DESC,math ASC;

    -- 3.对数学成绩进行排序
    -- 没有写排序方式,默认按升序排序
    -- 默认升序可以省略不写

    SELECT *FROM student ORDER BY english,math;

    -- (8)分页查询(limit m,n)
    -- limit m,n m表示从哪个下标开始,选取n条数据
    -- 这里n表示每页显示的条数
    -- 对student表里的6条数据分页,每页显示2条,共3页
    -- 第一页: 0~1

    SELECT * FROM student LIMIT 0,2;

    -- limit (1-1)*2,2  limit 0,2
    -- 第二页: 2~3

    SELECT * FROM student LIMIT 2,2;

    -- limit (2-1)*2,2  limit 2,2
    -- 第三页: 4~5

    SELECT * FROM student LIMIT 4,2;

    -- limit (3-1)*2,2  limit 4,2
    -- 需求:假如表里有1000条数据,每页显示20条
    -- 请问第34页显示的那些数据?
    -- 推理分页公式:limit (第几页-1)*n,n
    -- limit (34-1)*20,20

    -- (9)分组查询(group by)
    -- 1.需求:查询每个地区的学生有多少人
    -- 显示结果:地区  人数

    SELECT address AS '地区',COUNT(*) AS '人数'
     FROM student GROUP BY address;

    -- (10)分组查询后筛选(having)
    -- 2.需求:查询地区人数>=2人的地区

    SELECT address AS '地区',COUNT(*) AS '人数'
     FROM student GROUP BY address HAVING COUNT(*)>2;

    -- 多表查询
    -- 创建学生表
    -- 任务:查询学生姓名和所在的班级名称
    -- (1)交叉查询(错误)
    -- 交叉查询的结果为笛卡尔积(6*3=18)错误
    -- 交叉查询会将每种情况都列举出来(错误)

    SELECT s.name,c.name FROM student s,class c;

    -- (2)内连接查询(最常用)
    -- 只有符合连接条件的数据才会显示出来
    -- 多表查询的3要素
    -- a.要查哪些字段  b.要查哪些表   c.连接条件

    SELECT s.name,c.name FROM student s 
     INNER JOIN class c ON s.classid=c.id;

    -- 简写=

    SELECT s.name,c.name FROM student s,class c
     WHERE s.classid = c.id;

    -- (3)左外连接查询(常用)
    -- 左表(student表):左表里的数据全部显示出来
    -- 右表(class表):右表只有符合连接条件的数据才会显示

    SELECT s.name,c.name FROM student s
     LEFT OUTER JOIN class c ON s.classid = c.id;

    -- (4)右外连接查询(次常用)
    -- 右外连接查询看成是左外连接查询倒过来
    -- 左表(class表):左表只有符合连接条件的数据才会显示
    -- 右表(student表):右表里的数据全部显示出来

    SELECT s.name,c.name FROM class c 
     RIGHT OUTER JOIN student s ON c.id=s.classid;

    -- (5)自连接查询
    -- 任务:查询员工名字和其上司姓名

    CREATE TABLE employee(
    id INT PRIMARY KEY,
    NAME VARCHAR(10),
    bossid INT
    );

    -- 插入数据

    INSERT INTO employee VALUES (1,'张三',2);
    INSERT INTO employee VALUES (2,'李四',3);
    INSERT INTO employee VALUES (3,'王五',4);
    INSERT INTO employee VALUES (4,'陈六',5);
    INSERT INTO employee VALUES (5,'老王',NULL);
    SELECT * FROM employee;

    -- 任务:查询员工名字和其上司姓名
    -- 自连接查询的原理:使用左外连接查询,
    -- 只是左表和右表是同一张表

    SELECT e1.name,e2.name FROM employee e1 
    LEFT OUTER JOIN employee e2 ON e1.bossid = e2.id;
  • 相关阅读:
    一些常用编程经验
    “一键GHOST”系统备份与还原(icmzn)
    office2010安装不成功提示缺少MSXML 6.10.1129.0?
    python 的几种启动方式
    win7 环境安装Python + IDE(vs2010)开发
    U盘单个文件最大4G限制问题
    第一百零三节,JavaScript对象和数组
    第一百零二节,JavaScript函数
    第一百零一节,JavaScript流程控制语句
    第一百节,JavaScript表达式中的运算符
  • 原文地址:https://www.cnblogs.com/xiaogongjin/p/11396412.html
Copyright © 2011-2022 走看看