MySQL学习笔记(二)SQL基本语法

数据类型

MySQL支持所有标准的SQL数据类型,主要分3类: 数值类型、字符串类型、时间日期类型;

  •     数值类型

mysql支持标准SQL 中的数值类型其中包括严格数据类型(INTEGER 、SMALLINT和decimal),以及近似数据类型(FLOAT 和double等)

  • 整型

MYSQL 支持在类型名称后面的小括号内指定宽度,如int(5)表示,如果数值宽度小于5,那么不足的位置用“ ”填在数值的前面,即890存储方式为    890 若不指定宽度默认为int(11) .一般配合zerodill使用,即将原来的空字符改为0;

不知道你是否会有疑问,如果我设置的长度是5,我存入一个长度大于5的数会出现什么结果?

我们来看一下:

我们可以看到他存进去了,而且是你想要存成的样子。。。实际上当你的数值位数大于预先指定的宽度时,你设置的数值宽度已经没有任何意义了。

整数数据类型还有个特殊的属性:AUTO_INCREMENT(每张表最多有一个AUTO_INCREMENT,且对于任何使用此属性的列必须定义为 NOT NULL ,并定义为 PRIMARY KEY 或 unique键 ),看词知意,他会根据你输入的值自动给行排序,在你需要 产生唯一的标识符或者顺序值时,他是个不错的选择如果设置了自增长列,那么数据表存储数据时,按自增长升序排列,而不是按插入顺序。

  • 浮点型

mysql在表示小数时有两种方式:浮点型和定点型。浮点数包含float(单精度) 和 double(双精度)。定点数只有一种decimal。浮点数和定点数都可以用数据类型(M,D)的方式表示-(M,D)表示 一共有M位数字(整数位+小数位),小数点后面有D位。

在mysql 中,对于浮点数和定点数来说:如果小数位超了,四舍五入,整数位超了,直接报错,不会存入数据表。

  • 字符串类型

VARCHAR 和 CHAR 的主要区别在于 VARCHAR 列中的值为可变长度的字符串,而CHAR 则为指定的固定长度的字符串;在检索时Char会将尾部的空格删除,而Varchar 会保留。

  • binary和varbinary:与char 和 varchar 类似,不同的是其只存储二进制字符串,而不存储非二进制字符串
  • 枚举类型:ENUM :它的值的范围在创建表的时候通过枚举的方式指定,0-255个成员需要1个字节存储,255-65535个成员需要两个字节存储,最多允许65535个成员。ENUM 有个特点,每次只能取一个成员,不能一次取多个值
  • set类型 与 enum类型一样也是一个字符串对象,里面可以包含0-64个成员。

1-8个成员的集合会占1个字节

9-16个成员的集合会占2个字节

17-24个成员的集合会占3个字节

25-32个成员的集合会占4个字节

33-64个成员的集合会占8个字节

set允许从集合中任选一个或多个元素进行组合,所以只要你的值在元素中可以组合出来,就能存入集合。

关于set和枚举,先留白吧,以后探索了在进行补充

  • 日期类型

日期类型总共有以下点:

表示年份:year;(高版本mysql 已经不支持)

表示日期:DATE;

表示时间: TIME;

表示年月日时分秒:datetime;

   一个关于datetime 的小例子:

create table date1( dt DATETIME);
INSERT INTO DATE1 VALUES('2018-04-15 18:34:25');
INSERT INTO DATE1 VALUES('2018/04/15 18+34+25');
INSERT INTO DATE1 VALUES('20180415183425');
INSERT INTO DATE1 VALUES(20180415183425);
SELECT* FROM DATE1;

由上我们可以看出,datetime 支持的模式

-- date 类型的 四种 format
insert into aimme_order_20181210 values('ZB2L181205',1000,'2018-12-05','A88008801','complete');
insert into aimme_order_20181210 values('ZB2L181205',1000,'2018/12/05','A88008801','complete');
insert into aimme_order_20181210 values('ZB2L181205',1000,'20181205','A88008801','complete');
insert into aimme_order_20181210 values('ZB2L181205',1000,20181205,'A88008801','complete');
select * from aimme_order_20181210 where Order_ID = 'ZB2L181205'

这里需要注意的是MYSQL  只给第一个TIMESTAMP 设置了默认值是系统当前的DATETIME ,若有第二个 默认值是0;

 关于TIMESTAMP  以后在研究。。。。。

SQL语句

sql主要分为三类:DDL(data definition Language 数据库定义语句) 、DML(data manipulation language 数据库操纵语句)、DCL(data control language 数据库控制语句)。

  • 数据库定义语言 :DDL---包括对数据库对象的创建、修改和删除
    数据库对象包括 :数据库、表、视图、索引等等

小例子

-- 显示所有数据库
show databases ;

-- 删除数据库 demo_1
drop database demo_1;

-- 创建数据库
create database Retail_management_system;

-- 使用数据库,在创建表之前需执行,目的是让编辑器知道你要在哪个数据库创建表
use Retail_management_system;

-- 删除数据表
drop table Aimme_order_20181210 ;

/*
 * 创建表:
	订单表,需包含字段:订单ID 订单金额 订单创建时间 会员ID 订单状态
	 in transit在途  complete 已完成
	订单商品表:ID 订单ID 商品Id 商品名称  商品价格 商品数量 
*/

create table Aimme_order_20181210 (Order_ID int(16) not null,
						Order_Amt double (16,4) not null ,
						Order_Date date not null ,
						Member_ID varchar(16) not null,
						Order_Status varchar(32) not null default 'in transit');
-- 自增长的列必须是key
create table Aimme_GoodsOrder_20181210(
ID int(12) not null auto_increment primary key,
Order_ID int(16) not null ,
Item_ID int(16)not null,
Item_Name varchar(64) not null,
Item_Price double(16,4) not null,
Item_Qty int(8) not null
);


/* 增加列
 * 若使用关键字after ,表示将新列插入在某一列的后面
 * 若不用,默认插入在最后一列
 * */
alter table Aimme_order_20181210 add sex varchar(2) not null after Order_ID;
-- 修改列名
alter table Aimme_order_20181210 change sex sex_id varchar(2) not null ;

/* 将某一列放在整个表的第一列 */
alter table aimme_order_20181210 modify sex varchar(2) not null first;

-- 修改列的数据类型
alter table aimme_order_20181210 modify sex int(5) not null

-- 删除列
alter table Aimme_order_20181210 drop sex;

-- 描述表
desc Aimme_order_20181210;

  • DML

对数据表的增删改查

 

  • 插入数据:

insert into 表名(列名1,列名2...列名n)values(value1,value2...valuen); 这里也可以不列举列名,但是value 的值必须与表的列一一对应;

一次性插入多条数据

insert into 表名(列名1,列名2,列名3...列名n)values

(value1,value2,value3... valuen),

(value11,value12,value13... value1n)

...

(valuen1,valuen2,valuen3... valuenn);

/*
插入:
插入有两种写法:
一种是values 前面加列名的,这种方式只需要后面数据一一对应即可,
并不需要对数据表中每一列都赋值(前提是不赋值的列允许非空,或者是有默认值);----这种对于只插入部分字段的情况比较有利
另一种则是Values 前面不附列名,此种方式则要求后面的数值需要与表的列一一对应*/

insert into aimme_order_20181210 (order_id,Order_Amt,Order_Date,Member_ID,Order_Status) 
values ('ZB2L181205',80259.450,'2018-12-05','A88008801','complete');
-- 浮点型加不加引号都是可以的,如下执行都是不报错的
insert into aimme_order_20181210  values ('YVBL181110',228959.450,'2018-12-10','A88008802','in transit');
--  * 依次插入多条数据
insert into aimme_order_20181210  values ('ytro181008',8859.450,'18-10-08','A88008803','complete'),
('1730181024',92959.450,'18-10-24','A88008804','complete');
 
--   更新数据---更新会员号为A88008803 的订单号为:Za43180923   如果没有where语句,则表示对一整列进行赋值,且是相同的值
update  aimme_order_20181210 set Order_id = 'Za43180923' where Member_ID = 'A88008803';

/*在mysql中支持同时更新多表数据,语法如下:
-- update t1,t2,t3...,tn set t1.field1=value1,t2.field2=value2,
t3.field3=value3...,t2.fieldn=valuen[where conidition];//where 条件语句,*/
update aimme_order_20181210 set Order_Amt = 12580,
Order_Status = 'in transit',
Order_Date = '2018-12-9' where Order_ID ='ZA43181206' ;


-- 删除数据
delete from aimme_order_20181210 where Order_ID = 'YVBL181110';

/*与update一样,删除数据支持同时删除多表数据

delete from t1,t2,t3...tn [where  codition ];*/
--  查找
select * from aimme_order_20181210 ;

 

  • 更新记录

update 表名 set field1=value1,field2=value2,... fieldn=valuen[where conidition];//where 条件语句

在mysql中支持同时更新多表数据,语法如下:

update t1,t2,t3...,tn set t1.field1=value1,t2.field2=value2,t3.field3=value3...,t2.fieldn=valuen[where conidition];//where 条件语句,以后细说

 

多表同时更新数据多用在更具一个表字段动态更新另一个表字段

  • 删除表数据

delete from 表名[where condition];

与update一样,删除数据支持同时删除多表数据

delete from t1,t2,t3...tn [where  codition ];

CREATE TABLE student(id INT(8) AUTO_INCREMENT PRIMARY KEY NOT NULL, 
NAME VARCHAR(20) NOT NULL,
grade INT(8) NOT NULL DEFAULT 0,
dept INT(5) NOT NULL);
CREATE TABLE class(dept INT(5),deptname VARCHAR(18));
INSERT INTO student(NAME,grade,dept) VALUES('a',95,11),
('b',99,12),('c',100,10),
('d',89,11),('e',85,15),('f',88,14);
INSERT INTO class VALUES(10,'vocol'),
(11,'cleaning'),(12,'grocery'),(14,'food'),(15,'冷冻');
SELECT* FROM student;
SELECT* FROM class;

同时删除表中dept=10的数据:

DELETE a ,b FROM student a ,class b WHERE a.`dept`=b.`dept`AND a.`dept`= 10 ; 
//a b 是表的别名,如果from后用表的别名,delete后面也要用相应的别名
select* from student;
select* from class;

  • 关于查询

基本注意点,在上面的思维导图里已经标注了

再结合例子自己动手执行一下就可以了,这里就不附结果图片了,仅将代码附上,说明实际用法

/*
 * 实际工作中我们很少会查询表的全部数据,实际上是会有诸多限制的
 * 1、where 语句
 * 2、limit 限制显示行数
 * */
select * from aimme_order_20181210 where Order_Status = 'complete' limit 3;

-- 对查出数据进行排序
-- 升序 按member_id 升序排序
select * from aimme_order_20181210 where Order_Status = 'complete' order by Member_ID asc;
-- 降序排列 desc  按Order_Amt
select * from aimme_order_20181210 where Order_Status = 'complete' order by Order_Amt asc;

-- 去重复 distinct
-- 注意这里关键字 distinct 的位置
select distinct * from aimme_order_20181210 where Order_Status = 'in transit';


-- 比较 小于  
 select order_id ,Order_Amt from aimme_order_20181210 where Order_Amt<10000.0 ;
-- 小于等于
 select order_id from aimme_order_20181210 where Order_Amt <= 10000.0 ;
-- 大于等于 
 select order_id , Order_Amt from aimme_order_20181210 where Order_Amt >= 10000.0 ;
-- 大于 
 select order_id from aimme_order_20181210 where Order_Amt>10000.0 ;
-- 不等于 
 select order_id from aimme_order_20181210 where Order_Amt <> 10000.0 ;
-- 等于
 select distinct * from aimme_order_20181210 where Order_Status = 'in transit';
-- between and
select * from aimme_order_20181210 where Order_Amt between 1000 and 8000;

-- in /not in
select*from aimme_order_20181210 where Order_Amt in (3000,5000,6000,8000);

insert into aimme_goodsorder_20181210 values;
insert into aimme_goodsorder_20181210 values;

-- null / not null
-- 为空
select * from aimme_goodsorder_20181210 where Item_Name is null ;
select * from aimme_goodsorder_20181210 where Item_Name is not null ;



-- 或者,查询订单号为YTES181022 或 1719181024 的记录
select * from aimme_goodsorder_20181210 where Order_ID = 'YTES181022'or Order_ID = '1719181024';
-- and 查询订单号为 1719181024 并且 单品号 为 12600073001 的记录
select * from aimme_goodsorder_20181210 where Item_ID = '12600073001' and Order_ID = '1719181024';

-- 模糊查询
-- 查询订单号以5结尾的记录
select * from aimme_goodsorder_20181210 where Order_ID like '%3';
select * from aimme_goodsorder_20181210 where Order_ID like '17_918102_';

/*
 * Group by
 * 用于对相关列进行汇总类的统计
 * 
 * group by 后面的字段:   select后面 汇总函数前面的所有字段
 * as 用于给表或者列取别名
 */

-- 查询所有订单数目总和 并按降序排列
select Order_ID , sum( Item_Qty) as sum_qty  from aimme_goodsorder_20181210 
group by Order_ID 
order by sum( Item_Qty) desc;

-- 查询每个订单号的平均订货单品数量

select Order_ID , avg( Item_Qty) as avg_qty  from aimme_goodsorder_20181210 
group by Order_ID 
order by sum( Item_Qty) desc;

-- 计数
select Order_ID , count(Member_id) from aimme_order_20181210 group by order_id;

-- 去重计数 --函数后面与括号之间不要有空格
select count( distinct Member_ID) from aimme_order_20181210 ;

-- 最大最小值
select order_id,Order_Status, max(order_amt) from aimme_order_20181210 group by order_status ;
select order_id,Order_Status, min(order_amt) from aimme_order_20181210 group by order_status ;

/*
 * having 对汇总后的结果进行过滤
 * 
 * 如果要对没有汇总的结果进行过滤使用的是where
 * 
 * 对汇总后订单金额小于100000的进行过滤 用 having
 * 
 *过滤订单金额大于20000的数据 用 where
 */

select  member_id , sum(order_amt) from aimme_order_20181210 
group by member_id having sum(order_amt) < 100000;
select  member_id ,order_amt from aimme_order_20181210 
where order_amt >20000 ;

文章源代码完整版 下载链接

https://download.csdn.net/download/fengkaungdewoniu/10844302

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章