SQL中四种常用的语法类型
··· DDL 数据库定义语言
常用语句:create,drop,alter,show。
· create(增)
· 创建数据库:create database name character set utf8;
· 创建表:create table name (col1_name type1, col2_name type2); 创建的表必须有字段
· drop(删)
· 删除数据库:drop database name;
· 删除表:drop table name;
· alter(改)
· 修改数据库编码:alter database name character set utf8;
· 修改表字段:alter table name change col_old col_new varchar(50);
· 修改表字段类型:alter table name modify col varchar(50);
· 增加一个表字段:alter table name add col_name varchar(50);
· 删除一个表字段:alter table name drop col_name; # 一次只能删一个字段。
· 添加一个主键:alter table name add primary key(id);
· 修改表名(rename):rename table old_name to new_name;
· show(查)
· 显示所有数据库:show databases;
· 显示所有表:show tables;
· 显示数据库的定义信息:show create database name;
· 显示表的创建细节:show create table name;
· 显示表的字段信息(desc):desc table_name;
··· DML 数据操作语言
常用语句:insert,update,delete
··· DQL 数据查询语言
常用语句:select from,where,group by,having,order by,limit
··· DCL 数据控制语言
常用语句:grant
1,insert
例子:insert into table_name(col1, col2) values (val1, val2), (val3, val4);
··· 注意:
· insert插入的数据库是之前use的数据库。
2,update
例子:update `table_name` set col=new_col where col='筛选条件';
··· 注意:
· update中字符串的连接不要使用+号,而要使用concat(a, b);方法。
· update子查询中的表不能是update更新的表,可以通过再套一层from子查询解决。
3,delete
例子:delete from `table_name` where col='筛选条件';
··· 三种删除方法的比较:
· 一行一行删除数据,有日志,可恢复。DML
delete from table_name;
· 一次删除数据,不会激活触发器,不可恢复。表和索引空间恢复初始大小。速度快。DLL
truncate table table_name;
· 删除表结构和数据,释放表和索引空间。DLL
drop table table_name;
4,select
···支持的方法:
聚合方法:count(), sum(), avg(), max(), min(); # 注意:count(*)或count(1)的性能高。
··· 其他操作:
去重:distinct col_name;
别名:col_name '别名' 或者 col_name as '别名'; # 注意:别名在后面执行语句可以直接使用;
保留小数:cast(val as decimal(15, 2));
5,from
··· 支持的连接操作:
内连接(交集):table1 A inner join table2 B on A.price = B.price;
左连接:left join;交集+左表剩下的部分。
右连接:right join;交集+右表剩下的部分。
笛卡尔积: cross join;
自然连接:nature join;连接字段名和值相同的行。
··· 关键字:
on:根据什么字段连接两个表。
using:类似于on,但是using会自动根据字段名连接。# 注意:两个表的字段名必须相同。
union:合并两个结果集并去重;union all不去重。 # 注意:两个结果集字段必须一样。
··· 注意:
· 对于中间表,如果要考虑没有记录的实体时,使用笛卡尔积。
· MySQL不支持outer join外连接(并集),可以使用left+union+right来实现。
· join与inner join等价;left join与left outer join等价。
· 当给表取了别名后,只能使用别名,不能使用表名。
6,where
支持的操作:
数值操作:>, =, <, >=, <=,判空:is null; is not null。
日期操作:包括数值操作,计算年龄:datediff(year, 年龄列, getdate())。
嵌套查询:where table1.price in (select table2.price
from table2
where table2.a > 80)
模糊查询:where name like '%斌%';%: 匹配一个或多个;_ 匹配一个;[a-z][^a-z]正则。
7,group by
例子:group by col_name 根据某个列分组。
··· 注意:
· 分组后的数据是一个个列表,因此在select中不能选择单个列,mysql8会返回每组的第一个
· group by后面可以跟多个列,多个列会同时作为分组依据
8,having
例子:group by col_name having count(*) > 2;
··· 注意:
· having是用来弥补在where中不能使用聚合函数的不足。
· where是对分组前的单条数据过滤,having是对分组后的组聚合数据过滤。
9,order by
例子:order by col_name 根据某个列排序。
··· 注意:
· 默认是升序,可以通过order by col_name desc降序排列。
· order by后面可以跟多个列,当第一个列相等时,再比较第二个列。
10,limit
例子:select * from name limit 2, 10; 在筛选后的结果中,返回从第2条开始,共10条数据
··· 注意:
· 项目中尽量多使用limit来分页。
· limit是一条SQL语句中最后过滤数据的地方,只能放在最后。
· SQL语句的编写顺序是select->from->where->group by->having->order by-->limit;
11,建表注意事项
··· MySQL常用数据类型:
· 类型(10):int, double, char, varchar, text, blob, date, time, datetime, timestamp;
· int(10)中的10表示显示宽度,与长度和范围没有关系,int都是占用4个字节。
· double(5, 2)表示长度为5,保留2位小数;最大为999.99。
· char(5)表示固定长度为5的字符串,不足部分空格填充;'aa '。
· varchar(50)是可变长最大长度为50的字符串,经常用。
· blob是字节类型,用来存储媒体文件,比如图片。
· timestamp是时间戳,会自动赋值。
··· 常用约束:
· 主键约束:id int primary key;联合主键 primary key(col1, col2);或使用alter添加。
· 唯一约束:unique;唯一约束的字段可以为空。
· 自动增长:auto_increment;不推荐。设置步长set @@auto_increment_increment=3
· 外键约束:foreign key (id) references student(sid)。如果从表的外键字段是主键则与主表是一对一;如果是其他字段则默认是一对多。
12,备份与恢复(导入导出)
··· 备份:mysqldump -u root -p database_name > d:/back.sql # 在命令行执行
··· 恢复:use database_name; source d:/back.sql; # 导入到某个数据库(推荐)
··· 注意:
· 不要使用其他工具导入。因为当数据量很大时,导入需要很久(可能几个小时)。
· 不推荐使用mysql -u root -p database_name < back.sql来导入数据。
其他注意事项
· SQL中任何数加上null结果为null,可以使用ifnull(price, 0)来避免,如果为null就返回0。
· MySQL中默认的单个文件大小是4M,通过更改my.ini的max_allowed_packed改变大小。
· SQL语句的执行顺序是from->where->group by->having->select->order by->limit