zoukankan      html  css  js  c++  java
  • MySQL数据库操作(6)查询

    准备工作

    创建并进入数据库:

    CREATE DATABASE `info`;
    USE `info`;

    #创建学院表:

    CREATE TABLE `department`(
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(20) NOT NULL
    );

    #创建学生表:

    CREATE TABLE `student`(
    `s_id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(20) NOT NULL,
    `dept_id` INT,
    FOREIGN KEY(`dept_id`) REFERENCES `department` (`id`)
    );

    #创建学生的详细信息表:

    CREATE TABLE `stu_details`(
    `s_id` INT PRIMARY KEY,
    `age` INT,
    `sex` CHAR(1),
    FOREIGN KEY(`s_id`) REFERENCES `student` (`s_id`)
    );

    #创建课程表:

    CREATE TABLE `course`(
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(20) NOT NULL
    );

    #创建中间表:

    CREATE TABLE `select`(
    `s_id` INT,
    `c_id` INT,
    PRIMARY KEY (`s_id`,`c_id`),
    FOREIGN KEY (`s_id`) REFERENCES `student`(`s_id`),
    FOREIGN KEY (`c_id`) REFERENCES `course`(`id`)
    );

    #查看当前存在的表:

    SHOW TABLES;

    #往学院表中添加数据:

    INSERT INTO `department`(`name`)
    VALUES('English'),('Art'),('Computer'),('Alchemy');

    #往学生表中添加数据:

    INSERT INTO `student`(`name`,`dept_id`)
    VALUES('David',1),('Lucy',3),('Lily',3),('John',4),('Jack',2),('Alfred',3);

    #往学生详细信息表中添加数据:

    INSERT INTO stu_details
    VALUES(1,18,'M'),(4,20,'M'),(3,16,'F'),(2,19,'F');

    #往课程表中添加数据:

    INSERT INTO `course`(`name`)
    VALUES ('Math'),('Python'),('Test'), ('Music');

    #往中间表中添加数据:

    INSERT INTO `select`
    VALUES(1,2),(1,4),(2,1),(2,4),(4,1),(4,2),(4,4);

    查询

    查询所有记录:
    SELECT * FROM 表名;
    例:

    SELECT * FROM `department`;
    SELECT * FROM `student`;
    SELECT * FROM `stu_details`;
    SELECT * FROM `course`;
    SELECT * FROM `select`;

    查询指定列记录:

    SELECT 列名1,列名2 FROM 表名;
    例:

    SELECT s_id,sex FROM `stu_details`;

    查询指定条件下的记录:

    SELECT 列名 FROM 表名 WHERE 条件;
    例:

    SELECT s_id,sex FROM `stu_details` WHERE age<19;

    查询后为列取别名:

    SELECT 列名 [AS] 别名 FROM 表名;
    别名仅仅是显示在表头上
    例:

    SELECT name AS `nn` ,dept_id AS dd FROM student WHERE s_id>=2;
    SELECT name nn ,dept_id dd FROM student WHERE s_id>=2;

    模糊查询:

    SELECT 列名 FROM 表名 WHERE 条件列 LIKE 匹配字符串;
    % 匹配0~n个字符
    _ 匹配一个字符
    例:

    SELECT * FROM student WHERE name LIKE 'L%';
    SELECT * FROM student WHERE name LIKE '__fr%';

    逻辑运算符 OR AND :

    例:

    SELECT s_id,sex FROM `stu_details` WHERE age<20 AND sex='M';
    SELECT s_id,sex FROM `stu_details` WHERE age>=20 OR sex='F';

    判断为null,不用 = ,只能用 IS, IS NOT

    例:

    SELECT * FROM student WHERE dept_id IS NULL;
    SELECT * FROM student WHERE dept_id IS NOT NULL;

    IN , NOT IN

    SELECT * FROM student WHERE dept_id NOT IN (1,3);
    SELECT * FROM student WHERE dept_id IN (1,3);

    排序`ORDER BY`:

    `ASC`升序(默认) `DESC`降序
    例:
    按学生学号升序输出

    SELECT * FROM `select` ORDER BY `s_id`;

    按课程id降序输出

    SELECT * FROM `select` ORDER BY `c_id` DESC;

    限制显示数据的数量`LIMIT`:

    LIMIT n 从第0条开始,往后面取n条
    LIMIT m,n 从第m条开始,往后面取n条
    例:
    按学生学号升序输出的前4条数据

    SELECT * FROM `select` ORDER BY `s_id` LIMIT 4; 

    按学生学号升序输出的从第2条开始的4条数据(数据索引从0开始)

    SELECT * FROM `select` ORDER BY `s_id` LIMIT 2,4;

    分组查询`GROUP BY` :

    GROUP BY 只能跟聚合函数一起用, 一般用 做统计
    一个分组内值可能会不同的列,不用用作select,例如:SELECT s_id , age ,sex FROM stu_details GROUP BY sex;是非法的,因为每个sex分组中的元素,s_id和age都是不同的。
    例:

    SELECT sex , MAX(age) FROM stu_details GROUP BY sex;

    将组内每个元素拼成字符串,并且用指定的分隔符来分隔

    SELECT dept_id,GROUT_CONCAT(s_id,name SEPARATOR ',') FROM student GROUP BY `dept_id`;

    聚合函数:

    ----------------------------------------------------
    | AVG(column) | 返回某列的平均值 |
    | COUNT(column) | 返回某列的行数(不包括 NULL 值) |
    | COUNT(*) | 返回被选行数 |
    | FIRST(column) | 返回在指定的域中第一个记录的值 |
    | LAST(column) | 返回在指定的域中最后一个记录的值 |
    | MAX(column) | 返回某列的最高值 |
    | MIN(column) | 返回某列的最低值 |
    | SUM(column) | 返回某列的总和 |
    ----------------------------------------------------
    HAVING分组条件:
    HAVING 后的字段必须是SELECT后出现过的,并且可以使用别名
    WHERE:带着条件去表里面,删选内容。
    HAVING:SELECT出来了结果,再进行一次删选。
    例:

    SELECT dept_id ,count(dept_id) AS n FROM student GROUP BY `dept_id` HAVING n=1;

    子查询
    出现在其他SQL语句内的SELECT字句。
    1)嵌套在查询内部
    2)必须始终出现在圆括号内
    3)可以包含多个关键字或条件
    把另一个SQL的结果,当成数据,直接拿过来用。
    例:
    # 求出学生的平均年龄

    SELECT AVG(`age`) FROM `stu_details`;

    #查找出大于平均年龄的数据

    SELECT * FROM `stu_details` WHERE `age`>18.25;

    #将平均数的SQL语句作为子查询放入上一条语句中

    SELECT * FROM `stu_details` WHERE `age`>(SELECT AVG(`age`) FROM `stu_details`);

    #选出学院为Computer和English的学生,先选出学院ID,再找出符合的学生ID

    SELECT * FROM student WHERE dept_id IN (SELECT id FROM department WHERE name IN ('Computer','English') );
  • 相关阅读:
    Redis入门指南
    大公司都有哪些开源项目~~~阿里,百度,腾讯,360,新浪,网易,小米等
    01 背包问题和完全背包
    糖果(动规)
    数的划分(动规)
    鸣人的影分身(动规)
    股票买卖(动规)
    大盗阿福(动规)
    公共子序列(动规)
    滑雪(动规)
  • 原文地址:https://www.cnblogs.com/ikamu/p/8367529.html
Copyright © 2011-2022 走看看