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返回不同值求和