sql
是结构化查询语言structed query language
基础语法:
1.标识符
1) 以字母开头
2) 可以包含数字、字母以及三个特殊符号($_ #)
3) 一般以单词连缀 并且 单词用下划线隔开
4) 不要和保留字、关键字重复
2.注释
1#
2 – 第二个破折号后面至少有一个空格
3/**/
4comment
注意comment一定要加在分号之前 其他的都是在语句结束后
#和 – 为当行注释 /* */为多行注释
- windows不区分大小写
但linux 默认区分大小写
故 表名 、库名 、字段名都小写
4.sql语句以 ; 结束语句
5.mysql 命令行指令
Windows 启动mysql服务 net start mysql
Mysql常用参数
-P 端口号 3306
-p 密码
-u 用户名通常为root
-V 版本号
-h 主机地址
Sql语句
- DDL date definition language
- DML date manipulation language
- 查询语句
- 事务控制语句
- DCL date control language
数据库
- 创建数据库
create database [if not exists] 数据库名[default character set编码格式];
//库名与应用名称尽量一致。
// 库名全小写
// utf8 编码格式写为 ‘utf8’
//如果不加[if not exists] 若数据库已存在,则会报错
2删除数据库
drop database [if exists]数据库名;
//同数据库创建
3修改数据库编码格式
alter database 数据库名[default] character set 编码格式;
4展示数据库
show databases;
show create database 数据库名;
5默认使用数据库
use数据库名;
6如何修改数据库名
无法使用简单sql语句【安全完成】
1) 复制数据库到新数据库中
2) 删除旧数据库
表
行——记录
列——字段
1创建表
create table [if not exists] 表名 (
) default character set utf8;
//这里无论是 utf8 还是 ‘utf8’都可以
注意
1)规范上表名不能是复数
表的命名最好是加上“业务名称_表的作用”
2)创建 无任何字段 的表 会报错
3)表名后面跟的是圆括号
4)字段与字段用逗号隔开,所以最后一行没有逗号
5) 规范上 ,任何字段如果都为非负数,必须设置为 unsigned
6) 如果只保存日期 则选择 date ,如果要保存日期和时间 则选择datetime
7)小数decimal 也可以直接写dec 最好用decimal 而不是用float 或者double
8)字符串char/varchar/text
Char 是字符串长度固定 如邮编 股票代码 手机号码后四位
varchar 是可变长字符串,不预先分配存储空间,但必须在设置字段时即声明最大字符长为多少。注意这个数字是 指 字符串长度 而不是最大字节数 ,varchar(500) 既可以存500个英文字母,也可以存500个汉字
如果varchar长度超过 5000,最好直接定义字段类型为 text ,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
9)所有数据类型都可以为null,包括布尔、int、float等
且null不等于null所以判断是不是null 要用isnull() 函数
10)表必备三字段: id , gmt _ create , gmt _ modified 。
其中 id 必为主键,类型为 unsigned bigint 、单表时自增、步长为 1。 gmt_create,
gmt_modified 的类型均为 datetime 类型,前者现在时表示主动创建,后者过去分词表示被动更新。
11)用子查询建表
Create table 待补充
2更新表
1) 字段
增加字段
alter table 表名
add();
//表级语法
注意add 也要加上alter table 表名
修改字段类型
alter table 表名
modify;//列级语法
注意 modify必须用在已有的字段
修改字段名
alter table 表名
change 旧字段名 新字段名 类型属性 ;
2)更改表名
alter table 表名rename [to] 新表名
3删除表
drop table 表名;
4展示数据表
show tables;
查看表的字段信息:desc 表名;
查看表的所有信息:show create table 表名;
5截断表
Truncate 表名
结果是删除整个表的数据,但是其过程是先删除表,再重建表的结构,故属于ddl
TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE
无事务且不触发 trigger ,有可能造成事故,故不建议在开发代码中使用此语句。
说明: TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。
约束(constraint ) 是在表上强行执行的数据校验规则,用于确保数据库里数据的完整性
1.一般数据库支持五种约束:
非空约束 、唯一约束、主键约束、外键约束、检查约束
但是mysql 不支持检查约束
2约束分为:
单列约束(列级约束)
多列约束(表级约束)
3建立约束的语法 分为:
列级约束语法 表级约束语法
列级语法就是对某一行 通过约束名 加上约束
但是,如果想为多列组合建立唯一约束,或者想自行命名唯一约束,则需要使用表级语法
创建时使用表级语法或者add使用表级语法为多个字段进行唯一约束
4 给数据表指定约束的时机是:
- 建表的同时为相应的数据列指定约束
- 建表后创建,以修改表的方式来增加约束
5约束的建立和删除(一般无法修改)
非空约束 not null
1非空约束只有单列约束 且只能用列级约束语法
在定义列时,后面加not null
2当定义列时,后面加null 默认为null
删除非空约束时,modify语句后面加null
增加非空约束时,modify语句后面加notnull
3mysql 没法为非空约束 起名字
//所有数据类型都可以为null,包括布尔、int、float等
且null不等于null所以判断是不是null 要用isnull() 函数
唯一约束 unique
既有 单列约束 也有 多列约束
既可以通过 表级约束语法 也可以 通过列级约束语法建立
列级约束语法:
1)建表时 列名 属性 unique
2)alter table 表名 modify列名 属性 unique
表级约束语法
1)建表时 constraint 约束名 unique(字段名1,字段名2…);
2)alter table 表名
add constraint约束名unique(字段1,字段2…);
删除【唯一约束】
大多数数据库用alter 后面加drop constraint 约束名
但是mysql 使用Drop index约束名
故mysql的sql语句应该是
alter table 表名
drop index 约束名
这只是删除唯一约束,而不是所有约束的方法
注意:
1唯一约束,可以有多个null,因为null不等于null
2当为某列创建唯一约束时,系统自动为该列创建唯一索引,如果不给唯一索引起名,则默认与该列同名
3规范上唯一约束为uk_字段名
4 多行唯一约束 就是要求 这几行的【组合值】 不能重复,单行可以重复
5规范上, 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
主键约束 primary key
既有 单列约束 也有 多列约束
既可以通过 表级约束语法 也可以 通过列级约束语法建立
主键约束 等于 非空约束加上唯一约束
每一个表最多一个 主键约束 ,但是一个主键可以建立在多个字段上
规范上 将主键命名为 pk_字段名 但 这个名字似乎不起作用,mysql 默认 主键名 primary(待确定)
添加方法同唯一约束相同
只不过将 unique 改成 primary key
删除主键
alter table 表名
drop primary key
如果某个字段为 主键,且 为整数(如int 、bigint),则可以设置为自增长
主键自增:
CREATE TABLE test(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(15) NOT NULL
) ;
https://blog.csdn.net/xuxu120/article/details/72833848
1如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。
2当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。
3当插入记录时,如果为AUTO_INCREMENT字段明确指定了一个数值,则会出现两种情况:
情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;
情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。
外键约束
主要用于构建 一个表的两个字段 或者 两个表的两个字段之间 的参照关系。
如果是两个表,则一个为主表,一个为子(从)表。
外键建立在从表上,从表的外键列值要么在主表参照列值的范围内,要么为null
外键的参照列必须为主键或者唯一键列
注意:外键列 和参照列的数据格式必须相同
规范上最好严格相同,防止因字段类型不同造成的隐式转换 导致问题
http://seanlook.com/2016/05/05/mysql-type-conversion/
建立外键时,如果该字段没有索引, mysql自动为该字段 建立普通索引
一个表内可以有多个外键
外键约束一般用来 表现 两个实体 一对一,或者一对多的关系
一对一 则可以在任意一张表内添加外键
而一对多 则只是在 多的那一方 建立外键
如: 老师有多个学生,则在学生表建立外键
如果想表示多对多的关系,根据数据库三大范式,则需要再建第三张表,而不是通过外键表示
https://www.zhihu.com/question/24696366
建立从表前,一般先建立主表
删除主表记录时,必先删除从表相关联的数据
可以手动完成,也可以通过级联删除完成
Msyql 无法使用列级语法来建立外键
只能通过 表级语法建立外键
[constraint 外键名] foreign key(从表字段1….) references 主表名(主表字段1…)
默认外键名为: 表名_ibfk_n n从1开始增加
个人感觉 外键名为 字段名_fk 比较好
如果外键在一个表内的两个字段上,被称为自关联
[constraint 外键名] foreign key(字段1….) references 此表名(字段1…)
增加外键
也可以通过
alter table 表名
add(
);
级联操作
第一种是更新或者删除主表记录,则自动更新 删除相对应的 从表记录
为 建立外键时,额外添加 on delete cascade 其他的部分布标
[constraint 外键名] foreign key(从表字段) references 主表名(主表字段)on delete cascade;
第二种是,更新 删除主表记录时,则自动将对应的从表记录 的 外键列 值变为null
on delete set null 注意只是外键列那一个字段变为null ,而不是整个记录
DML date manipulation language
1插入数据
insert into 表名[字段名]values();
如果不想列出表名,就把所有的列都按照顺序列出值
注意
1.可以使用null代替主键
2.标准的sql一次只能插入一条记录
但是 mysql允许一次插入多条记录
格式为:
insert into表名[字段名] values(),values()…values;
2更新数据
update表名 set 字段名=‘ ’where 判断条件
注意
1.为单引号
2.分组判断用having
3.如果没有where 即所有符合条件的记录都为true即修改所有,
3删除数据
delete from 表名where
不需要指定字段,因为删除都是一行一行的删
问题:delete from 能否跟group by连用 ?? 删除某一组
可以 但是不能直接连用 需要嵌套在 子查询中
DELETE FROM study_test
WHERE n IN (
SELECT n
FROM (
SELECT n
FROM study_test
GROUP BY n
HAVING COUNT(*) > 1
) t
)