sql设置主键中一般规则?
不能部分使用 distinct
关键字 ?
distinct
关键字应用于所有列而不仅是前置它的列.
(distinct
关键字区分粒度为的查询结果的行 , 如果一行数据显示不同则显示 , 相同则只显示一行数据)
mysql> SELECT DISTINCT student_id ,student_name,student_birthday FROM student; +------------+--------------+------------------+ | student_id | student_name | student_birthday | +------------+--------------+------------------+ | 1 | java | 2021-11-01 | | 2 | python | 2021-11-01 | | 3 | c | 2021-11-01 | | 4 | java | 2021-11-02 | | 5 | java | 2021-11-02 | +------------+--------------+------------------+ 5 rows in set (0.00 sec) mysql> SELECT DISTINCT student_name,student_birthday FROM student; +--------------+------------------+ | student_name | student_birthday | +--------------+------------------+ | java | 2021-11-01 | | python | 2021-11-01 | | c | 2021-11-01 | | java | 2021-11-02 | +--------------+------------------+ 4 rows in set (0.00 sec)
limit 1,1
实际表示?
limit 1,1
表示从第 2 行开始,显示 1 行 , limit 检索第一行为行 0 .limit 4 offset 3
表示 : 表示从第 3 行开始,显示 4 行 .exist
和 not exist
效率高于 in
和 not in
like '1000'
和 regexp '1000'
like '1000'
匹配时匹配整列 , 即使列中包含 1000 也不会返回结果regexp '1000'
匹配时匹配整列 , 列中包含 1000 即返回结果多数DBMS拼接使用 +
或 ||
, MySQL使用Concat(A,B,C...)
函数实现
DATEDIFF(NOW(),'1995-12-01')
函数可计算指定日期与现在相差天数
STR_TO_DATE('1995,12,01','%Y,%m,%d')
函数可将指定字符串转成日期格式
count( 1 )
表示在查询结果的基础上为每行新增一列 1 的填充列 , 计算 增加1的个数达到统计效果
group by
使用时除聚合计算以外, select
语句中每个列都必须在group by
子句中给出
where
用于分组后组外过滤 , having
用于分组时组内过滤
union
用于组合相同的返回列, 并去除组合后重复值 , union all
组合后不去除重复值
MyISAM
引擎支持全文搜索(仅作了解)
代码
-- 建表 CREATE TABLE class( class_id INT, class_name VARCHAR(20), PRIMARY KEY (class_id), FULLTEXT(class_name) -- 指定全文搜索需要建立的索引列 )ENGINE=MYISAM; --使用全文搜索 SELECT class_name FROM class WHERE MATCH(class_name) AGAINST('p1');
insert into
中间可添加关键字LOW_PRIORITY
以降低插入数据优先级, 保证select
优先级
insert select
中语句不要求返回列名一致 , 但要求返回查询结果返回顺序与插入一致
update
语句更新多行时, 如果一行出现错误可导致整体更新失败 , update ignore tablename
中ignore
可跳过失败继续更新
alter table 的常用用法
给表添加一列
ALTER TABLE student ADD remark VARCHAR(20);
给表修改列名
ALTER TABLE student CHANGE remark intro varchar(30);
删除列
ALTER TABLE student DROP intro;
修改列类型
ALTER TABLE student MODIFY remark VARCHAR(100);
SQL客户端写存储过程时, 需要用 DELIMITER
命令设置结束符
DELIMITER // --设置操作符 CREATE PROCEDURE query_student_info_arg( OUT student_id INT, OUT class_id INT, OUT school_id INT ) BEGIN SELECT MAX(student.`student_id`) INTO student_id FROM student ; SELECT MAX(class.`class_id`) INTO class_id FROM class ; SELECT MAX(school.`school_id`) INTO school_id FROM school ; END// DELIMITER ; -- 在将操作符设置回 ;
使用EXPLAIN
命令查看执行计划时 , type
列执行效率依次从最优到最差分别为:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
使用EXPLAIN
命令查看执行计划时 , Extra
列重要值及优化方案分别为:
distinct: 一旦mysql找到了与行相联合匹配的行,就不再搜索了 Using index:这发生在对表的请求列都是同一索引的部分的时候,返回的列数据只使用了索引中的信息,而没有再去访问表中的行记录。是性能高的表现。 Using where:mysql服务器将在存储引擎检索行后再进行过滤。就是先读取整行数据,再按 where 条件进行检查,符合就留下,不符合就丢弃。 Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。 Using filesort:mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。
文章部分笔记来源 : 《MySQL必知必会》by Ben Forta 、《Java开发手册(泰山版)》by Alibaba
文章博客其他地址 :
[STR_TO_DATE 函数转换日期格式说明]: https://www.cnblogs.com/feiwenstyle/p/9531571.html "STR_TO_DATE 函数转换日期格式说明"
[mysql explain命令说明及优化方案]: https://cloud.tencent.com/developer/article/1093229 "mysql explain详解"