安装mysql ------> 配置环境变量 -------->cmd操作
1. 数据库操作 & 数据表操作 & 数据类型
数据库操作
1.查看当前所有存在的数据库 show databases;
2.创建数据库 create database 数据库名 character set 字符集;
查看某个数据库的定义的信息 show create database 数据库名;
3.删除数据库 drop database 数据库名称;
4.切换数据库 use 数据库名;
5.查看当前使用的数据库名 select database();
数据表操作
MySql8.0的新特性------系统表全为InnoDB表(不包含任何MyISAM表,除非手动创建)
select distinct(engine) from information_schema.tables;
1.创建表(表名不区分大小写并且不可使用SQL语句中的关键字)
CREATE TABLE 表名 ( 字段名 类型(长度) 约束, 字段名 类型(长度) 约束 );
约束
主键约束:要求主键列的数据唯一,并且不允许为空。
a.添加主键约束, primary key
1. create table user( uid int primary key, uname varchar(20) );
2.create table user( uid int, uname varchar(20), primary key(id) );
3.create table tb_emp4( name varchar(20), deptId int(11), salary FLOAT, primary key(name,deptId) );
b.添加外键约束
1.create table tb_emp5( id int(11) primary key, name varchar(20), deptId int(11), salary float, constraint fk_emp_dept1 foreign key(deptId) references tb_emp1(id) );
c.非空约束 字段的值不能为空 not null
1. create table tb_emp6( id int(11) not null, name varchar(20), deptId int(11), salary float, );
d.唯一性约束 要求该列唯一,允许为空,但只能出现一个空值
可以确保一列或者几列不出现重复的值 unique
create table tb_emp7( id int(11) primary key, name varchar(20), location varchar(20), constraint sth unique(name) );
UNIQUE和PRIMARY KEY的区别:一个表中可以有多个字段声明为UNIQUE,但只能有一个PRIMARY KEY声明;声明为PRIMAY KEY的列不允许有空值,但是声明为UNIQUE的字段允许空值(NULL)的存在。
e.使用默认约束 default
create table tb_emp8( id int(11) primary key, name varchar(20) not null, deptid int(11) default 111, salary float );
f.设置表的属性自动增加 auto_increment
create table tb_emp8( id int(11) primary key auto_increment, name varchar(20) not null, deptid int(11) default 111, salary float );
b.删除主键
alter table sort drop primary key;
2.查看数据表结构 describe 表名 或者 desc 表名;
● NULL:表示该列是否可以存储NULL值。
● Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
● Default:表示该列是否有默认值,有的话指定值是多少。
● Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。
3.查看表结构详细语句 show create table <表名 \g> 加\g结果不混乱
4.修改数据表
4.1修改表名
alter table <旧表名> rename [to] <新表名>;
4.2修改字段的数据类型
alter table <表名> modify <字段名> <数据类型>;
4.3修改字段名
alter table <表名> change <旧字段名> <新字段名> <新数据类型>;
4.4添加字段
alter table <表名> add <新的字段名> <数据类型> [约束条件] {first | after 已存在的字段名};
4.5删除字段
alter table <表名> drop <字段名>;
4.6修改字段的排列位置
alter table <表名> modify <字段1> <数据类型> first|after <字段2>;
4.7改变表的存储引擎(MyISAM、InnoDB、MEMORY)
alter table <表名> engine=Innodb;
4.7删除表的外键约束
alter table <表名> drop foreign key <外键名>
5.删除数据表 如果有关联 ,需要先删除外键约束,再删除表
drop table [IF EXISTS] 表1,表2,...表n;
6.查看当前数据库所有表
show tables;
数据类型
MySQL支持的数据类型主要有数值类型、日期类型和字符串类型
1.数值类型:包括整数类型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 、浮点小数数据类型FLOAT和DOUBLE,定点小数类型DECIMAL。
2.日期/时间类型:包括YEAR、TIME、DATE、DATETIMME和TIMESTAMP.
3.字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。
整数型数据类型
创建表的的时候定义int(11) 是表示该数据类型制定的显示宽度,数据类型的取值范围是无关的。
浮点数类型和定点数据类型
浮点型数据类型和定点数据类型都可以用(M,N)来表示。M为精度,表示总位数;N为标度,表示小数的位数
DECIMAL类型不同于FLOAT和DOUBLE,DECIMAL实际是以串存放的,可能的最大取值范围与DOUBLE一样,但是其有效的取值范围由M和D的值决定。如果改变M而固定D,则其取值范围将随M的变大而变大。
FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL若不指定精度则默认为(10,0)。浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。
在MySQL中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据等)使用DECIMAL的类型比较好,另外两个浮点数进行减法和比较运算时容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。
######时间与日期类型
1.YEAR类型是一个单字节类型,用于表示年,在存储时只需要1字节。
(1)以4位字符串或者4位数字格式表示的YEAR,范围为‘1901’~‘2155’。
insert into temps values(2166); //会范围报2166超过了year的取值
insert into temps values(2010),('2010'); // 正常存储
(2)以2位字符串格式表示的YEAR,范围为‘00’到‘99’。‘00’~‘69’和‘70’~‘99’范围的值分别被转换为2000~2069和1970~1999范围的YEAR值。‘0’与‘00’的作用相同。插入超过取值范围的值将被转换为2000。
insert into temps values('0'),('00'),('77'),('10'); // 正常存储
(3)以2位数字表示的YEAR,范围为1~99。1~69和70~99范围的值分别被转换为2001~2069和1970~1999范围的YEAR值。注意:在这里0值将被转换为0000,而不是2000。
insert into temps values(0),(78),(11); // 正常存储
文本字符串类型
字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。MySQL支持两类字符型数据:文本字符串和二进制字符串。文本字符串类型是指CHAR、VARCHAR、TEXT、ENUM和SET。
CHAR(M)为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格,以达到指定的长度。M表示列长度,M的范围是0~255个字符。例如,CHAR(4)定义了一个固定长度的字符串列,其包含的字符个数最大为4。当检索到CHAR值时,尾部的空格将被删除。
VARCHAR(M)是长度可变的字符串,M表示最大列长度。M的范围是0~65535。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加1。例如,VARCHAR(M)定义了一个最大长度为50的字符串,如果插入的字符串只有10个字符,则实际存储的字符串为10个字符和一个字符串结束字符。VARCHAR在值保存和检索时尾部的空格仍保留。
2. 查询数据 & 插入、更新与删除数据
2.1基本查询语句
2.2单表查询
1.查询所有字段
select * from 表名
2.查找指定字段
select 字段名1,字段名2,···,字段名n from 表名;
3.查找指定记录
select 字段名1,字段名2,···,字段名n from 表名 where 查询条件;
4.带IN关键字查询
select 字段名1,字段名2,···,字段名n from 表名 where s_id IN (101,102) order by f_name;
5.带BETWEEN AND的范围查询
select 字段名1,字段名2,···,字段名n from 表名 where f_price BETWEEN 2.00 AND 10.2;
select 字段名1,字段名2,···,字段名n from 表名 where f_price NOT BETWEEN 2.00 AND 10.2;
6.带LIKE的字符匹配查询 (通配符有'%' 与 '')
1.百分号通配符‘%’,匹配任意长度的字符,甚至包括零字符
select 字段名1,字段名2,···,字段名n from 表名 where f_NAME like 'b%'; //以b开头
2.下划线通配符‘’,一次只能匹配任意一个字符
select 字段名1,字段名2,···,字段名n from 表名 where f_NAME like 'b_ _';
7.查询空值
select 字段名1,字段名2,···,字段名n from 表名 where f_NAME IS NULL;
select 字段名1,字段名2,···,字段名n from 表名 where f_NAME IS NOT NULL;
8.带AND的多条件查询
select 字段名1,字段名2,···,字段名n from 表名 where s_id ='101' AND F_PRICE >=5;
9.带OR的多条件查询
select 字段名1,字段名2,···,字段名n from 表名 where s_id ='101' OR s_id ='103' ; // IN (101,103);
OR可以和AND一起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先对AND两边的操作数进行操作,再与OR中的操作数结合。
10.查询结果不重复
select distinct 字段名 from 表名
11.对查询结果排序
1.单列排序
select f_name from 表名 order by f_name;
2.多列排序
在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
select f_name from 表名 order by f_name,f_price;
3.排序方向
与DESC相反的是ASC(升序),将字段列中的数据按字母表顺序升序排列。实际上,在排序的时候ASC是默认的排序方式,所以加不加都可以。
select f_name from 表名 order by f_name DESC,f_price;
12.分组查询
1.GROUP BY关键字通常和集合函数一起使用,比如MAX()、MIN()、COUNT()、SUM()、AVG()。
select s_id,count(*) as Total from fruits GROUP BY s_id;
select s_id,GROUP_CONCAT(f_name) as Name from fruits GROUP BY s_id; //会将每个id所对应的供应商查询出来
2.使用HAVING过滤分组
select s_id,GROUP_CONCAT(f_name) as Name from fruits GROUP BY s_id HAVING count(f_name)>1;
HAVING关键字与WHERE关键字都是用来过滤数据的,两者有什么区别呢?其中重要的一点是,HAVING在数据分组之后进行过滤来选择分组,而WHERE在分组之前来选择记录。另外,WHERE排除的记录不再包括在分组中。
3.在GROUP BY子句中使用WITH ROLLUP(在所有查询出的分组记录之后增加一条记录,该记录计算查询出所有记录的总和,即统计记录数量)
select s_id,count(*) as Total from fruits GROUP BY s_id eith pollup;
13.使用LIMIT限制查询结果的数量
SELECT * From fruits LIMIT 4;
从第五个记录开始的行数长度为3的记录
SELECT * From fruits LIMIT 4,3;
2.2插入
1.为所有表的字段插入数据
INSERT INTO 表名 (列名) values (对应列的值);
2.同时插入多条记录
INSERT INTO 表名 (列名) values (对应列的值),(对应列的值),(对应列的值),...,(对应列的值);
3.将查询结果插入到表中
INSERT INTO 表名 (列名)select (列对应的值) from tables_name2 where (condition);
2.3更新数据
update table_name set column_name1 = value1,column_name2 = value2,column_name3 = value3 where(condition);
2.4删除数据
delete from table_name [where <condition>];