MySQL之SQL基本语法

传送门

SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口

一、查询数据

需要最基本的SQL增删改查语法知识。
参考下面大神文章:
链接:SQL基本增删改查语法

二、修改数据

1、修改表

--创建表
CREATE TABLE IF NOT EXISTS STUDENT(
ID INT NOT NULL AUTO_INCREMENT COMMENT '主键自增',
USER_NAME VARCHAR(30) COMMENT '名字',
AGE INT COMMENT'年龄',
CREATE_TIME DATETIME COMMENT '创建时间',
PRIMARY KEY (ID)
)ENGINE=INNODB DEFAULT CHARSET=utf8
--查看创建表语句:SHOW CREATE TABLE STUDENT
--显示表的结构:DESC STUDENT 
--修改表名:Alter table student rename as student1
--增加表字段:alter table student add score varchar(20)
--修改表字段(约束):alter table student modify score int 
--修改表字段(重命名):alter table student  change age age1 int 
--删除表字段:alter table student drop age
--删除表:drop table if exists student
--已存在字段添加默认值 :ALTER TABLE auth_sys_menu MODIFY sort_number int NOT NULL DEFAULT 333
--查看创建表语句:SHOW CREATE TABLE auth_sys_user_role
delete删除表问题:
重启数据库后,InnoDB自增列会从1开始(存在内存中的,断电丢失),MyISAM自动上上一个自增量开始(存在文件中,不会丢失,没有问题)

删除主表其关联从表情况:
无外键:相当于没有任何关联数据,主表直接删除,从表数据不动
有外键:创建外键时定义了ON DELETE CASCADE:关联数据被自动删除
没有定义ONDELETECASCADE:有关联数据时报错

SELECT CONCAT('1','23') --拼接字符串  123
SELECT NOW () --获取当前时间  2020-12-14 23:19:50
SELECT COUNT(*)  FROM STUDENT--查询所有数据量,包含null
SELECT COUNT(1) FROM STUDENT--查询所有数据量,包含null,在两个列(含两列)以上的表效率高,一列还是COUNT(*)SELECT COUNT(USER_NAME) FROM STUDENT --查询USER_NAME的数量,不包含USER_NAMEnull的数据,没有COUNT(1)效率高

2、修改索引

--显示所有的索引信息:SHOW INDEX FROM STUDENT
--创建索引:ALTER TABLE STUDENT ADD INDEX INDEX_CREATE_TIME(CREATE_TIME) 
--创建索引:CREATE INDEX INDEX_USER_NAME ON STUDENT(USER_NAME)
--创建唯一索引:ALTER TABLE STUDENT ADD CONSTRAINT INDEX_XX  UNIQUE INDEX (XX)  (SQLServer少了unique后面的index)
--创建全文索引:ALTER TABLE STUDENT ADD FULLTEXT INDEX INDEX_USER_NAME(USER_NAME) 
--查看性能(神技):EXPLAIN SELECT * FROM STUDENT WHERE MATCH(USER_NAME) AGNIAST('刘')   --数据太少会没有效果的
--删除索引:ALTER TABLE STUDENT DROP INDEX INDEX_USER_NAME
--使用全文索引:select * from STUDENT where match(USER_NAME,SIM_NAME) against('xxx xxx');
注意: match() 函数中指定的列必须和全文索引中指定的列完全相同,否则就会报错,无法使用全文索引,这是因为全文索引不会记录关键字来自哪一列。如果想要对某一列使用全文索引,请单独为该列创建全文索引。

3、函数

3.1、自定义函数

--自定义个函数
DELIMITER $$ --写函数前必须的标记,必写这句
CREATE FUNCTION MYFUNCTION() --函数名称
RETURNS INT --返回值
BEGIN --函数开始
    DECLARE NUM INT DEFAULT 1000000;
    DECLARE I INT DEFAULT 0;
        WHILE I < NUM DO
        --插入语句
        INSERT INTO STUDENT (USER_NAME,AGE,CREATE_TIME) VALUES (CONCAT('鸡腿姑娘',I),18,NOW())
        SET I = I+1;
        END WHILE;
    RETURN I;
END --函数结束

SELECT MYFUNCTION() --使用自定义函数,插入1万条用了41.268s

3.2、聚集函数

count(*)count(主键 id)count(1) 都表示返回满足条件的结果集的总行数;而
count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。
按照效率排序的话,count(字段)<count(主键 id)<count(1)count(*),所
以我建议你,尽量使用 count(*)count(*)MySQL中专门做了优化。

三、关系模型

1.通常情况下,字段应该避免为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为NULL。
2.全局唯一UUID类型(微软GUID就是用的较多的代表):使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,时间在最前面,所以可以排序,大部分编程语言都内置了GUID算法,可以自己预算出主键。自增主键例如BIGINT NOT NULL AUTO_INCREMENT,不用int是因为int约21亿,想ipcalllog这种表就不够用。
3.ALTER TABLE students ADD CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES classes (id);
其中,外键约束的名称fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键).由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,只是它起到了外键的作用而已。
要删除一个外键约束,也是通过ALTER TABLE实现的ALTER TABLE students
DROP FOREIGN KEY fk_class_id;
生成主键类型:
A.自增 sqlServer的自增 现在不用了 主要用jdbc生成代码 (缺点:手动插入主键麻烦,导入数据主键冲突)
B.MAX+1 参考其他MAX+1写法生成代码 (缺点:并发,两人读到相同MAX后,插入ID重复)
C.自制+1 类似MAX+1 序列值 解决了并发 (缺点:导入数据,推荐字符型自制+1)
D.GUID主键 自动生成或者程序生成,随机的无顺序的不重复的 (缺点:优点是解决了上面的问题,但是16字节太长不容易记忆,存储空间大,索引时间慢)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝影铁哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值