mysql(上)

sql
是结构化查询语言structed query language

基础语法:

1.标识符
1) 以字母开头
2) 可以包含数字、字母以及三个特殊符号($_ #)
3) 一般以单词连缀 并且 单词用下划线隔开
4) 不要和保留字、关键字重复

2.注释
1#
2 – 第二个破折号后面至少有一个空格
3/**/
4comment
注意comment一定要加在分号之前 其他的都是在语句结束后
#和 – 为当行注释 /* */为多行注释

  1. windows不区分大小写
    但linux 默认区分大小写
    故 表名 、库名 、字段名都小写
    4.sql语句以 ; 结束语句
    5.mysql 命令行指令
    Windows 启动mysql服务 net start mysql
    Mysql常用参数
    -P 端口号 3306
    -p 密码
    -u 用户名通常为root
    -V 版本号
    -h 主机地址

Sql语句

  1. DDL date definition language
  2. DML date manipulation language
  3. 查询语句
  4. 事务控制语句
  5. DCL date control language

数据库

  1. 创建数据库
    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 给数据表指定约束的时机是:

  1. 建表的同时为相应的数据列指定约束
  2. 建表后创建,以修改表的方式来增加约束
    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
)

猜你喜欢

转载自blog.csdn.net/qq_19934363/article/details/88086313