zoukankan      html  css  js  c++  java
  • sql 学习笔记

    简介

    如果懒得安装 可以使用牛客网提供的 https://www.nowcoder.com/practice/1bfe3870034e4efeb4b4aa6711316c3b?tpId=82&&tqId=38359&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking
    https://www.runoob.com/sql/sql-where.html 菜鸟sql 学习
    刷题数据库.

    limit

    选取从上到下限定的数据

    where <title> like '%m'

    选中 想要的title 有 m结尾的.

    select distinct ...

    distinct 语义 不同
    选择不同的 select distinct grade_num from grade_info;

    where

    SELECT column_name,column_name
    FROM table_name
    WHERE column_name operator value;

    所有的运算符

    运算符 描述
    = 等于
    <> 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
    > 大于
    < 小于
    >= 大于等于
    <= 小于等于
    BETWEEN 在某个范围内
    LIKE 搜索某种模式
    IN 指定针对某个列的多个可能值

    AND OR

    如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
    如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

    select user_id,grade_num from grade_info
    where user_id=1 and grade_num = 1;
    
    select user_id,grade_num from grade_info
    where user_id=1 or grade_num = 1;
    

    组合成复杂的表达式

    select user_id,grade_num from grade_info
    where user_id=1 
    AND (grade_num=1 or grade_num = 3);
    

    order by

    排序关键字

    语法

    SELECT column_name,column_name
    FROM table_name
    ORDER BY column_name,column_name ASC|DESC;
    
    select user_id,grade_num from grade_info
    order by user_id DESC;
    
    select user_id,grade_num from grade_info
    order by user_id ASC;
    

    INSERT INTO

    语法

    INSERT INTO table_name
    VALUES (value1,value2,value3,...);
    
    INSERT INTO table_name (column1,column2,column3,...)
    VALUES (value1,value2,value3,...);
    

    Example:

    INSERT INTO grade_info (user_id, grade_num, type)
    VALUES (5, 1000, 200);
    

    delete

    • 语法
    UPDATE table_name
    SET column1=value1,column2=value2,...
    WHERE some_column=some_value;
    
    • example
    update grade_info 
    set user_id = 100, type = 'delete'
    where grade_num=1;
    
    • TIPS
    执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。
    在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决,当该参数开启的情况下,你必须在update 语句后携带 where 条件,否则就会报错。
    set sql_safe_updates=1; 表示开启该参数
    

    delete

    语义: 删除

    • 语法
    DELETE FROM table_name
    WHERE some_column=some_value;
    
    delete from grade_info
    where user_id=1;
    

    删除所有数据

    DELETE FROM table_name;

    SQL 通配符

    在SQL中, 通配符有如下几种

    运算符 描述
    % 替代0个或多个字符
    _ 替代一个字符
    [charlist] 字符列中的任何单一字符
    [^charlist] 或 [!charlist] 不在字符列中的任何单一字符
    [1] 以字符列开头的字符串
    [charlist]$ 以字符列结尾的字符串
    • example
    select * from grade_info
    where type like 'ad_';
    

    IN

    即在列表之中

    SELECT column_name(s)
    FROM table_name
    WHERE column_name IN (value1,value2,...);
    
    • example
    select * from grade_info
    where grade_num in (3,2,4);
    

    BETWEEN

    BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。

    SELECT column_name(s)
    FROM table_name
    WHERE column_name BETWEEN value1 AND value2;
    
    select * from grade_info
    where grade_num between 1 and 3;
    
    • tips
      包括端点

    别名 AS

    SELECT column_name AS alias_name
    FROM table_name;
    
    SELECT column_name(s)
    FROM table_name AS alias_name;
    
    • example
    SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
    FROM Websites;
    

    CONCAT 连接的意思, 将这些数据连接

    SELECT w.name, w.url, a.count, a.date
    FROM Websites AS w, access_log AS a
    WHERE a.site_id=w.id and w.name="菜鸟教程";
    

    join

    重点: 考察左连 右连
    INNER JOIN:如果表中有至少一个匹配,则返回行
    LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
    RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
    FULL JOIN:只要其中一个表中存在匹配,则返回行

    INNER JOIN

    简单来说将两个表 连接成一个表进行查询.

    SELECT Websites.id, Websites.name, access_log.count, access_log.date
    FROM Websites
    INNER JOIN access_log
    ON Websites.id=access_log.site_id;
    

    left join


    LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

    SELECT column_name(s)
    FROM table1
    LEFT JOIN table2
    ON table1.column_name=table2.column_name;
    
    

    注意 和 on 匹配.
    可以看到包含user的所有信息, 当右边不存在时候结果为null. 但是这里显示的是none. 应该是应该显示处理了

    1|tm|1|1
    2|wwy|None|None
    3|zk|5|3
    3|zk|4|3
    3|zk|3|3
    3|zk|2|3
    3|zk|1|3
    4|qq|None|None
    5|lm|None|None
    

    right join

    SELECT column_name(s)
    FROM table1
    RIGHT JOIN table2
    ON table1.column_name=table2.column_name;
    

    full join

    mysql 不支持 full outer join

    SELECT column_name(s)
    FROM table1
    FULL OUTER JOIN table2
    ON table1.column_name=table2.column_name;
    

    UNION

    选取不同的值 UNION ALL 来选取重复的值!

    SELECT column_name(s) FROM table1
    UNION
    SELECT column_name(s) FROM table2;
    

    SELECT INTO

    复制到新表
    mysql 不支持, 先不写了

    INSERT INTO SELECT

    从一个表中赋值所有的列插入到另一个已存在的表中

    INSERT INTO table2
    SELECT * FROM table1;
    
    INSERT INTO Websites (name, country)
    SELECT app_name, country FROM apps;
    
    INSERT INTO user (id, name)
    select user_id, type from grade_info;
    

    FOREIGN KEY

    外键, 用来在建立表的时候就构建连接关系, 防止破坏标的连接关系.

    ALTER TABLE Orders
    ADD FOREIGN KEY (P_Id)
    REFERENCES Persons(P_Id)
    

    视图

    视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。

    CREATE VIEW view_name AS
    SELECT column_name(s)
    FROM table_name
    WHERE condition
    

    可以如此查询视图
    SELECT * FROM [Current Product List]
    [Current Product List] 是创建出来的视图

    IS NULL IS NOT NULL

    SELECT LastName,FirstName,Address FROM Persons
    WHERE Address IS NOT NULL
    

    IFNULL(UnitsOnOrder,0) 如果 UnitsOnOrder 是 NULL 那么给他赋值为0

    AVG

    SELECT AVG(column_name) FROM table_name

    group by

    以什么标题来进行聚合, 就是合并显示. 通常带上SQL的各种函数.

    select user_id, sum(grade_num) as num from
    grade_info
    group by user_id;
    

    having

    因为 where 不能和 聚合函数 group by 一起使用.

    SELECT column_name, aggregate_function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY column_name
    HAVING aggregate_function(column_name) operator value;
    
    # EXISTS 接 子查询
    
    

    SELECT Websites.name, Websites.url
    FROM Websites
    WHERE EXISTS (SELECT count FROM access_log WHERE Websites.id = access_log.site_id AND count > 200);

    
    

    1. charlist ↩︎

    Hope is a good thing,maybe the best of things,and no good thing ever dies.----------- Andy Dufresne
  • 相关阅读:
    快速搭建 STF开源云测平台 测试人员专用
    快速搭建sonarqube代码检测平台
    使用jenkins交付微服务应用至kubernetes集群
    普通主机拥有集群控制权限
    为ingress资源添加basic auth认证
    GO语言入门
    GO语言入门
    GO语言入门
    GO语言入门
    关闭提示的下拉框
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/14956427.html
Copyright © 2011-2022 走看看