zoukankan      html  css  js  c++  java
  • MySql

    /*多行注释*/
    -- 单行注释 --后面要加空格
    -- 执行多行sql语句要加分号


    -- 创建数据库、表/列CRUD/表约束CRUD、数据CRUD
    -- truncate table 清除所有数据,主键从1开始
    -- delete from 删除所有数据,主键继续增长

    DROP DATABASE IF EXISTS b ;
    CREATE DATABASE b ;
    USE b;
    DROP TABLE IF EXISTS a;
    CREATE TABLE a (
    id INT(5) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(10) NOT NULL ,
    age INT DEFAULT '18',
    PRIMARY KEY (id)
    );

    ALTER TABLE a ADD COLUMN sex ENUM('f','m') NOT NULL DEFAULT 'm';

    DROP TABLE IF EXISTS cc;
    CREATE TABLE cc (
    id INT(5),
    class VARCHAR(10) NOT NULL,
    grade VARCHAR(5) NOT NULL,
    school VARCHAR(15) NOT NULL DEFAULT 'hs'
    );
    ALTER TABLE cc ADD COLUMN nameId INT(5) NOT NULL;
    DROP TABLE IF EXISTS c;
    RENAME TABLE cc TO c;
    ALTER TABLE c CHANGE COLUMN grade aaa INT(3);
    ALTER TABLE c DROP COLUMN aaa;

    ALTER TABLE c ADD CONSTRAINT gx PRIMARY KEY(id);
    ALTER TABLE c CHANGE COLUMN id tid INT(5) NOT NULL;
    ALTER TABLE c DROP PRIMARY KEY;-- 删除主键时 不能是 auto_increment
    ALTER TABLE c CHANGE COLUMN tid id INT(5) AUTO_INCREMENT PRIMARY KEY;
    ALTER TABLE c ADD CONSTRAINT fk FOREIGN KEY c(nameId) REFERENCES a(id);-- 建立外键

    -- mysql暂不支持check(用触发器替代):The CHECK clause is parsed but ignored by all storage engines
    ALTER TABLE a ADD CONSTRAINT ck CHECK (age>0 AND age< 100);

    SELECT *FROM c;
    INSERT INTO a (a.name,age) VALUES('f','101')
    INSERT INTO a (a.name,age) VALUES('ql','20'),('q',22),('x',16),('lb',16),('dl',16),('cl',16),('g',16),('h',100);
    UPDATE a SET a.name=123 WHERE age=0;
    DELETE FROM a WHERE age=0;
    SELECT * FROM a

    -- 事务
    START TRANSACTION;
    UPDATE a SET age=18
    WHERE sex=0;
    DELETE FROM a WHERE id>10;
    COMMIT;

    SELECT * FROM a ;

    START TRANSACTION;
    UPDATE a SET age=22 WHERE id=1;
    UPDATE a SET age=22 WHERE id=2;
    IF(TRUE) COMMIT;
    IF(FALSE) ROLLBACK;

    -- 声明变量用set或select
    -- DECLARE num int 写法在存储过程中可以且不能加@,意思只是在begin end中的`字段`。在命令行不可以;

    SELECT @@global.tmpdir;-- 全局变量

    SET @num=10;-- 局部变量 在begin end 内有效;
    SELECT @num:= id FROM a ;-- limit 1; 如果是多条数据,则@num是他们的记录数
    SELECT @num;


    SET @result=0;
    CREATE PROCEDURE test(IN @result INT)
    BEGIN
    SET @result=10;
    END
    SELECT @result;


    -- 存储过程 create procedure name() begin end;

    -- IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
    -- OUT 输出参数:该值可在存储过程内部被改变,并可返回
    -- INOUT 输入输出参数:调用时指定,并且可被改变和返回

    -- delimiter用于声明分隔符 ,这样只有当`分隔符`出现之后,mysql解释器才会执行这段语句
    -- 也可以将 创建存储过程的语句放到单独的 .sql文件中,运行 source (简写 \.)执行该sql文本中的sql;

    DELIMITER $$ -- delimiter与@@之间小于等于一个空格
    USE b $$
    DROP PROCEDURE IF EXISTS myAdd $$
    CREATE PROCEDURE myAdd(IN n1 INT,IN n2 INT,OUT result INT)
    BEGIN
    SET result = n1+n2;
    END $$
    DELIMITER; -- 需要分号,空格无所谓
    -- 调用 call
    SET @result=0;
    CALL myAdd(1,3,@result);
    SELECT @result;

    -- 触发器: 不允许有返回值; insert 时用NEW ,delete时用OLD,update时NEW和OLD都可以;
    DELIMITER//
    USE b//
    DROP TRIGGER IF EXISTS t_test//
    CREATE TRIGGER t_test AFTER INSERT
    ON a
    FOR EACH ROW
    BEGIN
    INSERT INTO b.c(c.class,c.school,c.nameId) VALUE('1-1','1',NEW.id);
    END//
    DELIMITER ;

    SELECT * FROM c;

    -- 索引: 唯一、全文、主键、普通
    CREATE INDEX in_name ON a(`name`);

    ALTER TABLE a ADD INDEX in_test (`name`);


    -- 视图 临时表(但实际数据仍然存储在原表中);可以用于重构表结构 隐藏重要数据、清晰的表达数据、简化操作
    DROP VIEW IF EXISTS v_a;
    CREATE VIEW v_a AS SELECT id,age ,sex FROM a LIMIT 100;
    SELECT * FROM v_a;

    -- 方法
    DELIMITER //
    USE b//
    DROP FUNCTION IF EXISTS addNum//
    CREATE FUNCTION addNum(n1 INT, n2 INT) RETURNS INT
    BEGIN
    RETURN n1+n2;
    END//
    DELIMITER ;

    SET @num=addNum(2,3);
    SELECT @num;


    -- 多表查询
    SELECT a.id, a.name,a.age,a.sex,c.class,c.school FROM c JOIN a ON c.nameId=a.id LIMIT 100;

    SELECT d.id ,a.name,a.age,d.sex FROM a CROSS JOIN copyA d ON d.name<>a.name LIMIT 100;


    -- 条件语句
    -- leave/end/iterate
    -- if x>0 then...else...end if语句
    -- case x when 0 then ...when 1 then... else... end case 可以不写else
    -- while x>0 do... end while; / repeat ...until x>0 end repeat; /loop循环不需要条件,leave语句的意义是离开循环。
    DELIMITER //
    USE b//
    DROP PROCEDURE IF EXISTS p_insert //
    CREATE PROCEDURE p_insert(IN insertTotal INT,IN n VARCHAR(10),IN a INT(3))
    BEGIN
    DECLARE c INT DEFAULT 0;
    -- while c<insertTotal do
    -- insert into a (a.name,a.age) value(n,a);
    -- set c=c+1;
    -- end while;

    -- repeat
    -- insert into a (a.name,a.age) value(n,a);
    -- set c=c+1;
    -- until c>=insertTotal
    -- end repeat;

    loop1 : LOOP
    INSERT INTO a (a.name,a.age) VALUE(n,a);
    SET c=c+1;
    IF c>=insertTotal THEN
    LEAVE loop1;
    END IF;
    END LOOP;
    END //
    DELIMITER ;

    CALL p_insert(10000,'aaa',45);


    -- 其他nb命令

    -- 1.copy table data to a newtable 不支持 selec into ; 支持insert into tablename select from othertable
    CREATE TABLE copyA (SELECT * FROM a LIMIT 10);
    INSERT INTO copyA SELECT * FROM a LIMIT 10; -- copyA表必须存在;

    -- 2.Export data to a file; 可以不指定 FIELDS TERMINATED BY ','
    SELECT * INTO OUTFILE 'f:\\bf.txt' FIELDS TERMINATED BY ',' FROM a LIMIT 10 ;
    SELECT * INTO DUMPFILE 'f:\\2bf.txt' FROM a LIMIT 2; -- dumpfile 导出完整的二进制数据不加换行符也不转义,一次只能导出1-2行;

    -- 3.Import data from a file; 如果导出文本时指定FIELDS TERMINATED BY ',',这里也要指定;
    LOAD DATA INFILE 'f:\\bf.txt' INTO TABLE copyA FIELDS TERMINATED BY ',';

    -- 4.备份数据库
    运行cmd 进入mysql 安装目录 运行 mysqldump -uroot -p密码 b >f:\sqlbf.sql

    -- 5. lock unlock
    LOCK TABLE a WRITE;
    CALL p_insert(10,'ff',55);
    UNLOCK TABLE;


    -- 6. 系统函数

    SELECT NOW();
    SELECT CURDATE();
    SELECT INET_ATON('127.0.0.1');
    SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
    SELECT USER();-- select SYSTEM_USER();
    SELECT VERSION();

    -- 优化表 适合有text blob 类型的数据 残留的碎片
    OPTIMIZE TABLE c;

  • 相关阅读:
    单选框和复选框(radiobox、checkbox)
    三种alertconfirmprompt弹窗的处理方法
    iframe的切换
    python的class(类)中的object是什么意思?
    loadrunner12自带的机票预订服务,解决httpd: Could not reliably determine the server's fully qualified domain name 问题
    使用错误的用户名和密码也能运行通过
    win10删除IE某些文件导致不可用恢复的方法
    win10系统删除需要Trustedlnstaller权限的文件
    loadrunner各版本对应的ie浏览器版本
    vue之vue-router加深印象
  • 原文地址:https://www.cnblogs.com/qlbk/p/3101894.html
Copyright © 2011-2022 走看看