修改数据库的编码方式:
mysql> alter database general default character set gbk collate gbk_bin;建表的过程就是声明列的过程:
int系列 声明时的参数:(M) unsigned zerofill 1、数据默认有符号,可以修改为无符号: 2、关于增加新列:alter table tablename add score tinyint unsigned not null default 0。 3、mysql5.6 设置为无符号时,若输入负数,变为0,但不报错。 4、M与zerofill配合使用才有意义,代表补0后的总宽度,zerofill 默认无符号 5、alter table test add num smallint(5) zerofill not null default 0;
浮点型
float(M,D) decimal(M,D) # 确认下是否有这种类型 M表示“精度”:总的位数,,D表示“标度”表示小数位。 float(6,2) -9999.99 9999.99 默认有符号,可以定义为无符号: alter table salary add bonus float(5,2) unsigned not null default 0.00; float 能存10^38 ,小数点后能10^-38 若M<=24 4个字节,否则8个字节。
定点型 比float精确 分开存两部分。账户类将以用decimal,实际是整形存分
时间类型在的输入需要加引号 比char高效、节省空间 以date为例,input 20180424或者"2018-04-24"插入的日期都是2018-04-24 timestamp:显示形式与datetime相同,但是取值范围更加窄,输入为空或者NULL都是以当前时间填充。
create table calss( ID int primary key auto_increment, name varchar(10) not null default ‘’, gender char(1) not null default ‘’, company varchar(20) not null default ‘’, salary decimal(6,2) not null default 0.00, foodappend smallint not null default 0.00 )engine myisam charset utf8;
create table stuinfo( id int primary key auto_increment, name varchar(10) not null default ‘’, gender char(1) not null default ‘’, age int not null default 0 )engine myisam charset utf8;
约束的目的是为了保持一致性与完整性。在mysql中主要有一下5种约束: 1、主键约束 2、外键约束 3、非空约束 4、唯一约束 5、默认约束
1 单字段主键
方式1:创建表的时候设定为主键: 字段名 数据类型 PRIMARY KEY; 方式2:为已经存在的表添加逐渐约束: ALTER TABLE 表名 MODIFY 字段名 新数据类型 PRIMARY KEY; 删除主键约束:ALTER TABLE 表名 DROP PRIMARY KEY;2复合主键
方式1:创建表时指定复合主键:PRIMARY KEY(字段名1, 字段名2,......) 方式2:为已存在的表添加复合主键: ALTER TABLE 表名 ADD PRIMARY KEY(字段名1, 字段名2,......); 删除复合主键:ALTER TABLE 表名 DROP PRIMARY KEY;方式1:创建从表的时候直接添加外键
step1:创建主表 step2:创建从表并且添加外键: CONSTRAINT 外键名 FOREIGH KEY(从表外键) REFERENCE 主表名(主表主键) 方式2:为已存在的表添加外键约束 ALTER TABLE 从表名ADD CONSTRAINT 外键名 FOREIGN KEY(从表的外键字段名)REFERENCES 主表名(主表的主键字段名) 删除外键约束:ALTER TABLE 从表名 DROP FOREIGN KEY 外键名保证该列的值不出现重复。
方法1:创建表时添加: 字段名 数据类型 UNIQUE; 方式2:通过修改的方式: ALTER TABLE 表名 MODIFY 字段名 新数据类型 UNIQUE; 删除唯一约束:ALTER TABLE 表名 DROP INDEX 字段名;如果将某列定义了默认约束,在用户插入新的数据行的时候,如果没有为该列指定数据,那么数据库系统自动将默认值赋值给该列,默认值可以为NULL。
方法1:创建表时添加: 字段名 数据类型 DEFAULT 默认值; 方式2:通过修改的方式: ALTER TABLE 表名 MODIFY 字段名 新数据类型 DEFAULT 默认值; 删除唯一约束:ALTER TABLE 表名 MODIFY 字段名 数据类型;只有主键可以设置为自动增加,自动增加的起点为1,数据类型为泛INT类型。、
方法1:创建表时添加: 字段名 数据类型 PRIMARY KEY AUTO_INCREMENT; 方式2:通过修改的方式: ALTER TABLE 表名 MODIFY 字段名 新数据类型 AUTO_INCREMENT; 删除唯一约束:ALTER TABLE 表名 MODIFY 字段名 数据类型;一般不用加table关键字;在修改和删除操作中,条件表达式用于筛选出要作用的行,假如没有条件表达式,会作用在所有的行。
1如果列出字段名,只要给出响应字段的值即可,默认操作是插入所有列。 2即便是自增的,也要按顺序写。 3多行用逗号隔开,最后一条都是用分号结尾。 注意: 1、顺序和数目一致;char类型时间类型用英文半角单引号括起来(双引号也可以); 2、可以插入单条或者多条,单列或者多列,插入全部的列时可以省略字段名列表。
注意:where后面是表达式,哪一行使该行表达式为真,则修改哪行的值。如果修改的参数是名字,而有重名,则会修改多行。用and 可以在表达式中加多个条件。如果不加表达式会作用在所有的行。
truncate VS delete 1、delete后面可以接where字句 2、delete后,自增计数器不会初始化
小结:Alter table、delete from、insert+update+truncate 直接加表名
1、全列名可以用*代替; 2、now()函数,可以返回当前的时间 3、返回的顺序不需要和定义顺序一致 4、别名的两种方式:字段名AS别名|字段名 别名 5、DISTINCT 关键字去除重复行(多个字段的话,则需要考虑多列)
别名示例:
mysql> select id, name 姓名, gender as 性别, age as 年龄, now() 查询时间 from stuinfo;去重示例:
1、比较运算符 mysql> select name, gender from stuinfo where gender = “m”; 2、范围运算符 mysql> select name, age from stuinfo where age between 15 and 35; mysql> select name, age from stuinfo where age >=15 and age <= 35; 3、列表运算符 select name, age from stuinfo where age in (18, 20); # 19不会被选中 4、模式匹配运算符(必要时候用\转意) %:匹配任意长度的字符串 _:匹配任意单个字符 select name, age from stuinfo where name like “j%a” /姓名以j开头,包含a/; 5、空值判断 select name, age from stuinfo where age is not null; 6、逻辑运算符 AND的优先级高于OR YEAR函数可以获取日期类型数据的年份 mysql> select name, birth from stuinfo where YEAR(birth)=1995;
1默认是升序(最上面的值最小),降序用desc 2 可以按照多个字段排序(逗号隔开),前面的相同会激活后面的字段,而且不同字段可以使用不用的升降序规则 mysql> select * from stuinfo order by gender desc, birth desc;
1offset默认为0,表示越过0行,从第一行开始,N表示检索的行数 mysql> select name from stuinfo limit 1,1;
先对表格按照指定字段分组,字段值相同的作为一组再统计或者查询。
SELECT [DISTINCT]列名1,列名2... FROM 表名 [WHERE 条件表达式] GROUP BY 字段名 [HAVING条件表达式]1、select的字段只能是一下两种情况:应用了集合函数+包含在group by字句中 因为是分类汇总,所以要么是集合函数,要么是分类依据 mysql> select gender as 性别, count(*), sum(age) -> from stuinfo -> group by gender;
2、常与having字句一起使用,having对分组后的结果条件筛选,having字句只能出现在group by之后。 mysql> select gender, avg(age) from stuinfo -> group by gender -> having avg(age) >= 19;
理解:group by之后,数据被分成了若干组,例如上面的f组合m组,之后having在分组后的基础上筛选,所有having后面一半跟聚合函数,或者分类依据相关的操作.。所以如果出现了where group by和having,那么执行顺序为 1 执行where字句,筛选出合适的行 2 group by分组 3 having筛选出合适的分组 另外where VS having:where在group by之前作用,并且不能接聚合函数,having在group by 之后作用,并且可以而不是必须接聚合函数。
输出将两个表的所有组合,其结果称为笛卡尔积,一般没有实用价值。
定义:用比较运算符设置连接条件,只返回满足条件的数据行,是交叉连接生成的结果集合按照连接条件筛选之后形成的。
SELECT 字段名1,字段名2... FROM 表名1 [INNER] JOIN 表名2 ON 表名1.字段名 比较运算符 表名2.字段名1如果输出的字段在两个表中都有的话,那么必须用表名作为前缀以示区分,表名较长时,还可以用别名代替,别名前面的AS可以省略。 2 JOIN 必须和ON连用。 3通过两两连接可以实现多表连接。
现在有学生基本信息表,和学生成绩表,利用学号id做内连接处理。 mysql> select s.id, name, subjectname -> from stuinfo s, score -> where s.id = score.id -> order by s.id;与内连接不同,有主从表之分,实用外连接的时候,主表数据逐行去匹配从表中的数据,如果符合条件则返回到结果集中,如果没有找到匹配的数据行,主表保留,从表填充NULL。
1外连接只适合两个表。
SELECT 字段名1,字段名2 FROM 表名1 LEFT|RIGHT JOIN 表名2 ON 表名1.字段名 比较运算符 表名2.字段名;外连接包括三种类型:左连接 + 右连接 + 全连接
mysql> select s.id, name, subjectname, score -> from stuinfo as s left join score -> on s.id = score.id; mysql> select s.id, name, subjectname, score -> from stuinfo as s right join score -> on s.id = score.id;mysql社区版并不支持直接使用全连接FULL JOIN, 可以使用左右连接的UNION实现。
mysql> select s.id, name, subjectname, score from stuinfo s left join score e on s.id = e.id -> union -> select s.id, name, subjectname, score from stuinfo s right join score e on s.id = e.id;也是外连接,只不过用到的两份表是相同的而已,输出的字段要加前缀。 自连接有什么用:自连接的理解与应用 不加条件的自连接会得到笛卡尔乘积,是一种完全的排列,如果在此基础上添加条件就可以获得一些使用的结果:例如员工表有一个列时对应的领导,现在想看下那些员工的领导相同就可以使用自连接,再例如在成绩表中,查询数学成绩大于大于英语成绩的学生: 1简单的自连接排列:
mysql> select a.id, a.subjectname 数学, a.score, b.subjectname 英语, b.score -> from score a join score b -> on a.id = b.id;添加筛选条件:
mysql> select a.id, a.subjectname 数学, a.score, b.subjectname 英语, b.score -> from score a join score b -> on a.id = b.id -> where a.subjectname = "数学" -> and b.subjectname = "英语" -> and a.score >= b.score;是指查询分为两级查询,子查询的结果作为外部查询WHERE字句的一部分。可以多层嵌套。子查询不仅可以在SELECT中嵌套,也可以嵌套在INSERT、UPDATE、DELETE中。 有4中形式:比较子查询、IN子查询、批量比较子查询、EXITS子查询。
要求子查询的返回值最多有1个。
mysql> /*查询数学考86分的学生姓名*/ mysql> select id, name from stuinfo -> where id = (select id from score where subjectname = "数学" and score = 86);1 使用ANY 谓词:ANY与IN类似,但是IN实际上是面向一个集合,就算不在子查询中也能使用。
WHERE 字段名 = ANY(......)2 使用ALL谓词
表示存在某种情况的时候,例如某个班级的学生成绩,假如有挂科的就显示所有的成绩,否则什么也不显示。
mysql> select * from score -> where exists (select * from score where score < 70);首先记住:以第一个select为主。指的是对多个查询结果集合并,要求如下:
1各个select语句的输出字段书必须相同; 2相同位置的字段数据类型兼容或者相同; 3合并的结果的字段名是第一个select语句的字段名,所以别名只能在第一句话中取; 4如果要使用order by只能在union之后使用,而且字段要使用第一个select中的字段。
