MySQL基本语法


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