Mysql个人语句笔记

--一些简单语句记录:

/*mysql*/
SHOW DATABASES

CREATE DATABASE guoDROP DATABASE guo

/*查看创建的数据库*/
SHOW CREATE DATABASE zf

/*字符集*/
CREATE DATABASE guo CHARACTER SET gbk
SHOW CREATE DATABASE guo
ALTER DATABASE guo CHARACTER SET utf8;
SHOW CREATE DATABASE guo

-- 创建表
USE zf
CREATE TABLE hh
(
id INT,
sex CHAR(50),
PRIMARY KEY(id)
)
--
自增列起始数值:
ALTER TABLE tt AUTO_INCREMENT = 100;

CREATE TABLE person (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
NAME CHAR(60) NOT NULL,
/*创建主键一定要这样吗?不知道*/
PRIMARY KEY (id)
);
DROP TABLE person

 

SHOW CREATE TABLE hh
ALTER TABLE hh ADD guo VARCHAR(50)
ALTER TABLE hh MODIFY guo VARCHAR(60)
ALTER TABLE hh DROP guo
SELECT * FROM hh
RENAME TABLE hh TO tt

ALTER TABLE tt CHARACTER SET utf8
-- 查询表详情
USE zf;
DESC tt

-- 关闭链接:quit

-- 版本号
SELECT VERSION() v;
-- 当前日期
SELECT CURRENT_DATE AS c;
SELECT CURDATE()

SELECT 1+2

-- 日期+时间
SELECT NOW();
-- 用户
SELECT USER();
-- USE test 和quick一样,无需分号,不过加上也没关系;
-- SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')
-- ORDER BY BINARY col_name. 对大小写排序;
--

USE zf;
-- 日期计算
SELECT YEAR('2012-4-5')

SELECT MONTH('2015-4-5');
SELECT DATE('2015-4-5');
SELECT DAYOFMONTH('2015-4-16');

-- month是整形;
SELECT YEAR(DATE_ADD(CURDATE(),INTERVAL 1 YEAR));

--
SELECT RIGHT('gzf123456',2)

SELECT LEFT('gzf',2)

SELECT * FROM tt WHERE sex IS NOT NULL

SELECT MOD(MONTH(CURDATE()), 12) + 1

SELECT MOD(14, 12)

-- 取余运算(求余数)
SELECT MOD(14, 12)

-- GROUP BY中,两个NULL值视为相同。roder by中,NULL值当做是最小;
--

-- lilke '___':包含三个字符的...

SELECT * FROM tt WHERE sex LIKE '___'

-- 正则表达式 以a开始...正则表达式
SELECT * FROM tt WHERE sex REGEXP '^a';
-- SELECT * FROM pet WHERE name REGEXP 'fy$'----------^以什么开始,$以什么结尾,以fy结尾的。

-- REGEXP 'w';包含w的。

-- 正好包含5个字符:REGEXP '^.....$' 或者是 REGEXP '^.{5}$'

-- 查询第一行:order by ...limit 1;

/*
经典查询:
可以用这样一个子查询解决该问题:

SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);

*/
-- enum类型,指的是字符串区间:不如定义列:color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL;
SHOW CREATE TABLE tt

-- 创建表的时候添加外键: owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
-- REFERENCES person(id),
-- 同事插入多列:
/*
INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', @last),
(NULL, 'dress', 'white', @last),
(NULL, 't-shirt', 'blue', @last);
*/

/*修改密码
UPDATE mysql.user SET Password=PASSWORD('newpwd')
-> WHERE User='root';

/*显示所有表的名称*/*/
show tables;
/*显示表结构*/

-- in ('湖南', '四川')

-- between 20 and 30

-- 包括=,<>,<,<=,>,>=)select * from students where name = '李山'

-- like '[^F-M]%' --------- (^排除指定范围)

-- 修改密码mysqladmin -uroot -password ab12

-- 增加用户

GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO test1@"%" IDENTIFIED BY "abc";
GRANT SELECT,INSERT,UPDATE,DELETE ON mydb.* TO test2@localhost IDENTIFIED BY "abc";
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'some_pass' WITH GRANT OPTION; -- 超级账户
FLUSH PRIVILEGES;-- 刷新权限
-- 删除账户'权限,同时删除user表。
DROP USER 'test1'@'%';
-- 修改密码
/*
4.修改指定用户密码

@>mysql -u root -p

@>密码

mysql>update mysql.user set password=password('新密码') where User="test" and Host="localhost";

mysql>flush privileges;
*/
-- 对密码进行加密

SELECT PASSWORD('gzf')

-- 查询用户权限
SHOW GRANTS FOR 'test1'@'%';

-- 取消权限 但需要手动删除用户表
REVOKE ALL ON *.* FROM test1@'%' ;
DELETE FROM USER WHERE USER = "test1" AND HOST = "%" ;
FLUSH PRIVILEGES;
-- 查询当前用户
SELECT USER()
-- 查询当前数据库
SELECT DATABASE();
-- 装载文件数据[文本文件用tab隔开]
LOAD DATA LOCAL INFILE "C:/Users/ZeFeng/Desktop/gzf.txt" INTO TABLE tt;

-- 查询语句
SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
SELECT "hello", "'hello'", "''hello''", "hello", "\"hello";

-- 十六进转为字符
SELECT 0x636174
--
SELECT HEX('ert')
--
SELECT NULL=NULL
-- 和=相同
SELECT NULL<=>NULL
SET @t1='sfdsfd';
SELECT @t1
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
-- 查询最小的
SELECT LEAST(5,7,3)
-- 查询最大的
SELECT GREATEST(34.0,3.0,5.0,767.0);
--
SELECT ISNULL('')
-- 支持not和!
SELECT NOT 0
--
SELECT !1

DECLARE @a VARCHAR(50);
SELECT a:=sex FROM tt ORDER BY id LIMIT 1;
SELECT a;
-- 支持&&和||
SELECT * FROM tt WHERE id=123 AND sex IS NULL

-- 相当于三元运算
SELECT IF(1<2,2,3);

-- 返回两者中不是null的数值,如果都为数值,返回第一个;
SELECT IFNULL(NULL,10);
SELECT IFNULL(10,12);
SELECT IFNULL(10,NULL);

--
SELECT CHAR('gzf')
--
SELECT CONCAT('My', 'S', 'QL','123');
-- 第一个参数为分隔符;这是与concat的区别;会忽略null,但不会忽略空字符串;
SELECT CONCAT_WS(',','First name','Second name','Last Name',NULL,' ','null');
-- 相当于sql的stuff
SELECT INSERT('Quadratic', 3, 4, 'What');

-- 日期:
SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
SELECT ADDDATE('1998-01-02', 31);
SELECT ADDTIME('1997-12-31 23:59:59.999999','1 1:1:1.000002');
SELECT CURTIME();
-- 转化类型
SELECT CONVERT('abc' USING utf8);

--
SELECT CAST('2000-01-01' AS DATE);

SELECT CAST(1 AS CHAR) +'1233';
SELECT '1'+'2'

-- 将两个字符串结合
SELECT CONCAT(1,2)
-- 加密

SELECT MD5('123')
SELECT PASSWORD('123')

-- 查看字符集
SELECT CHARSET('abc');

-- 强转字符集
SELECT CHARSET(CONVERT('abc' USING latin1));

--
SELECT LAST_INSERT_ID();

-- 提取字符串
SELECT SUBSTRING_INDEX(USER(),'@',1);
SELECT SUBSTRING_INDEX('guo,ze,feng,4',',',4);
--
-- DEFAULT(col_name) 查看某列的默认值

-- 保留四位小数点
SELECT FORMAT(1234.00,4)

-- 唯一标识码
SELECT UUID()

-- 修改列明,更改列的类型
ALTER TABLE tt CHANGE sex sexx INTEGER;
ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
-- 也可以使用change
-- 删除多个列:
ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
-- 修改索引
ALTER TABLE table_name ADD INDEX index_name (column_list)

ALTER TABLE table_name ADD UNIQUE (column_list)

ALTER TABLE table_name ADD PRIMARY KEY (column_list)

-- 创建索引
CREATE INDEX index_name ON table_name (column_list)

CREATE UNIQUE INDEX index_name ON table_name (column_list)
-- 删除索引
DROP INDEX index_name ON talbe_name

ALTER TABLE table_name DROP INDEX index_name

ALTER TABLE table_name DROP PRIMARY KEY
-- 查看索引
SHOW INDEX FROM tt;
-- 创建外键
ALTER TABLE tb_active ADD CONSTRAINT FK_ID FOREIGN KEY(user_id) REFERENCES tb_user(id)
-- 删除外键
ALTER TABLE `tb_active` DROP FOREIGN KEY `FK_ID`
-- 查看函数功能是否开启
SHOW VARIABLES LIKE '%func%';
-- 开启函数:
SET GLOBAL log_bin_trust_function_creators=1;

-- 创建函数
DELIMITER $$
CREATE FUNCTION first_func(param1 VARCHAR(5),parmam2 VARCHAR(5),param3 VARCHAR(10))
RETURNS TINYINT
BEGIN
RETURN 1;
END
$$
DELIMITER ;
SELECT first_func('1','2','3');
-- 删除函数
DROP FUNCTION first_func

-- 创建存储过程
DELIMITER $$
CREATE PROCEDURE guo_pro(
canshu VARCHAR(10)
)
BEGIN
SELECT canshu;
END
$$
DELIMITER ;
CALL guo_pro('ggg');
-- 删除存储过程
DROP PROCEDURE guo_pro
-- 创建视图
CREATE VIEW guo_view
AS SELECT * FROM tt;

SELECT * FROM guo_view

-- 复制表结构1,2
-- 1新版本
CREATE TABLE t1 LIKE tt
DROP TABLE t1
-- 通用
CREATE TABLE t1 SELECT * FROM tt WHERE 1=1
-- 创建临时表
CREATE TEMPORARY TABLE guo(id INT)
INSERT INTO guo VALUES(1)
SELECT * FROM guo
-- 删除虚拟表
DROP TABLE guo
-- 备份
-- 分页:跳过前3条,取第四第五条数据;性能差

SELECT * FROM testtwo LIMIT 3,2
-- 提高性能
elect * FROM TABLE AS a INNER JOIN (SELECT id FROM TABLE ORDER BY id LIMIT m, n) AS b ON a.id = b.id ORDER BY a.id;

SQL代码1:平均用时6.6秒 SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 30

SQL代码2:平均用时0.6秒 SELECT * FROM `cdb_posts` WHERE pid >= (SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1) LIMIT 30
-- 相当于
/*
mysql中变量不用事前申明,在用的时候直接用“@变量名”使用就可以了。

第一种用法:set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量

第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where ……

注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”
*/

SET @a=1;
SELECT @a;

-- 创建表
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
-- 创建触发器
CREATE TRIGGER gzf_tri BEFORE INSERT ON test
FOR EACH ROW BEGIN
-- INSERT INTO test2 SET a2 = NEW.a1;
-- DELETE FROM test3 WHERE a3 = NEW.a1;
-- UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END
--

DELIMITER ;
-- 创建存储过程
DELIMITER //
CREATE PROCEDURE p8 ()
BEGIN
DECLARE a INT;
DECLARE b INT;
SET a = 5;
SET b = 5;
END;
//
DELIMITER ;
DROP PROCEDURE p8
-- 事务
TRUNCATE TABLE test;
DELIMITER //
SET @a=0;
START TRANSACTION;
INSERT INTO test VALUES(333,'sdfs');
IF ROW_COUNT() < 1 THEN
SET @a = -1;
INSERT INTO test VALUES(444,'sdfs',00);
IF ROW_COUNT() < 1 THEN
SET @a = -1;
IF @=0 THEN
COMMIT;
ELSE
ROLLBACK;
//

COMMIT;
ROLLBACK;
SELECT * FROM test;
-- 控制语句

SELECT CASE 1 WHEN 0 THEN 'zero' WHEN 1 THEN 'one' ELSE 'no one' END;
SELECT IF(1=2,1,2)
-- 控制语句
DELIMITER //
CREATE PROCEDURE test_pro(
id INT
)
BEGIN
IF id>1 THEN SELECT 1;
ELSEIF id>2 THEN SELECT 2;
ELSE
SELECT 3;
END IF;
END
//
DELIMITER ;
CALL test_pro(3)
-- 存储过程测试:
DROP PROCEDURE test_pro1;

CALL test_pro1(3);

--
-- 第一个如果是null,则返回第二个,否则返回第一个;
SELECT IFNULL(0,1)
SELECT IFNULL(NULL,1)
-- 如果第一个和第二个相等,则返回null;否则返回第一个
SELECT NULLIF(1,1)
SELECT NULLIF(1,2)
-- 查询是否自动提交
SELECT @@autocommit;
-- 控制语句
DELIMITER //
CREATE PROCEDURE pro
BEGIN
DECLARE a INT DEFAULT 5;
IF a>2 THEN
SELECT @a;
ELSEIF @a<5 THEN
SELECT 2;
END IF;
END
//
-- while do用法:
DELIMITER /
CREATE PROCEDURE guo()
BEGIN
DECLARE gg INT DEFAULT 0;
DECLARE tt VARCHAR(50) DEFAULT '';
WHILE(gg<5) DO
SET gg=gg+1;
SET tt=CONCAT(tt,'a');
END WHILE;
SELECT tt;
END
/
DELIMITER ;
CALL guo();
DROP PROCEDURE guo


-- 循环控制语句
DELIMITER /
CREATE PROCEDURE ABC()
BEGIN
DECLARE a VARCHAR(50) DEFAULT '';
SET @a=1;
gzf: LOOP
SET @a=@a+1;
SET a=CONCAT(a,CONVERT(@a,CHAR));
IF @a=5 THEN
LEAVE gzf;
END IF;
END LOOP gzf;
SELECT a;
END
/
DELIMITER ;
CALL abc();
DROP PROCEDURE abc
-- 创建游标
DELIMITER /
CREATE PROCEDURE ABC()
BEGIN
DECLARE tmpName VARCHAR(20) DEFAULT '' ;
DECLARE allName VARCHAR(255) DEFAULT '' ;
DECLARE cur1 CURSOR FOR SELECT NAME FROM test ;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = NULL;
OPEN cur1;
FETCH cur1 INTO tmpName;
WHILE ( tmpname IS NOT NULL) DO
SET tmpName = CONCAT(tmpName ,";") ;
SET allName = CONCAT(allName ,tmpName) ;
FETCH cur1 INTO tmpName;
END WHILE;
CLOSE cur1;
SELECT allName ;
END
/
DELIMITER ;
CALL abc();
DROP PROCEDURE abc
-- loop游标:
ELIMITER $$

DROP PROCEDURE IF EXITS cursor_example$$
CREATE PROCEDURE cursor_example()
READS SQL DATA
BEGIN
DECLARE l_employee_id INT;
DECLARE l_salary NUMERIC(8,2);
DECLARE l_department_id INT;
DECLARE done INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT employee_id, salary, department_id FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

OPEN cur1;
emp_loop: LOOP
FETCH cur1 INTO l_employee_id, l_salary, l_department_id;
IF done=1 THEN
LEAVE emp_loop;
END IF;
END LOOP emp_loop;
CLOSE cur1;
END$$
DELIMITER ;
-- repeat游标:
/*创建过程*/
DELIMITER //
DROP PROCEDURE IF EXISTS test //
CREATE PROCEDURE test()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a VARCHAR(200) DEFAULT '';
DECLARE c VARCHAR(200) DEFAULT '';

DECLARE mycursor CURSOR FOR SELECT fusername FROM uchome_friend;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

OPEN mycursor;

REPEAT
FETCH mycursor INTO a;
IF NOT done THEN
SET c=CONCAT(c,a);/*字符串相加*/
END IF;

UNTIL done END REPEAT;

CLOSE mycursor;

SELECT c;
END //
DELIMITER ;


SHOW SESSION VARIABLES;
DROP PROCEDURE p8
--
-- 游标的使用

CREATE PROCEDURE gzf_proc ()
BEGIN
-- 需要定义接收游标数据的变量
DECLARE a VARCHAR(50);
DECLARE b VARCHAR(50);
-- 游标
DECLARE cur CURSOR FOR SELECT NAME FROM test;
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
OPEN cur;

-- 开始循环
read_loop: LOOP
-- 提取游标里的数据,这里只有一个,多个的话也一样;
FETCH cur INTO a;
-- 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
-- 这里做你想做的循环的事件
SET b=b+"-"+a;
END LOOP;
-- 关闭游标
CLOSE cur;

END

 

 

 

 

-- -- 与sqlserver不同的地方:mysql sqlwerver

/*
1.ALTER TABLE hh MODIFY guo VARCHAR(60) ALTER table Teacher alter column TName varchar(50)
2.ALTER TABLE hh DROP guo ALTER table Teacher drop column TName
3.RENAME TABLE hh TO tt 修改表名 sp_rename 'oldname','newname'
4.
*/

-- 与sqlserver相同的地方:
/*
创建数据库和创建表都一样
*/

 

posted @ 2015-04-23 10:05  aiaito  阅读(338)  评论(0编辑  收藏  举报