sql操作

库规范:
不区分大小写(命令建议使用大写)
退出: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

数据库操作(DDL):(一个数据库对应一个文件夹)

查看: show database;
删库: 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;

切换数据库: user 名;(不能返回上一层,可以再次切换user 名)

查看当前所在数据库: select database();

==================表操作:
-约束: PRIMARY KEY (主键) 非空且唯一
  AUTO_INCREMENT (自增)
  NOT NULL (不为空)
  DEFAULT (默认值)
  FORING KEY (外键)下面解析

-格式:
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次的


猜你喜欢

转载自blog.csdn.net/weixin_42100915/article/details/80569296