zoukankan      html  css  js  c++  java
  • MySQL(三:sql语法、类型、约束)

    一、DQL

    -- 1. +号在sql server中既可以作为运算符,也可以作为字符拼接,而在mysql中只有运算符功能
    
    -- sql server
    select '1'+'2'; -- '12'
    select 1+2; -- 3
    
    --mysql
    SELECT '1'+'2'; -- 3
    SELECT NULL+1; -- NULL
    SELECT 'a'+2;   -- 2
    SELECT CONCAT(1,2);      --12
    SELECT CONCAT('1','2');   --12

    -- 2. 安全等于<=>可读性差,感觉没什么用
    SELECT 1 <=> 2 -- 0

    SELECT NULL <=> NULL -- 1

    SELECT NULL IS NULL -- 1
     
    -- 显示当前字符集
    SHOW VARIABLES LIKE '%char%';
    
    SELECT LENGTH('窃格瓦拉ha') -- 14,因为当前是utf8,中文3字节,英文1字节。gbk中文2字节,英文1字节
    USE myemployees;
    -- 字符函数
    
    -- LENGTH
    SHOW VARIABLES LIKE '%char%';-- 显示当前字符集
    SELECT LENGTH('窃格瓦拉ha') -- 14,因为当前是utf8,中文3字节,英文1字节。gbk中文2字节,英文1字节
    
    -- SUBSTR 截取都是指字符长度,除了LENGTH是字节长度
    SELECT SUBSTR('ABC',2) -- 'BC',因为SQL语言索引从1开始
    SELECT SUBSTR('ABC',2,1) -- 'B'
    
    -- INSTR 返回字符首次索引,找不到返回0
    SELECT INSTR('ABCBCA','B') -- 2
    
    -- TRIM 去前后,不去中间
    SELECT TRIM(' 窃格瓦拉 ') -- '窃格瓦拉'
    
    -- LPAD 左填充,字符长度不够10,左侧填充A,右填充RPAD
    SELECT LPAD('ABC',10,'A')
    
    -- REPLACE
    SELECT REPLACE('ABC','A','E') -- 'EBC'
    
    -- 数学函数
    
    -- ROUND 四舍五入
    SELECT ROUND(1.97); -- 2
    SELECT ROUND(-1.97); -- 2
    SELECT ROUND(1.97,1); -- 2.0 第二个参数保留几位小数
    
    
    #CEIL 向上取整,返回>=该参数的最小整数
    SELECT CEIL(1.97); -- 2
    
    #FLOOR 向下取整,返回<=该参数的最小整数
    SELECT FLOOR(1.97) -- 1
    
    -- 截取 第二个参数:截取到小数点后第几位
    SELECT TRUNCATE(1.2334,3); -- 1.233
    SELECT TRUNCATE('2313.12345',2); -- 2313.12
    
    -- 取余 a-a/b*b
    SELECT MOD(10,-3); -- 1
    
    -- 日期函数
    SELECT NOW(); -- 当前服务器日期
    SELECT CURDATE(); -- 当前服务器日期,不包含时间
    SELECT CURTIME(); -- 当前服务器日期,不包含日期
    SELECT YEAR(NOW()); -- 当前年
    SELECT MONTH(NOW()) -- 当前月
    SELECT MONTHNAME(NOW()) -- 当前月(英文)
    SELECT STR_TO_DATE('26-4-2020','%d-%m-%Y') -- 2020-04-26
    SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日') -- 2020年04月26日
    
    -- if函数
    SELECT IF(10<5,'true','false'); -- false
    
    -- case函数 相当于switch case
    -- case -- switch
    -- when -- case
    -- then -- :
    -- else -- default
    -- end
    SELECT salary AS 原始工资,department_id,
    CASE department_id
    WHEN 90 THEN salary*2
    WHEN 110 THEN salary*3
    ELSE salary
    END AS 新工资
    FROM employees
    -- 上面这种类似swith case 多用于等值判断
    
    -- 跟上面结果一样,但是这样写不规范,等值判断用上面的写法
    SELECT salary AS 原始工资,department_id,
    CASE
    WHEN department_id=90 THEN salary*2
    WHEN department_id=110 THEN salary*3
    ELSE salary
    END AS 新工资
    FROM employees
    
    -- 下面这种类似if else 多用于区间或条件表达式判断
    SELECT salary AS 原始工资,department_id,
    CASE
    WHEN salary>13000 THEN salary*2
    WHEN salary>10000 THEN salary*3
    ELSE salary
    END AS 新工资
    FROM employees
    
    -- 分组函数 常用语统计,又称为聚合函数或统计函数或组函数
    -- sum这些
    
    -- 
    SELECT first_name
    FROM employees
    GROUP BY LENGTH(first_name)>3
    
    -- any/some
    SELECT *
    FROM employees
    WHERE salary>SOME(SELECT salary FROM employees WHERE first_name='Steven')
    
    -- 创建数据库
    CREATE DATABASE IF NOT EXISTS test2;
    
    -- 删除数据库
    DROP DATABASE IF EXISTS test2;
    
    -- 创建表
    USE test2;
    CREATE TABLE IF NOT EXISTS book
    (
     id INT,#编号
     bName VARCHAR(20),#图书名
     price DOUBLE,#价格
     authorId INT,#作者
     publishData DATETIME#出版日期
    );
    DESC book;
    
    -- 修改表
    ALTER TABLE book CHANGE COLUMN publishData pubDta DATETIME;-- 修改列名
    
    ALTER TABLE book MODIFY COLUMN pubDta TIMESTAMP;-- 修改列类型
    
    ALTER TABLE book ADD COLUMN product VARCHAR(20);-- 添加列
    
    ALTER TABLE book DROP COLUMN product;-- 删除列
    
    ALTER TABLE book2 RENAME TO book;-- 修改表名
    
    -- 删除表
    SHOW TABLES;-- 显示当前库下所有的表
    DROP TABLE IF EXISTS book;-- 删除表
    
    -- 复制表
    CREATE TABLE copy LIKE book;-- 复制表结构
    DESC copy;
    
    CREATE TABLE copy2-- 复制表结构与数据
    SELECT *FROM book;
    DESC copy2;
    #常见数据类型
    /*
    数值型:
        整型:tinyint,smallint,mediumint,int/integer,bigint
        小数:
            定点数:
            浮点数:
    字符型:
        较短的文本:char,varchar
        较长的文本:text,blob(较长的二进制数据)
    日期型:
    */
    #整型:
    /*
    tinyint 1字节 8位
    smallint 2字节
    mediumint 3字节
    int/integer 4字节
    bigint 8字节
    */
    CREATE TABLE tabint(
        tab1 INT,-- 默认有符号,范围可负值
        tab2 INT UNSIGNED -- 有符号,范围最低0无负值
    )
    -- 数值型长度表示宽度,不是长度,不足以0补齐
    -- tab1 INT(7) zerofill,如果指定宽度有符号失效
    
    /*
    小数
    定点数:dec(m,d)/decimal(m,d) 长度比较大,精度要求高用decimal
    浮点数:float(m,d) 4字节,double(m,d) 8字节
    */
    CREATE TABLE tabfloat(
        f1 FLOAT(5,2),-- 2表示小数点后2位,超过四舍五入进1
        f2 DOUBLE(5,2),
        f3 DECIMAL(5,2)
    )
    INSERT INTO tabfloat VALUES(1234.5,1234.5,1234.5);
    SELECT *FROM tabfloat;
    -- 上面会报警告,因为2指定小数位2位,插入的数据1234已经有4位,一共就6位,超过规定的5位
    -- 所以5表示的整数位与小数位的和不能超过5,所以这条插入默认是999.99,整数位3+小数2都以最高数9填充
    
    /*
    字符型
    较短的文本:char,varchar
    较长的文本:text,blob(较长的二进制数据)
    char(m) m表示字符数,并不是字节数,比如a表示一个字符
    char(10) 固定字符,创建的时候会开10个字符空间
    varchar(10) 可变字符,根据数据开空间,最大10,比如插入“中国”,只会开2个字符空间
    char 耗空间,但效率高。比如性别,要么是男,要么是女。所以用char不要用varchar
    varchar 省空间,但效率低
    
    enum类型
    */
    CREATE TABLE tabchar(
        c ENUM('a','b','c','d')
    );
    INSERT INTO tabchar VALUES('a');
    INSERT INTO tabchar VALUES('b');
    INSERT INTO tabchar VALUES('c');
    INSERT INTO tabchar VALUES('m'); -- 这个会报错,插入不成功,因为m不在枚举范围
    INSERT INTO tabchar VALUES('d');
    INSERT INTO tabchar VALUES('A'); -- 这个不会报错,因为不区分大小写
    
    /*
    set类型
    插入集合
    */
    CREATE TABLE tabset(
        c SET('a','b','c','d')
    );
    INSERT INTO tabset VALUES('a,b,c');
    
    /*
    binary,varbinary用于保存较小的二进制数据
    blob(较长的二进制数据)
    */
    
    /*
    日期类型,必须用单引号
    date:只有日期,没有时间:
    datetime:有日期也有时间 8字节
    timestamp:有日期也有时间 4字节,时区用它
    time:只有时间,没有日期
    */
    CREATE TABLE tabdate(
        t1 DATETIME,
        t2 TIMESTAMP
    );
    INSERT INTO tabdate VALUES(NOW(),NOW());
    SELECT *FROM tabdate
    
    SHOW VARIABLES LIKE '%time_zone%';-- 查看当前数据库时区
    SET time_zone='+9:00';-- 更改当前数据库时区
    -- 更改时区之后TIMESTAMP字段会根据时区变化,DATETIME不会
    -- 所以如果有时区区分用TIMESTAMP
  • 相关阅读:
    CodeForces Gym 100500A A. Poetry Challenge DFS
    CDOJ 486 Good Morning 傻逼题
    CDOJ 483 Data Structure Problem DFS
    CDOJ 482 Charitable Exchange bfs
    CDOJ 481 Apparent Magnitude 水题
    Codeforces Gym 100637G G. #TheDress 暴力
    Gym 100637F F. The Pool for Lucky Ones 暴力
    Codeforces Gym 100637B B. Lunch 找规律
    Codeforces Gym 100637A A. Nano alarm-clocks 前缀和
    TC SRM 663 div2 B AABB 逆推
  • 原文地址:https://www.cnblogs.com/BOSET/p/12799526.html
Copyright © 2011-2022 走看看