mysql最佳实践

最佳实践:
    • 给表加一个id字段(int),作为单一主键,(自增、无符号)
    • 字符串做主键,效率肯定没有整数高。
    • 表里面有记录的情况下,不能随便乱加字段,尤其是表在线上正在使用时
    • 所以,设计表时多添加两个字段reserved1、reserved2,作为冗余,空间换实践,避免上述情况发生
    • 表设计时,是否需要冗余字段,需要看将来对表的改动有多大


关系操作

选择 :横向(行)

投影 :纵向(字段)

连接 :多个表连接

DML

插入
INSERT INTO table_name(col_name, …)  VALUES('xx', …);

批量插入(select查询结果插入,导数据时用)
INSERT INTO table_name SELECT …;

主键冲突、唯一件冲突时插入变更新
INSERT INTO table_name(col_name, …)  VALUES('xx', …) ON DUPLICATE KEY UPDATE col_name=value, ….;

主键冲突、唯一键冲突时插入被忽略
INSERT IGNORE INTO table_name(col_name, …)  VALUES('xx', …);


更新

UPDATE table_name SET col_name=exp1 WHERE where_definition;

查询

select 1;

select * from employees;

select emp_no,first_name,last_name form employees;

select emp_no,CONCAT(first_name,'  ',last_name) as name from employees;

select emp_no,first_name,last_name form employees limit 5; --拿前5个

select emp_no,first_name,last_name form employees limit 5 offset 2; --从第3条开始拿5条(分页)

select * from employees where emp_no < 10015 and last_name like 'p%'; --%多个字符、_单个字符

select * from employees where emp_no between 10010 and 10015 and last_name like 'p%'; --[10010,10015]

select * from employees where emp_no in (10001,10002,10003);

select * from employees where emp_no in (10001,10002,10003) order by emp_no desc; --降序

select * from employees order by emp_no desc,gender desc; --分别降序,先满足第一个

select distinct emp_no from salaries; --过滤重复,可以作为in的集合

select distinct emp_no,salary from salaries;

select count(*) from salaries; --看行数,coutn星号或主键

select sum(salary),count(*),avg(salary),min(salary),max(salary) from salaries;

select sum(distinct emp_no) from salaries; --先排重,在计算

select * from salaries group by emp_no; --不是我们想要的分组结果

select emp_no,salary from salaries group by emp_no; --返回第一行或最后一行

select emp_no,sum(salary),max(salary),avg(salary),count(*) from salaries group by emp_no; --每个人的薪资总和

select emp_no,sum(salary),max(salary),avg(salary),count(*) from salaries
group by emp_no
having emp_no>10002; --分组后的条件

运算符

=    等于

<>  不等于

>、<、>=、<=  大于、小于、大于等于、小于等于

between  在某个范围内,between a and b 等价于[a, b]

like  字符串模式匹配,%表示任意多个字符,_表示一个字符

in    指定针对某个列的多个可能值

and   与

or   或

distinct 不返回重复记录

select distinct dept_no from dept_emp;

select distinct emp_no from dept_emp;

select distinct dept_no, emp_no from dept_emp;

聚合函数

count(expr)  返回记录中记录的数目,如果指定列,则返回非null值的行数

count(distinct expr, [expr])  返回不重复的非null值的行数

avg([distinct] expr)  平均值

min(expr)   最小值

max(expr)  最大值

sum([distinct] expr)  求和,distinct返回不同值求和

原文地址:https://www.cnblogs.com/lizitest/p/9553200.html