mysql的建立除了常见指示
(1)createdatabase 库名;
createdatabase test01(写起两个资料库英文名字)
(2)删掉资料库:dropdatabase 库名;
(3).采用数据库:use库名;
(4)常见的资料库指示
1、怎样进占mysql资料库
mysql -u username-p
1.1、选定IP、路由器
mysql -uroot -h192.168.1.213 -P3306 -p123456
-P(小写):选定路由器;
-p(小写):选定公钥;
2、怎样迈入/停用mysql服务项目
service mysqlstart/stop
3、查阅mysql的状况
service mysqlstatus
4、怎样表明数大部份资料库
show databases
describetable_name;
6、采用showtables句子就能表明现阶段资料库中大部份的表。
2、mysql的表
(1)建立表,表名 除了字段需要定义成为什么样的数据类型,
建立表句子:createtable 表名(字段名1字段类型 字段约束,字段2字段类型 字段约束…);
CREATE TABLE hero (
id int(11) AUTO_INCREMENT,
name varchar(30) ,
hp float ,
damage int(11) ,
PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;
(2)建立与现有表一样字段的新表:
createtable 表名like已有表名;
create table shuju2 like shuju ;
(3)将查询结果建立新表:
createtable 表名select* from 现有表where…(查询句子);
将查询结果插入表:insertinto 表名select字段名from表名(查询句子);
create table 表名 后面在加上两个查询句子。
create table shuju3 select * from shuju2 ;
(4)、查阅表结构,查阅建表句子,删掉表
1.查阅表结构:desc表名;
desc shuju ;
2.查阅建表句子:showcreate table 表名;
show create table shuju ;
3.删掉表:droptable 表名;
(5)修改表结构
1.对数据表重命名:altertable 表名rename 新表名;
altertable shuju rename shuju1;
2.增加字段:altertable 表名add 字段英文名字段类型 字段约束;(PS:可用first/after函数调整字段位置)
altertable shuju3 add bothday int(10) ;
要添加修改id主动自增的情况下,必须设置主键
alter table shuju3 modify id int(11) auto_increment;
3.删掉字段:altertable 表名drop 字段名;
alter table shuju2 drop bothday;
4.修改字段类型及约束:altertable 表名modify 字段名新类型 新约束;(PS:如不加新约束,会将建表时的约束清空,主键、外键、唯一约束除外)
alter table shuju3 modify bothday double ;
5.修改字段名称:altertable 表名change 旧字段名新字段名 新字段类型 新约束条件;
altertable shuju3 change bothday bothday01 double ;
6.修改资料库引擎:altertable 表名engine=;(PS:主要有InnoDB和MyISAM,InnoDB对经常修改表数据友好,MyISAM对经常查询表友好)
7.增加主键:altertable 表名addprimary key(字段名);
8.删掉主键:altertable 表名dropprimary key;
9.增加外键:altertable 表名addconstraint 外键名foreignkek(字段名)references 主表(主键);
ALTERTABLEstudents
ADDCONSTRAINTfk_class_id
FOREIGNKEY(class_id)
REFERENCESclasses (id);
10.删掉外键:altertable 表名dropforeign key 外键名;
要删掉两个外键约束,也是通过ALTERTABLE实现的:
ALTERTABLEstudents
DROPFOREIGNKEYfk_class_id;
注意:删掉外键约束并没有删掉外键这一列。删掉列是通过DROPCOLUMN …实现的。
关系资料库通过外键能实现一对多、多对多和一对一的关系。外键既能通过资料库来约束,也能不设置约束,仅依靠应用程序的逻辑来保证
11.删掉唯一约束:altertable 表名dropindex 字段名;
12.设置自动增长的初始位置:altertable 表名auto_increment=n;
mysql插入数据
如果数据是字符型,必须采用单引号或者双引号,如:”value”。
insert into hero values (null, 插入一条数据, 616, 100);
insert into shuju (id,name,age,hight)values(null,插入一条数据利用字段与值对应插入,99,180);
添加多条数据
向表选定字段插入多条数据:insertinto 表名(字段1,字段2…)values
(数据1,数据2…),(数据1,数据2…),(数据1,数据2…),(数据1,数据2…);
加载外部数据到表:Load data local infile ‘数据路径’Into table 表名 Fields terminated by ‘分隔符’Ignored 1 lines;
mysql查询数据
(1)查询表的大部份数据
select * from hero;
(2)查询统计表中有多少条数据
select count(*)from hero;
(3)查询表明表中前3条数据
select * from herolimit 0,3;
(4)条件查询:格式:Select列名 From数据表名 Where查询条件
SELECT句子能通过WHERE条件来设定查询条件,查询结果是满足查询条件的记录。例如,要选定条件“分数在80分或以上的学生”,写成WHERE条件就是SELECT* FROM students WHERE score >= 80。
其中,WHERE关键字后面的score>= 80就是条件。score是列名,该列存储了学生的成绩,因此,score>= 80就筛选出了选定条件的记录:
SELECT * FROM students WHERE score >=80 OR gender = M;
1、Groupby 分组字段
2、Having分组后的约束条件
3、Orderby 排序字段
SELECT * FROMstudents ORDER BY score desc ;
4、Limit限制输出行数。
select * from herolimit 0,3;
5、按NOT条件查询students:
如果不加括号,条件运算按照NOT、AND、OR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号能改变优先级。
SELECT * FROM students WHERE NOTclass_id = 2;
(5)、投影查询
采用SELECT* FROM <表名>WHERE <条件>能选出表中的若干条记录
我们能用SELECT列1,列2,列3FROM …,让结果集仅包含选定列。这种操作称为投影查询。
SELECT id, score, name FROMstudents;
(6)、排序查询
1. Order by 排序字段 按score从高到低 只是加了desc
SELECT * FROM students ORDER BYscore desc ;
2.按score从低到高
SELECT id, name, gender, score FROMstudents ORDER BY score;
3. 如果有WHERE子句,那么ORDERBY子句要放到WHERE子句后面。例如,查询一班的学生成绩,并按照倒序排序:
SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;
(7)、分页查询
采用SELECT查询时,如果结果集数据量很大,比如几万行数据,放在两个页面表明的话数据量太大,不如分页表明,每次表明100条。
要实现分页功能,实际上就是从结果集中表明第1~100条记录作为第1页,表明第101~200条记录作为第2页,以此类推。
因此,分页实际上就是从结果集中“截取”出第M~N条记录。这个查询能通过LIMIT<M> OFFSET <N>子句实现。我们先把大部份学生按照成绩从高到低进行排序:
SELECT id, name, gender, score FROMstudents ORDER BY score DESC;
现在,我们把结果集分页,每页1页的记录,能采用LIMIT3 OFFSET 0:
上述查询LIMIT3 OFFSET 0表示,对结果集从0号记录开始,最多取3条。注意SQL记录集的索引从0开始。
如果要查询第2页,那么我们只需要“跳过”头3条记录,也就是对结果集从3号记录开始查询,把OFFSET设定为3:
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 3;
类似的,查询第3页的时候,OFFSET应该设定为6:
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 6;
可见,分页查询的关键在于,首先要确定每页需要表明的结果数量pageSize(这里是3),然后根据现阶段页的索引pageIndex(从1开始),确定LIMIT和OFFSET应该设定的值:
pageIndex就是从第几页查询起来的,因为一页是表明3条,第二页也是表明3条,只不过就是看第几页,那3条数据是什么罢了。
LIMIT总是设定为pageSize;
OFFSET计算公式为pageSize * (pageIndex – 1)。
这样就能正确查询出第N页的记录集。
采用LIMIT<M> OFFSET <N>分页时,随着N越来越大,查询效率也会越来越低。
采用LIMIT<M> OFFSET <N>能对结果集进行分页,每次查询返回结果集的一部分;
分页查询需要先确定每页的数量和现阶段页数,然后确定LIMIT和OFFSET的值。
(8)、聚合查询
1、仍然以查询students表一共有多少条记录为例,我们能采用SQL内置的COUNT()函数查询:
SELECT COUNT(*) FROM students;
—采用聚合查询并设置结果集的列名为num:
SELECT COUNT(*) num FROM students;
2、COUNT(*)和COUNT(id)实际上是一样的效果。
另外注意,聚合查询同样能采用WHERE条件,因此我们可以方便地统计出有多少男生、多少女生、多少80分以上的学生等:
SELECT COUNT(*) boys FROM studentsWHERE gender = M;
3、函数 说明
SUM 计算某一列的合计值,该列必须为数值类型
AVG 计算某一列的平均值,该列必须为数值类型
MAX 计算某一列的最大值
MIN 计算某一列的最小值
注意,MAX()和MIN()函数并不限于数值类型。如果是字符类型,MAX()和MIN()会返回排序最后和排序最前的字符。
要统计男生的平均成绩,我们用下面的聚合查询:
SELECT AVG(score) average FROMstudents WHERE gender = M;
要特别注意:如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL:
4、每页3条记录,怎样通过聚合查询获得总页数?
SELECTCEILING(COUNT(*) / 3) FROM students;
有向上或者向下舍入的例如16除3 就是6页
如果是10.9除3类似就是3 看情况
5、分组
如果我们要统计一班的学生数量,我们知道,能用SELECTCOUNT(*) num FROM students WHERE class_id =1;。如果要继续统计二班、三班的学生数量,难道必须不断修改WHERE条件来执行SELECT句子吗?
对于聚合查询,SQL还提供了“分组聚合”的功能。我们观察下面的聚合查询:
SELECT COUNT(*) num FROM students GROUPBY class_id;
执行这个查询,COUNT()的结果不再是两个,而是3个,这是因为,GROUPBY子句选定了按class_id分组,因此,执行该SELECT句子时,会把class_id相同的列先分组,再分别计算,因此,得到了3行结果。
但是这3行结果分别是哪三个班级的,不好看出来,所以我们能把class_id列也放入结果集中:
SELECT class_id, COUNT(*) num FROMstudents GROUP BY class_id;
也能采用多个列进行分组。例如,我们想统计各班的男生和女生人数:
—按class_id,gender分组:
SELECT class_id, gender, COUNT(*) numFROM students GROUP BY class_id, gender;
(9)、多表查询
SELECT查询不但能从一张表查询数据,还能从多张表同时查询数据。查询多张表的语法是:SELECT* FROM <表1><表2>。
例如,同时从students表和classes表的“乘积”,即查询数据,能这么写:
SELECT * FROM students, classes;
这种一次查询两个表的数据,查询的结果也是一个二维表,它是students表和classes表的“乘积”,即students表的每一行与classes表的每一行都两两拼在一起返回。结果集的列数是students表和classes表的列数之和,行数是students表和classes表的行数之积。
5、mysql修改数据
(1)、修改表的那个字段的数据为那个值。这只是修改两个对应id的字段的值
更改满足条件的字段数据:update表名 set字段计算1,字段计算2…where 条件;
Update 表名 set 字段名= 值 whereid = 值;
update hero set hp = 818 where id = 1;
6、mysql删掉数据
(1)删掉一条数据。删掉满足条件的数据:delelefrom 表名where条件;
Deletefrom 表名 whereid = 值;
deletefrom hero where id = 1
(2)删掉大部份数据:
方式一:deletefrom 表名;
方式二:truncatetable 表名;
方式一会逐条进行删掉,速度较慢,方式二直接删掉,速度快;另外对自增字段,
方式一不能重置自增字段的初始位置,方式二能重置自增字段的其实位置;
(3)、资料库删掉句子:dropdatabase 【ifexists】db_name;(采用此指示时,一定要慎用。因为删掉,我们一般认为是不可逆的。)
【ifexists】为判断数据是否存在。
(4)
7、mysql备份
8、mysql还原
9、MYSQL是否迈入INNODB
10、MySQLwhere 子句
11、MySQLUPDATE 查询
12、MySQLDELETE 句子
13、简单的小结mysql的作用
资料库的采用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多。
做业务,要懂基本的SQL句子;
做性能优化,要懂索引,懂引擎;
做分库分表,要懂主从,懂读写分离…
14、事物的四大特性(ACID)
原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性:执行事务前后,数据保持一致,多个事务对同两个数据读取的结果是相同的;
隔离性: 并发访问资料库时,两个用户的事务不被其他事务所干扰,各并发事务之间资料库是独立的;
持久性: 两个事务被提交之后。它对资料库中数据的改变是持久的,即使资料库发生故障也不应该对其有任何影响。
15、SQL句子主要能划分为以下3个类别:
1、DDL(DataDefinition Languages)句子:数据定义语言,这些句子定义了不同的数据段、资料库、表、列、索引等资料库对象的定义。常见的语句关键字主要包括create、drop、alter等。
2、DML(DataManipulationLanguage)句子:数据操纵句子,用于添加、删掉、更新和查询资料库记录,并检查数据完整性,常见的语句关键字主要包括insert、delete、update和 select 等。
DCL(Data Control Language)句子:数据控制句子,用于控制不同数据段直接的许可和 访问级别的句子。这些句子定义了资料库、表、字段、用户的访问权限和安全级别。主要的句子关键字包括 grant、revoke 等。
16、关系模型
(1)主键
每一条记录都包含若干定义好的字段。同两个表的大部份记录都有相同的字段定义。
对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。
例如,假设我们把name字段作为主键,那么通过英文名字小明或小红就能唯一确定一条记录。但是,这么设定,就没法存储同名的同学了,因为插入相同主键的两条记录是不被允许的。
对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
所以,选取主键的两个基本原则是:不采用任何业务相关的字段作为主键。
作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id。常见的可作为id字段的类型有:
自增整数类型:资料库会在插入数据时自动为每一条记录分配两个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;
全局唯一GUID类型:采用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,能自己预算出主键。
主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该采用BIGINT自增或者GUID类型。主键也不应该允许NULL。
能采用多个列作为联合主键,但联合主键并不常见。
(2)、外键
由于两个班级能有多个学生,在关系模型中,这两个表的关系能称为“一对多”,即两个classes的记录能对应多个students表的记录。
为了表达这种一对多的关系,我们需要在students表中加入一列class_id,让它的值与classes表的某条记录相对应:
主要是在多那个表里面多加两个ID,也就是外键,然后对应主键哪里相对应。
在students表中,通过class_id的字段,能把数据与另一张表关联起来,这种列称为外键。
(3)、索引
在关系资料库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要采用索引。
索引是关系资料库中对某一列或多个列的值进行预排序的数据结构。通过采用索引,能让资料库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。
例如,对于students表:
id
class_id
name
gender
score
1
1
小明
M
90
2
1
小红
F
95
3
1
小军
M
88
1.如果要经常根据score列进行查询,就能对score列建立索引:
ALTERTABLEstudents
ADDINDEX idx_score (score);
2.采用ADDINDEX idx_score(score)就建立了两个名称为idx_score,采用列score的索引。索引名称是任意的,索引如果有多列,能在括号里依次写上,例如:
ALTERTABLEstudents
ADDINDEX idx_name_score (name, score);
3、唯一索引
在设计关系数据表的时候,看上去唯一的列,例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。
但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同两个身份证号。这个时候,就能给该列添加两个唯一索引。例如,我们假设students表的name不能重复:
ALTERTABLEstudents
ADDUNIQUEINDEX uni_name (name);
4、表明索引信息
SHOWINDEX FROM tablename;指示能列出某个表中的相关的索引信息
一种下面的SQL命名用于列出tbl_language表的索引信息
5、普通索引
普通索引是最基本的索引,它没有任何限制
普通索引有以下几种建立方式
建立索引
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length能小于实际长度
如果是BLOB和TEXT类型,必须选定length
修改表结构(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
建立表的时候直接选定
如果不存在`tbl_language`(
`id` INT UNSIGNED AUTO_INCREMENT,
`name` VARCHAR(64)NOT NULL,
url VARCHAR(128)NOT NULL,
`founded_at` DATE,
INDEX名称(`name`(64)),
主键(`id`)
)ENGINE= InnoDB DEFAULT CHARSET = utf8mb4;
6、删掉索引的语法
DROPINDEX[(indexName是自己任意起英文名字)indexName]ON表名;
7、采用ALTER指示添加索引
有某种方式来添加数据表的索引
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list);
添加两个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list);
建立索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)
ALTER TABLE tbl_name ADD INDEX index_name (column_list);
添加普通索引,索引值可出现多次
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list);
选定了索引为FULLTEXT,用于全文索引
8、采用ALTER指示删掉索引
命名ALTERTABLE tablename DROP INDEX index_name能删掉tablename表中的index_name索引
例如下面的句子用于删掉tbl_language表中的name索引
ALTERTABLEtbl_languageDROPINDEX名称;
9、