MySQL语句简要
SQL功能
DDL:数据定义语言,创建、修改、删除数据库对象(表,视图、索引)
DML:数据操纵语言,主要用于查询、添加、修改或者删除存储在数据库中的数据
DCL:数据控制语言, 用于控制数据库中特定访问用于的权限,访问类型
SQL执行方式
交互式SQL:直接执行SQL语句,输出在命令行的
嵌入式SQL:嵌入到高级语言中的SQL语句
SQL关键词
-
数据定义:
CREATE TABLE
DROP TABLE
ALER TABLE //修改表结构
CREATE INDEX
DROP INDEX
CREATE PROCEDURE //创建一个存储过程
DROP PROCEDURE -
数据操作:
SELECT
INSERT
UPDATE
DELETE -
权限控制:
GRANT
REVOKE -
事务控制:
COMMIT
ROLLBACK -
数据类型:
整数:
TINYINT 8bit
SMALLINT 16bit
MEDIUMINT 24bit
INT 32bit
BIGINT 64bit
实数:
FLOAT 32bit
DOUBLE 64bit
DECIMAL //精确的小数
字符串:
CHAR //固定长度
VARCHAR //可变长度,有利有弊
TEXT //较长的文本,非二进制
BLOB //二进制
ENUM //不允许ENUM外字符插入
SET //SET类型
日期:
DATE //YYYY-MM-DD
TIME //HH-MM-SS
DATETIME
TIMESTAMP //时间戳
数据类型选择准则:
最小原则
简单原则
避免索引列上的NULL
修改表结构
ALTER TABLE:
CHANGE
RENAME
DROP
ADD
算术运算符:
+,-,*,/,%
例子:SELECT 1+2;
SELECT row1-row2 FROM TABLE1;
比较运算符:
<>(不等于), !=, =, >, <, <=>(是否为NULL), between, in, is null, like
like一般不推荐使用,因为它要搜索整个表
逻辑运算符:
not/!, and/&&, or/||, XOR
位运算符:
&, |, ^(位异或), ~, <<(左移), >>
数学函数
ABS(), CEILING()(向上取整), FLOOR(向下取整), GREATEST(), LEAST(), MOD(), RAND(), ROUND(), TRUNCATE()(截断小数点后多少位), SIGN(), 三角函数, LN(), LOG(), BIN(), OCT()(八进制),
聚合函数:
AVG(), SUM(), MIN(), MAX(), COUNT(), STD(), STDDEV(), VARIANCE()
字符串函数:
LENGTH(), LCASE(), LOWER(), UCASE(), UPPER(), STRCMP(), POSITION(), REPLACE(), INSERT(), CONCAT(), CONCAT_WS(), LPAD(), RPAD()(右边填充), LTRIM(), RTRIM(), TRIM(), SUBSTRING(), ASCII()
日期和时间函数:
NOW(), CURTIME(), CURDATE(), YEAR(), MONTH(), DAYOFYEAR(), DAYOFWEEK(), DATE_ADD(), DATE_SUB(), DATE_FORMAT(), TIME_FORMAT()
查询一个表结构:
DESCRIBE TABLE;
插入方法:
- INSERT INTO TABLENAME VALUES(**, **, **)
- INSERT INTO TABLENAME (COLNUM1, COLNUM2, COLNUM3) VALUES(**, **, **) //这种方式可以少插入几列的数据
- INSERT INTO TABLENAME SET COLNUMNAME=VALUE
更新表值:
UPDATE TABLE SET COLUM=VALUE WHERE VALUE=TARGETVALUE
连接类型:
- 交叉连接CROSS JOIN:笛卡尔积,无where语句
-内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接: - 外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
SELECT * FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.COLUM=TABLE.COLUM2 WHERE… - 自连接:自己和自己连接,相当于把一个表当成两个表
- 联合:连接两个表结构相同的表,上下连接
子查询:
根据另一个select来进行查询,就是select嵌套
HAVING:
当我们用到聚合函数,如sum,count后,又需要筛选条件时,having就派上用场了,因为WHERE是在聚合前筛选记录的,having和group by是组合着用的,having后的判断字段必须是聚合函数返回的结果
事务处理:
作为一个单独单元的一个或者多个SQL语句组成,要么全部完成,要么执行失败则全部回滚。
事务处理生命周期:
START TRANSACTION;
…//事务流程
COMMIT; //或者ROLLBACK
开始事务之后,想要将操作写进数据库,执行语句之后都需要使用COMMIT语句进行提交。
想要完成自动提交:
@@AUTOCOMMIT设置为TRUE时,就是自动提交,不需要显示COMMIT语句
使用特定存储引擎:
CREATE TABLE TEST(…) ENGINE=INNODB;
事物的隔离级别:
查看隔离级别:SELECE @@GLOBAL.TX_ISOLATION或者SELECE @@SESSION.TX_ISOLATION
设置隔离级别:SET SESSION TRANSACTION LEVEL [隔离级别]
可重复读是MySQL的默认级别
重复读级别:保证同一事务查询的结果是一致的,但是会导致幻读:一个事务中新插入一行,另一个事务是能够查到的。
提交读:同一事务查询结果可能不同,因为只要一个事务提交了,另一个事务就能够查询到。这导致不可重复读,因为不可重复读的概念就是,一个事务的多次查询结果是一致的。
在使用事务表时,提高性能的一些方法:
- 使用小事务
- 选择合适的隔离级别
- 避免死锁
- 保证开始事务前一切都是可行的
表级锁:
LOCK TABLE TABLENAME READ/WRITE;
读锁为共享锁,大家都可读,但是不能修改
写锁为排他锁,只有一个用户可读可写
数据库管理:
运行时间:数据库启动之后能运行多久
数据备份:mysqldump
安全和访问控制:
性能优化:
使用日志排错和统计:
权限:
GRANT ALL PRIVILEGES ON ‘.’ TO USER@HOST IDENTIFIED BY PASSWORD WITH GRANT OPTIONS
FLUSH PRIVILEGES;