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;

原文地址:https://www.cnblogs.com/qlbk/p/3101894.html