库规范:
不区分大小写(命令建议使用大写)
退出:quit;exit;\q;
以分号结尾
可以折行输入,增加空格和缩进来增加可读性
注释: 单行--
多行/*......*/
设置结束符: delimiter 符号
DDL:定义性语句
DML:操作性语句
DCL:权限语句
主键:非空且唯一 not null unique
数据类型3种
1.数字类型:
TINYINT(1字节) 小整数
SMALLINT(2字节) MEDIUMINT(3字节) INT(4字节) 大整数
BIGINT(8字节) 极大整数
FLOAT(4字节) 单精度
DOUBLE(8字节) 双精度
DECIMAL
FLOAT(,) 第一位为总位数 第二位为小数点后的位数
2字符串类型:
定长CHAR(0-255) 不定长VARCHAR(0-65535)
TINYBLOB (不超过255个字符的二进制字符)
TINYTEXT (短文本字符串0-255字节)
BLOB (二进制长文本0-65535字节)
TEXT (长文本数据0-65536字节)
MEDIUMBLOB (0-167772515字节 二进制中度文本数据)
MEDIUMTEXT (中度文本数据)
LONGBLOB (二进制极大文本数据)
LONGTEXT (极大文本数据)
3时间类型:
DATE (3字节) YYYY-MM-DD 日期值
TIME (3字节) HH:MM:SS 时间值
YEAR (1字节) YYYY 年
DATETIME (8字节) YYYY-MM-DD HH:MM:SS
TIMESTAMP (4字节) YYYYMMDD HHMMSS 时间戳
查寻执行顺序:
1. FROM 2. WHERE 3. SELECT 4. GROUP BY 5. HAVING 6. ORDER BY
查看: show databases;
删库: drop database 数据库名;
创建: create database 名;
create database if not exists 名;(如果数据库存在返回warning)
show warings; (查看warning)
查看编码: show create database 名;
改变编码: alter database 名 character set utf-8;
创建时编码: create databse if not exists 名 character set utf-8;
切换数据库: use 名;(不能返回上一层,可以再次切换user 名)
查看当前所在数据库: select database();
==================表操作:
-约束: PRIMARY KEY (主键) 非空且唯一
AUTO_INCREMENT (自增)
NOT NULL (不为空)
DEFAULT (默认值)
FORING KEY (外键)下面解析
null=True # 是否可以为空
-格式:
CREATE TABLE 表名(
id 数据类型, // type 后设置约束性条件
name type
)ENGINE=INNODB; // ENGINE数据库搜索引擎 默认INNODB
查看创建表的语句: SHOW CREATE TABLE 表名;
查看表结构: DESC 表名;
查看当前数据库中所有表: SHOW TABLES;
====修改表结构:
--添加:
ALTER TABLE 表名 ADD (添加); // 注意添加数据类型,约束添加放到类型后
添加多个: 用,号隔开 ADD 继续添加
---------删除:
ALTER TABLE 表名 DROP 字段名;
可以删除多个 用,号隔开DROP
----------修改:
修改加数据类型:
ALTER TABLE 表名 MODIFY 字段名 类型 [约束];
把字段1放到字段2后:
ALTER TABLE 表名 MODIFY 字段名1 类型 [约束] AFTER 字段名2;
把字段1放到第一个位置:
ALTER TABLE 表名 MODITY 字段名1 类型[约束] FIRST;
修改列名:
ALTER TABLE 表名 CHANGE 原列名 新列名 类型 [约束] [first|after];
INSERT INTO 表名 (id,name) VALUSE(1,ww); // 只填对应的值
不写字段名:
INSERT INTO 表名 VALUSE(); // 表内所有字段全部填写
// 增加多条用,号隔开 最后一个以分号结尾
// id为自增,根据设置的值继续累加,可以不用设置
// AS:别名
通过键值对设置:set
INSERT INTO 表名 SET name='';
------修改:
UPDATE 表名 SET name="w",age=11 WHERE id=1;
------删除:
DELETE FROM 表名 WHERE id=1;
AND:两者全部满足
OR: 满足其中一个
---------删除表:
DELETE FROM 表名; (清空,一条一条删)
TRUNCATE TABLE 表名; (字段保留,删除的是表)
========= 外键
*作为外键一定要和关联主键的数据类型保持一致
CREATE TABLE stu(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
charger_id SMALLINT,
FOREIGN KEY (charger_id) REFERENCES class(id)
)ENGINE=INNODB;
外键名: ADD CONSTRAINT 名字 FOREIGN KEY
格式: 语句最后 FOREIGN KEY (外键名) REFERENCES 主表(键)
*添加外键:
ALTER TABLE 表名 ADD CONSTRAINT abc FOREIGN KEY(字段名) REFERENCES 主表(id);
*删除外键:
ALTER TABLE 表名 DROP FOREIGN KEY abc;
约束:
*字表删除表记录时 如果和主表关联需先把主表对应的表记录修改
*主表添加表记录时 字表中没有关联 会不允许添加
对子表约束: 如果在父表中找不到候选键时,则不允许在子表进行insert / update
对父表约束:在父表进行update/delete以更新或删除在子表中有一条或多条对应候选键时,
父表取决于:在定义子表外键时指定的 on update / on delete 子句
有索引根据索引查询会更快(维护创建索引非常消耗时间和空间的)
没有索引会遍历所有表记录
唯一索引,普通索引,全文索引,多列索引,
唯一索引:
设置主键默认就是一个索引 unique
设置唯一索引:ALTER TABLE 表 MODIFY 字段 类型 uniuqe;
唯一索引和普通索引的区别: 唯一索引不能重复
全局索引:FULLEXT
空间索引:SPTAL
普通索引:INDEX | KEY
格式:
CERATE TABLE 表名(
字段 类型 [约束],
name VARCHAR(20),
INDEX 索引名 (字段) // 也可以用key(普通索引)
)
添加索引:
CREATE INDEX 索引名 ON 表(字段);
ALTER TABLE 表 ADD INDEX 索引名(字段);
删除索引:
DROP INDEX 索引名 ON 表名;
===========创建函数:
CREATE PROCEDURE 函数名()
BEGIN //开始
END; // 结束
=================查:
查寻执行顺序:
1. FROM 2. WHERE 3. SELECT 4. GROUP BY 5. HAVING 6. ORDER BY
————————执行顺序:
from表,where条件,select字段,
SELECT * FROM 表名; // 查询所有字段
SELECT 字段1,字段2 FROM 表; //查询字段1字段2
SELECT DISTINCT 字段1 FROM 表; // 去除重复的值 distinct只拿第一次的
SELECT 字段1,字段2+10 FROM 表; // 仅做显示用
SELECT 字段 AS "姓名" FROM 表; // 做显示用 AS:别名
——————————————WHERE语句:
可以使用比较运算符:< > <= >= <> !=
BETWEEN 80 AND 100 值在80到100 之间
in(1,2,3) 值是1或2或3
LIKE "q%" q开头%表示可以跟随意多个字符 _表示跟一个字符
SELECT name,age FROM 表 WHERE age BETWEEN 10 AND 20; //显示name,age两个字段,并且年龄在10到20之间的
SELECT name,age FROM 表 WHERE age IN(10,20); // age为10或20的
SELECT name,age FROM 表 WHERE name LIKE "q%"; // name开头为q的
SELECT name,age FROM 表 WHERE age=10 AND name="qq"; // 同时满足这两个条件
-————值为null:
SELECT name,age FROM 表 WHERE age IS null; // 值为null
—————排序:
SELECT name,age FROM 表 ORDER BY age; // 按年龄由小到大排序 升序
SELECT name,age FROM 表 WHERE age>10 ORDER BY age; // 条件添加到表后
SELECT name,age FROM 表 ORDER BY age DESC; // 降序 DESC
—————查寻顺序:
select字段,form表,where条件,GROUP by分组,HAVING筛选,ORDER by排序,limit 限制条数
————————执行顺序:
from表,where条件,select字段
-------------—————分组:GROUP BY
按类显示:只显示分类的第一条信息
SELECT * FROM 表 GROUP BY name; // 按名字分类
SELECT * FROM 表 GROUP BY 2; // 按字段分类
---------------分组后对组内数据操作:
HAVING: 分组后过滤
聚合函数:
---sum():和
SELECT name,sum(age) FROM 表 GROUP BY name; // 一组内成员age的和
SELECT name,sum(age) FROM 表 GROUP BY name HAVING sum(age)>50; // HAVING过滤大于50的组显示
---COUNT(): 个数
SELECT COUNT(name) FROM 表 WHERE age>30;
SELECT COUNT(name) FROM 表 WHERE ifnull(age,0)>30;
----AVG(): 平均值
SELECT AVG(age) FROM 表; // 相当于 sum(age)/count(name)
*(按avg算的话,如果age为null不会被统计)
解决方法:ifnull(age,0) 如果碰到null按0算;
----MIN(): 最小; MAX():最大;
SELECT MIN(ifnull(age,0)) FROM 表; // 最小的age 碰到null变为0
SELECT MAX(age) FROM 表; // 最大值age
============= 分页
SELECT * FROM 表 LIMIT 2; //显示前两条
SELECT * FROM 表 LIMIT 2,4; // 跳过2条显示4条
========== 正则(like更快)
SELECT * FROM 表 WHERE name REGEXP '^Q'; // Q开头的
SELECT * FROM 表 WHERE name REGEXP 'q$'; // 以q结尾
SELECT * FROM 表 WHERE name REGEXP 'n(3)'; // n出现3次的
查第一条记录: select * from test_limit limit 1;
查前面两条记录: select * from test_limit limit 0,2;
查第二和第三条记录: select * from test_limit limit 1,2;
查最后一条记录: select * from test_limit order by id DESC limit 1;