朝花夕拾 Mysql笔记1

朝花夕拾 Mysql笔记1

欢迎扫码关注微信公众号"野心与家"回复"12.11MySQL1"获取源文件

点击此处查看下一篇 : 朝花夕拾 Mysql笔记2

2.1数据库基础知识

1.Dos登录

命令:mysql -h hostname -u username -p

例如:mysql -h 123 -uroot -p

简写:mysql -u root -p

关系型数据库语言
(1)数据定义语言(DDL) 创建表创建数据库
(2) 数据操作语言(DML) 对数据进行操作
(3) 数据查询语言(DQL)单表查询,多表查询
(4) 数据控制语言(DCL) 对权限进行控制


2.1.1创建和查看数据库
  • 创建数据库
语法:create database 数据库名称;
create database itcast;/*创建数据库itcast:*/
  • 查看数据库
语法:show databases/*查看数据库*/
  • 查看某个数据库
语法:show create database 数据库名称;
例如:show create database itcase;/*查看数据库itcase信息*/
  • 使用数据库
语法:use 数据库名称;
例如:use itcast;/*使用数据库itcast*/

2.1.2修改数据库
  • alter 数据库名称;修改数据库
语法:alter database 数据库名称 default character set 编码方式 collate 编码方式_bin
例如:修改数据库,将数据库itcast的编码修改为gbk
> alter database itcast default character set gbk collate gbk_bin;

2.1.3删除数据库
语法:drop database 数据库名称;
例如:drop database itcast;/*删除名称为itcast的数据库*/

2.2数据类型

2.2.1 整数类型

1.在MySQL数据库中,经常需要存储整数数值。根据数值取值范围的不同,MySQL中的整数类型可分为5种,分别是
TINYINTtinyint、SMALLINT、 MEDIUMINT、INT和BIGINT。不同整数类型的取值范围可以根据字节数计算出来,例如,
TINYINT类型的整数占用1个字节,1个字节是8位,那么,TINYINT类型无符号数的最大值就是28-1,即255。 同理可以算出其它不同整数类型的取值范围。

**注意:**在足够使用的情况下选择选择尽量小的数据类型


2.2.2浮点数类型与定点数类型

2.在MySQL数据库中,存储的小数都是使用浮点数和定点数来表示的。浮点数的类型有两种,分别是单精度浮点数类型(float)和双精度浮点类型(double)。而定点数类型只有decimal,类型。

浮点型:非精准数据类型,有误差

定点型:精准类型


2.2.3日期与时间类型

3.为了方便在数据库中存储日期和时间,MySQL提供了表示日期和时间的数据类型,分别是YEAR、DATE、TIME、DATETIME和timestamp

year:1字节

例如:year 2014 =‘2014’ p35

‘00’~‘69’ 20?? 58= 2058

‘70’~‘99’ 19?? 89 =1989

1.YEAR类型:(字符串类型与数字类型)‘2020’ 2020 ‘00-99’ 1-99

2.DATE类型: ‘2020-06-21’ ‘20200621’

current_data或now()/表示当前日期/

3.TIME类型:表示时间值

格式:HH:MM:SS

current_data或now()表示当前系统时间

4.DATATIME类型

now()表示当前日期和时间

5.TIMESTAMP类型

与DATATIME类型显示形式相似,但取值范围比DATATIME类型小


2.2.4 字符串和二进制类型

为了存储字符串、图片和声音等数据,MySQL提供了字符串和二进制类型。包括CHAR和VARCHAR类型、BINARY和VARBINARY类型、TEXT类型、BLOB类型ENUM类型、SET类型和BIT类型

1.CHAR和VARCHAR类型:
CHAR和VARCHAR类型都用来表示字符串数据,VARCHAR可以储存可变字符串

语法:CHAR(M)或VARVCHAR(M) M指字符串的最大长度;

VARCHAR(4)所对应的数据所占用的字节数为实际长度加1;

char:浪费时间,但查询速度快;

varchar:节约空间,但查询速度慢

‘’ ‘’ 4个字节 ‘’ 1个字节
‘ab’ ‘ab’ 4个字节 ‘ab’ 2个字节
‘abc’ ‘abc’ 4个字节 ‘abc’ 3个字节
‘abcd’ ‘abcd’ 4个字节 ‘abcd’ 4个字节
‘abcdef’ ‘abcd’ 4个字节 ‘abcd’ 5个字节

2.BINARY和VARBINARY类型:
BINARY和VARBINARY类型类似CHAR和VARCHAR类型,不同的是,它们表示二进制数据

语法:BINARY(M)或VARBINARY(M) M指二进制数据的最大字节长度;

注意:BINARY类型的长度是固定的,如果数据的长度不足最大长度,将在数据的后面用"\0"补齐,最终达到指定长度.

例如,指定数据的类型是BINARY(3),当插入a时,实际储存的数据为"a\0\0",当插入ab时,实际储存的数据是"ab\0";


3.TEXT类型:

TEXT类型用来表示大文本数据,例如,文章内容、评论等,它的类型分为4种;

数据类型 储存范围 数据类型 储存范围
TINYTEXT 0-255字节 MEDIUMTEXT 0-16777215字节
TEXT 0-65535字节 LONGTEXT 0-4294967295字节

4.BLOB类型:
BLOB类型是一种特殊的二进制类型,它用于表示数据量大很大的二进制数据,例如 图片、PDF文档等
数据类型 储存范围 数据类型 储存范围
TINYBLOB 0-255字节 MEDIUMBLOB 0-16777215
BIOB 0-65535字节 LONGBILOB 4294967295

注意:BLOB类型数据是根据二进制编码进行比较和排序,而TEXT类型数据是根据文本模式进行比较和排序


5.ENUM类型:

ENUM类型又称为枚举类型

ENUM(‘值1’,‘值2’,‘值3’,…‘值n’)

注意:MYSQL中存入的是这个顺序编号,而不是列表中的值


6.SET类型:

SET类型用于表示字符串对象,它的值可以有零个或多个,SET类型数据的定义格式与ENUM类型相似

语法:SET(‘值1’,‘值2’,‘值3’,…‘值n’)

注意:MYSQL中存入的是这个顺序编号,而不是列表中的值


7.BIT类型:
用于表示二进制数据

语法:BIT(M) M用于表示每个值的位数,范围是1-64;

注意:如果分配的BIT(M)类型的数据的长度小于M,将在数据的左边用0补齐

例如,为BIT(6)分配值b’101’与分配b’000101’相同


2.3创建数据表

create database student;/*创建名为student*/
use itcase;/*使用数据库*/
create TABLE tb_grade/*创建名为tb_gradea的数据表*/
(
	id INT(11),/*举例*/
	name VARCHER(20),
	grade FLOAT
);
show tables;/*验证数据库是否创建成功*/ 
show create table tb_greade;/*查看数据表创建时的定义语句,查看表的字符编码*/
describe tb_greade;/*查看表的字段信息,包括字段名、字段类型等信息*/

修改数据表

	1.修改表名;
alter table 表名 rename 新表名;
alter table tb_grade rename(to) grade;
	2.修改字段名;
alter table 表名 change 旧字段名 新字段名 新数据类型;
alter table grade change name username verchar(20);/*name字段改为username,数据类型保持不变*/
desc greade;/*验证*/
	3.修改字段的数据类型;
alter table 表名 modify 字段名 数据类型;
alter table grade modify id int(20);/**/
	4.添加字段;
alter table 表名 add 新字段名 数据类型
	[约束条件][first|after 已存在的字段名]
alter table grade add age int(10);
alter table grade add age int(10) first;/*添加到第一位*/
alter table grade add age int(10) after id/*添加到id后面*/;
alter table grade add age int(10) not null first;/*不允许为空*/
	5.删除字段;
alter table 表名 drop 字段名;
alter table grade drop age;
	6.修改字段的排列位置;
alter table 表名 modify 字段名1 数据类型 first|after 字段名2;
字段名1 指要修改位置的字段;
first是可选参数,指的是将字段1修改为表的第一个字段;
after 字段名2 是将字段1插入到字段2后面;
alter table grade modify id int(10) after grade;/*将id字段插入到grade字段后面*/

删除数据表

drop table 表名;
drop table grade;
desc table grade;/*验证*/

2.4表的约束

  • 防止数据表中插入错误的数值,而定义的维护数据库完整性的规则
约束条件 说明
PRIMARY KEY 主键约束,用于唯一标识对应的记录(主键唯一表示,值不能为空null );
FOREIGN KEY 外键约束
NOT NULL 非空约束
UNIQUE 唯一性约束
DEFAULT 默认值约束,用于设置字段的默认值

2.4.1 主键约束;

注意:每个数据表中最多只能有一个主键约束,定义为primary key的字段不能有重复值且不能为null值

  • 1.单字段约束
语法: 字段名 数据类型 PRIMARY KEY
例如:创建一个数据表ex1,并设置id作为主键,SQL语句如下:
CREATE TABLE ex1(id INT PRIMARY KEY,
				name VARCHAR(20),
				grade FLOAT);
  • 2.多字段主键
语法:PRIMARY KAY(字段名1,字段名2,***字段名n)
例如:创建一个数据表ex2,在表中将stu_id和course_id两个字段共同作为主键,SQL语句如下:
CREATE TABLE ex2(stu_id INT,
				course_id FLOAT,
				PRIMARY KEY(stu_id,course_id)
				);

2.4.2非空约束

  • 非空约束指的是字段的值不能为null,在MySQL中,非空约束是通过NOT NULL定义的;
语法: 字段名 数据类型 NOT NULL;
例如:CREATE TABLE ex1(id INT PRIMARY KEY,
				name VARCHAR(20) NOT NULL,
				grade FLOAT not null
				);

2.4.3唯一约束

  • 保证数据表中字段的唯一性,即表中字段的值不能重复出现
语法: 字段名 数据类型 UNIQUE;
CREATE TABLE ex1(id INT PRIMARY KEY,
				name VARCHAR(20) NOT NULL,
				grade FLOAT UNIQUE
				);
ID为主键,name的字段不能为空值,grade字段为唯一值,该值不能重复

2.4.4默认约束

  • 用于给数据表中的字段添加指定默认值
语法:字段名 数据类型 DEFAULT 默认值;
例如:CREATE TABLE ex1(id INT PRIMARY KEY,
				name VARCHAR(20) NOT NULL,
				grade FLOAT default 0/*默认值为0*/
				);

2.5设置表的字段值自动增加

  • 在数据表中,若想为表中插入的新记录自动生成唯一的ID,可以使用AUTO_INCREMENT约束来实现。
    AUTO_INCREMENT约束的字段可以是任何整数类型,默认情况下,该字段的值是从1开始自增的
语法: 字段名 数据类型 AUTO_INTCREMENT;
例如:创建一个数据表ex5,将表中的id字段设置为自动增加,SQL语句如下:
CREATE TABLE ex1(id INT PRIMARY KEY AUTO_INCREMENT, 
				name VARCHAR(20) NOT NULL,
				grade FLOAT UNIQUE
				);

2.6索引

2.6.1索引的概念

数据库的索引好比新华字典的音序表,它是对数据库表中一列或多列的值进行排序后的一种结构,其作用就是提高表中数据的查询速度

  • 1.普通索引

    普遍索引是由KEY或INDEX定义的索引,它是MySQL中的基本索引类型,可以创建在任何数据类型中,其值是否唯一和非空 由字段本身的约束条件所决定。

  • 2.唯一性索引

    唯一性索引是由UNIQUE定义的索引,该索引所在字段的值必须是唯一的。

  • 3.全文索引/文本/

    全文索引是由FULLTEXT定义的索引,它只能创建在CHAR、VARCHAR或TEXT类型的字段上,而且,现在只有MyISAM存储引擎支持全文索引。

  • 4.单列索引

    单列索引指的是在表中单个字段上创建索引,它可以是普通索引、唯一索引或者全文索引,只要保证该索引只对应表中一个字段即可。

  • 5.多列索引

    多列索引指的是在表中多个字段.上创建索引,只有在查询条件中使用了这些字段中的第一个字段时,该索引才会被使用。

  • 6.空间索引

    空间索引是由SPATIAL定义的索引,它只能创建在空间数据类型的字段上。创建时必须声明为not null,并且只有MyISAM存储引擎支持


2.6.2 创建索引

> 1.创建表的时候创建索引

语法:CREATE TABLE 表名(字段名 数据类型 [完整性约束条件],
  					  字段名 数据类型 [完整性约束条件],
  					  ...
  					  		字段名 数据类型
  					  		[UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY
  					  			[别名] (字段名1 [(长度)] [ASC|DESC])
  					  			);
  • UNIQUE:可选参数,表示唯一索引
  • FULLTEXT:可选参数,表示全文索引
  • SPATIAL:可选参数,表示空间索引
  • INDEX和KEY:用来表示字段的索引,二者选一即可
  • ASC和DESC可选参数,ASC表示升序排列,DESC表示降序排列
  • 别名:可选参数,表示创建的索引的名称
  • 字段名1:指定索引对应字段的名称,
  • 长度:可选参数,用于表示索引的长度
>1.创建普通索引
mysql> create table t2(
    -> id int(11),
    -> name varchar(20),
    -> grade float,
    -> index index(id asc)/*创建名为index的索引,升序排列*/
    -> );
建立后,使用show create table查看表的结构
	

==show create table t1\G; t1\G 使排列有序
为了查看索引是否被使用可以使用explain语句进行查看,SQL代码如下:

explain select * from t1 while id=1 \G
>2.创建唯一性索引
mysql> create table t2(
    -> id int(11),
    -> name varchar(20),
    -> grade float,
    -> unique index unique_id(id asc)/*在表中id字段上建立索引名为unique_id的唯一性索引,并且按照升序排序*/
    -> );
>3.创建全文索引
mysql> create table t1(
    -> id int(11),
    -> name varchar(20),
    -> grade float,
    -> fulltext index fulltext_name(name)
    -> )engine=myisam;/*因为目前只有MyISAM存储引擎支持全文索引*/
>4.创建单列索引
mysql> create table t4(
    ->name varchar(20) not null,
    -> score float,
    -> index single_name(name(20))/*在name字段上创建一个名叫single_name的单列索引索引长度为20*/
    -> );
>5.创建多列索引
mysql> create table t5(
	->id int not null,
    ->name varchar(20) not null,
    -> score float,
    -> index multi(id,name(20))/*在id和name字段上创建一个名叫multi的多列索引*/
    -> );

注意:在多列索引中,只有查询条件中使用了这些字段的第一个字段时多列索引才会被使用

>6.创建空间索引
mysql> create table t6(
	->id int,
    ->space geometry not null,
    ->spatial index sp(space)/*在space字段上建立一个名为sp的空间索引*/
    ->)engine=myisam;

注意:创建空间索引时,所在字段不能为空值,并且表的储存引擎为myisam


2.使用CREATE INDEX语句在已经存在的表上创建索引

语法CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 
	ON 表名 (字段名 [(长度)] [ASC|DESC]);
mysql> create table book(
    -> bookid int not null,
    -> bookname varchar(255) not null,
    -> authors varchar(255) not null
    -> info varchar(255) null,
    -> comment varchar(255) null,
    -> publicyear year not null
    -> );
>1.创建普通索引
mysql> create index index_id on book(bookid);/*在book表中的bookid字段上建立一个名为index_id的普通索引*/
mysql> show create table book\g;/*查看数据表结构*/
>2.创建唯一性索引
create unique index uniqueidx on book(bookid);
/*在bookid字段上创建一个名为uniqueidx的唯一性索引*/
>3.创建单列索引
create index singleidx on book(comment);
/*在comment字段上创建一个名称为singleidx的单列索引*/
>4.创建多列索引
create index mulitidx on book(authors(20)),info(20));
/*在authors和info字段上创建一个名称为mulitidx的多列索引*/
>5.创建全文索引
create fulltext index fulltextidx on book(info);
/*在info字段上创建名为fulltextidx的全文索引*/
>6.创建空间索引
create table t7(
				g geometry not null
				)engine=myisam;
create spatail index spatidx on t7(g);/*在g字段上创建名称为spatidx的空间索引*/

3.使用ALTER TABLE 语句在已经存在的表上创建索引

语法:ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX  
					索引名 (字段名[(长度)] [ASC|DESC] )
create table book(
				  bookid int not null,
				  bookname varchar(255) not null,
				  authors varchar(255) null,
				  comment varchar(255) null,
				  pubblicyear year not null
				  );
>1.创建普通索引
alter table book add index id(bookid);
>2.创建唯一性索引
alter table book add unique uniqueidx(bookid);
>3.创建单列索引
alter table book add index singleidx(comment(50));
>4.创建多列索引
alter table book add index multidx(authors(20),info(50));
>5.创建全文索引
alter table book add fulltext index fulltextidx(info);
>6.创建空间索引
create table t8(
				space geometry not null
				)engine=myisam;
alter table t8 add spatial index spatidx(space);

2.6.3删除索引

> 1.使用alter table删除索引

语法:alter table 表名 drop index 索引名;

例如: 删除表book中名叫fulltextidx的全文索引
alter table book drop index fulltextidx;

> 2.使用 drop index删除索引

语法:drop index 索引名 on 表名;

3.1添加数据

> 3.1.1为表中所有字段添加数据;

> 1.insert语句中指定所有字段名

向表中添加新记录时,可以在insert语句中列出表中的所以字段名;

注意:必须列出表中所以的字段名称,"值1,值2,…"的顺序,类型必须与对应的字段相匹配

语法:insert into 表名(字段名1,字段名2,...)
	values(1,2,...);
  • 验证数据是否成功使用select语句查看student表中的数据
select * from 表名;
> 2.insert语句中不指定字段名

注意:由于insert语句中没有指定字段名,添加的值的顺序必须和字段在定义的顺序相同

语法: insert into 表名 values(1,2,...);

>3.1.2为表中指定的字段添加数据

语法: insert into 表名(字段1,字段2,...)
			values(1,2)

>3.1.3同时添加多条记录

语法:insert into 表名 [(字段名1,字段名2,...)]
			values(1,2,...),
			(1,2,...),
			(1,2,...);
例如:
	向student表中添加三条新纪录,insert语句如下:
mysql> insert into student values
	-> (6,'lilei',99),
	-> (7,'hanmeimei',100),
	-> (8,'poly',40.5);

3.2更新数据

语法:

update 表名
	set字段名1=1[,字段2=2,...]
	[where条件表达式]
> 1.update 更新部分数据
例如:更新student表中id字段值为1的记录,将记录中的name字段的值更改为'caocao',grade字段的值更改为50;
mysql> update student
	> set name='caocao',grade=50
	> where id=1
> 2.update 更新全部数据
例如:将student表中全部记录,将grade字段值都变为100:
>update student
>set grade=100

3.3 删除数据

delete from 表名[where 条件表达式]
>1.删除部分数据
>delete from 表名
>where 条件表达式
例如:删除表student上id字段上小于4的记录
>delete from student
>where id<4;
>2.删除全部数据
>1.delete
delete from 表名;
>2.truncate
truncate from 表名;

区别:

  1. delete语句后跟where子句,可以删除部分记录,truncate只能删除表中全部记录
  2. delete语句删除数据后,再次向表中增加记录时,自动增加字段的值为删除时该字段的最大值加1,truncate语句删除数据后,自动字段的默认初始值重新由1开始;

猜你喜欢

转载自blog.csdn.net/m0_46653702/article/details/111041936