• SQL入门


    SQL语言关键字不区分大小写!!!但是,针对不同的数据库,对于表名和列名,有的数据库区分大小写,有的数据库不区分大小写。同一个数据库,有的在Linux上区分大小写,有的在Windows上不区分大小写。此处:SQL关键字总是大写,以示突出,表名和列名均使用小写。

    1,主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL

    可以使用多个列作为联合主键,但联合主键并不常用。

    2,SELECT可以用作计算,但它并不是SQL的强项。但是,不带FROM子句的SELECT语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条SELECT 1;来测试数据库连接

    SELECT * FROM <表名>    //SELECT是关键字,表示将要执行一个查询,*表示“所有列”,FROM表示将要从哪个表查询
    SELECT 100+100 //200
    SELECT 1        //1

    3,条件查询

    SELECT * FROM <表名> WHERE <条件表达式>    --条件表达式可以用<条件1> AND <条件2>表达满足条件1并且满足条件2
    
    SELECT * FROM students WHERE score >= 80 AND sex= 'M';
    --sex列存储的是字符串,需要用单引号括起来
    
    --第二种条件是<条件1> OR <条件2>,表示满足条件1或者满足条件2
    
    --第三种条件是NOT <条件>,表示“不符合该条件”的记录
    SELECT * FROM students WHERE NOT sex= 'M';    --等价于sex<>'M'
    
    --多条件查询要用小括号(),如果不加括号,条件运算按照NOT、AND、OR的优先级进行
    SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M';
    
    
    --使用LIKE判断相似    name LIKE 'ab%'    name LIKE '%bc%'    %表示任意字符,例如'ab%'将匹配'ab','abc','abcd'
    
    WHERE score BETWEEN 60 AND 90  --between60~90之间

    4,如果我们只希望返回指定列数据,而不是所有列的数据,我们可以用SELECT 列1, 列2, 列3 FROM ...,让结果集仅包含指定列。这种操作称为投影查

    SELECT id, name, sex FROM students;
    --只返回索引,姓名,性别
    
    --使用SELECT 列1, 列2, 列3 FROM ...时,还可以给结果集的列进行重命名每一列起个别名,SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM ...。
    SELECT id, name user, sex FROM students;

    5,默认按照主键排序

    SELECT id, name, score  FROM students ORDER BY score;
    --按score从低到高
    
    SELECT id, name, score FROM students ORDER BY score DESC;
    --加上DESC表示“倒序”:
    
    SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;
    --如果score列有相同的数据,要进一步排序,可以继续添加列名。例如,使用ORDER BY score DESC, gender表示先按score列倒序,如果有相同分数的,再按gender列排序
    
    SELECT id, name, gender, score
    FROM students
    WHERE class_id = 1
    ORDER BY score DESC;
    --字符串排序要注意,数据库可以指定排序的编码,所以并不一定总是按unicode排序,要看建表的设定

    6,使用LIMIT <M> OFFSET <N>可以对结果集进行分页,每次查询返回结果集的一部分;随着N越来越大,查询效率也会越来越低。

    SELECT id, name, gender, score
    FROM students
    ORDER BY score DESC
    LIMIT 3 OFFSET 0;
    --对结果集从0号记录开始,最多取3条。注意SQL记录集的索引从0开始
    
    SELECT id, name, gender, score
    FROM students
    ORDER BY score DESC
    LIMIT 3 OFFSET 6;    --简写成LIMIT 3, 6
    -- 查询第3页的时候,OFFSET应该设定为6:
    
    --LIMIT总是设定为pageSize;
    --OFFSET计算公式为pageSize * (pageIndex - 1)是可选的默认0

    7,聚合查询,如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()AVG()MAX()MIN()会返回NULL

    SELECT COUNT(*) FROM students;
    --查询students表一共有多少条记录
    
    SELECT COUNT(*) num FROM students;
    ---- 使用聚合查询并设置结果集的列名为num
    
    SELECT COUNT(*) boys FROM students WHERE sex= 'M';
    --统计男生个数
    
    SELECT AVG(score) boyAverage FROM students WHERE gender = 'M';
    --男生成绩平均值

    SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;
    --分组统计每个class_id 组中人多个数

    SELECT class_id, sex, COUNT(*) num FROM students GROUP BY class_id, sex;
    -- 按class_id, gender分组
    SUM 计算某一列的合计值,该列必须为数值类型
    AVG 计算某一列的平均值,该列必须为数值类型
    MAX 计算某一列的最大值
    MIN 计算某一列的最小值

    8,多表查询 SELECT * FROM <表1> <表2>。查询的结果也是一个二维表,它是表1和表2的“乘积”

    SELECT
        students.id sid,
        students.name,
        students.gender,
        students.score,
        classes.id cid,
        classes.name cname
    FROM students, classes;
    --对于多表查询,出现相同列名称,利用投影查询的“设置列的别名”
    
    方法二:
    SELECT
        s.id sid,
        s.name,
        s.gender,
        s.score,
        c.id cid,
        c.name cname
    FROM students s, classes c;

    9,连接查询

    SELECT 
    s.id, 
    s.name, 
    s.class_id, 
    c.name class_name,   --改名
    s.gender, 
    s.score
    FROM students s    --确定主表
    INNER JOIN classes c     --连接的表,使用INNER JOIN <表2>
    ON s.class_id = c.id  --使用ON <条件...>,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接  
    WHERE s.score>80
    ORDER BY s.score;  分号表示语句结束
    --内连接查询表一并把表二的相关数据对应查出
    
    --外连接OUTER JOIN,如果表1和表二class_id > c.id个数,LEFT 表示从左查,则表2没有的字段会出现NULL;如果RIGHT从右查 则不会出现NULL;FULL 会出现NULL SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score FROM students s RIGHT OUTER JOIN classes c ON s.class_id = c.id;

    10,插入数据 INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);

    INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80);
    INSERT INTO students (class_id, name, gender, score) VALUES
      (1, '大宝', 'M', 87),
      (2, '二宝', 'M', 81);
    --如果一个字段有默认值,那么在INSERT语句中也可以不出现,比如主键。
    --字段顺序不必和数据库表的字段顺序一致,但值的顺序必须和字段顺序一致
    --可以一次插入多条
    -- 查询并观察结果:
    SELECT * FROM students;
    
    
    
    --更新数据UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
    UPDATE students SET name='大牛', score=66 WHERE id=1;
    UPDATE students SET score=score+10 WHERE score<80;
    -- 查询并观察结果:
    SELECT * FROM students WHERE id=1;
    
    
    --删除语句 DELETE FROM <表名> WHERE ...;
    DELETE FROM students WHERE id=1;
    -- 查询并观察结果:
    SELECT * FROM students;

    -- 除了id=1,id =2其他都删除
    DELETE FROM `students` WHERE id NOT IN(1, 2)

    11,

    SHOW DATABASES;
    --列出所有数据库
    CREATE DATABASE test;
    --创建数据库
    DROP DATABASE test;
    --删除数据库
    USE test
    --对一个数据库进行操作时,要首先将其切换为当前数据库
    
    SHOW TABLES
    --列出当前数据库的所有表
    DESC students
    --查看一个表的结构
    SHOW CREATE TABLE students
    --查看创建表的SQL语句
    DROP TABLE students    --删除表
    EXIT仅仅断开了客户端和服务器的连接,MySQL服务器仍然继续运行。
    
    
    --插入或替换
    REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
    --若id=1的记录不存在,REPLACE语句将插入新记录,否则,当前id=1的记录将被删除,然后再插入新记录。
    --插入或更新
    INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99) ON DUPLICATE KEY UPDATE name='小明', gender='F', score=99;
    --插入或忽略
    INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'F', 99);
    
    -- 对class_id=1的记录进行快照,并存储为新表students_of_class1:
    CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;

    参考:https://www.liaoxuefeng.com/wiki/1177760294764384/1246617682185952

    本想把日子过成诗,时而简单,时而精致,不料日子却过成了一首歌,时而不靠谱,时而不着调
  • 相关阅读:
    Javascript Promise对象学习
    JavaScript 判断一个对象的数据类型。
    Angular SEO方案
    【GOF23设计模式】迭代器模式
    【GOF23设计模式】责任链模式
    【GOF23设计模式】享元模式
    【GOF23设计模式】外观模式
    【GOF23设计模式】装饰模式
    【GOF23设计模式】组合模式
    【GOF23设计模式】桥接模式
  • 原文地址:https://www.cnblogs.com/chuanq/p/11078848.html
Copyright © 2020-2023  润新知