mysql

条件关键字

where可以被having代替
having用于分组之后可以接聚合函数,弥补了where不能接聚合函数的缺陷,可以代替where
on用于链接
update user set host = '%' where user = 'root';
增:
create table 数据库名称 ; 创建数据库
create 表名{
字段名称 字段类型(长度) 约束,
 
 
};
create table students(
id int not null primary key auto_increment,
name char(10),
age int,
);
char char(3)(长度固定 ,不可以变,没有存的空间空格补齐 )
String varchar(3)(长度可以变)
3代表的是可以存三个字符  
date YYYY-MM-DD
time hh:mm:ss
datetime YYYY-MM-DD  hh:mm:ss 默认是null
timestamp  YYYY-MM-DD  hh:mm:ss 默认是当前时间
 
text 存文本
blob 存放二进制
 
约束:
主键: primary key
唯一约束: unique
非空约束: not null
 
增加字段;
alter table 表名 add 字段名 数据类型 约束;
alter table students add score int not null;
修改字段大小和字段类型:
alter table 表名 modify 字段名 varchar(20);
alter table students modify name varchar(20);
修改字段名称:
alter table students change name student_name varchar(20);
删除字段:
alter table students drop score;
 
修改表名:
rename table students to studentssss;
修改表的字符集:
alter table students character set utf8;
 
 
删除表;
drop students;
 
 
 
 
 
 
 
 
 
 
 
创建表
 
 
创建数据库的指定字符集 create database name character set utf8 collate utf8_bin
collate 校对字符集
修改:
修改数据库字符集 alter databae 数据库名称 character set 字符集
删除:
drop database 数据库名字; 删除数据库
 
 
查:
 
使用数据库:
use 数据库名称;
 
查看正在使用的数据库:
select database();
 
查看表:
show tabLe;
 
查看库的定义过程:
show create database test;
查看表的创建过程;
show create table students;
查看表结构:
desc students;
 
 
 
-------------------------------------------------------------------
 
 
对表操作:
增:
insert into students(id,name,age) values(11,'mlj',111);
简单写法:
insert into students values(11,'mlj',111);
批量插入:
insert into students values
(12,'mlj',111),
(13,'mlj',111),
(14,'mlj',111),
(15,'mlj',111),
(17,'mlj',111),
(18,'mlj',111),
(19,'mlj',111);
 
 
 
 
删:
delete from students where id=10;
delete from students; 删除整个表的数据
truncate students; 删除表后重新建表
truncate ()也是个函数 保留 小数位
 
delete和truncate drop
区别:delete是一条一条的删除记录
truncate是删除所有记录后重启启动创建表
drop删除后表就啥都不存在了
 
改:
若果参数是字符串或者是日期要加单引号
update students set id=1080 ,name='ssss' where id=19;
 
查:select [distinct][*][字段,字段2] from 表名 [where 条件]
distinct表示去除重复

在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 distinct用于返回唯一不同的值。

表A:

表B:

1.作用于单列

select distinct name from A

执行后结果如下:

2.作用于多列

示例2.1
select distinct name, id from A

执行后结果如下:

实际上是根据name和id两个字段来去重的,这种方式Access和SQL Server同时支持。

示例2.2
select distinct xing, ming from B

返回如下结果:

返回的结果为两行,这说明distinct并非是对xing和ming两列“字符串拼接”后再去重的,而是分别作用于了xing和ming列。

3.COUNT统计

select count(distinct name) from A;	  --表中name去重后的数目, SQL Server支持,而Access不支持

count是不能统计多个字段的,下面的SQL在SQL Server和Access中都无法运行。

select count(distinct name, id) from A;

若想使用,请使用嵌套查询,如下:

select count(*) from (select distinct xing, name from B) AS M;

4.distinct必须放在开头

select id, distinct name from A;   --会提示错误,因为distinct必须放在开头

5.其他

distinct语句中select显示的字段只能是distinct指定的字段,其他字段是不可能出现的。例如,假如表A有“备注”列,如果想获取distinc name,以及对应的“备注”字段,想直接通过distinct是不可能实现的。但可以通过其他方法实现关于SQL Server将一列的多行内容拼接成一行的问题讨论

 

 

转自:http://www.cnblogs.com/rainman/archive/2013/05/03/3058451.html



别名查询 

as可以省略
select p.name ,p.price from product as p;表别名
 
--去掉重复的值
select distinct pprice from product;
---select运算查询
select * ,pprice*2 折后价 from product ;
 
-----条件查询
查询价格大于60的产品
select* from product where pprice>60;

 as作为临时表

用到的知识点  内连接
SELECT student.*,temp.score FROM 
student ,
(SELECT student_id ,score FROM studentcourse WHERE score<60) as temp
WHERE student.id = temp.student_id;

关系运算符

 > >= < <= = != <>不等于
逻辑运算 and or not
    between..and....
1157177-20190308084409750-1662187330.png
1157177-20190308084410013-1268244537.png


 模糊查询

-:代表的是任意一个字符
%:代表的是0个或多个字符
1157177-20190308084410481-822400282.jpg

 过滤查询(distinct)

1157177-20190308084410765-347255311.jpg
去掉重复的值
select * from product where pname like '%米%';
select * from product where pname like '_米%';

 查询排序

使用order by 子句排序查询结果。

语法:select * from 表名 order by 列名1  asc|desc,列名2asc|desc),列名3asc|desc) 。。。。。;

按照列名1,列名2,列名3 进行排序输出。

asc是升序排列,desc是降序排列。默认是asc升序。

 

按照第一列进行排序,如果第一列相同,按照第二列在进行排序。

 


 
--in 在某个范围中获得值
select * from product where pnum in (1,3,5);
 
--排序查询:order by 关键字
asc:ascend 升序 (默认的排序方式)
desc:descend 降序
select * from product order by pprice desc;价格降序
select * from product where pname like '%米%' order by pprice asc;//包含米字并且升序排序
 
--聚合查询:
sum()
avg()
count()
max()
min()
select sum(pprice) from product;查看所有商品价格的总和
select count(*) from product;查看商品的个数
select * from product where pprice > (select avg(pprice) from product);查询产品大于平均值的信息
 
 
----分组

 group by

顺序

先分组之后聚合函数再计算
select pnum ,count(pnum)from product group by pnum; 按pnum分组,求出分组个数
显示的列名跟聚合函数一致 , pnum ,count(pnum) 不要出现其他列名
having 可以接聚合函数 出现在分组之后
select pnum ,avg(pprice)from product group by pnum having avg(pprice)> 60; 根据pnum分组 并且要求分组avg大于60
where 他不可以接聚合函数 出现在分组之前
group by在我之前的工作中不一定用到,可惜group by在一般的笔试测试的时候经常用到。所以今天刚开一个博客记录下g roup by用法,为避免以后再犯这个错误。

  聚合函数
求和函数——SUM()

计数函数——COUNT()

最大/最小值函数—MAX()/MIN()

均值函数——AVG()

—————————————————————————————————————————

GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想

你用了GROUP BY 按  ITEM.ITEMNUM 这个字段分组,那其他字段内容不同,变成一对多又改如何显示呢,比如下面所示

A  B
1  abc
1  bcd
1  asdfg

select A,B from table group by A
你说这样查出来是什么结果,

A  B
   abc
1  bcd
   asdfg

右边3条如何变成一条,所以需要用到聚合函数,比如

select A,count(B) 数量 from table group by A
这样的结果就是
A  数量
1   3

——————————————————————————————————————

Store_Information 表格

  store_name Sales Date 

  Los Angeles $1500 Jan-05-1999 

  San Diego $250 Jan-07-1999 

  Los Angeles $300 Jan-08-1999 

  Boston $700 Jan-08-1999 

  我们就打入
SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name 

  结果: 

  store_name SUM(Sales)

  Los Angeles $1800

  San Diego $250

  Boston $700

————————————————————————————————————————

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

group by报错 
 any_value()
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;




多个列名分组

where和分组没有关系
1157177-20190308084411096-2082638355.png

select ... from ... where 条件1 ... group by ... having 条件2

执行顺序:

条件1 会先执行过滤

进行分组

条件2进行过滤

 

开发中什么情况下使用分组?小技巧。

当在需求中遇到每种,每个等字眼的时候就使用分组。


1157177-20190308084411376-469356449.jpg


 
 
create table product(
pid int primary key auto_increment,
pname varchar(20),
pprice int,
ptime timestamp,
pnum int
 
);
 
 
insert into product values
(null,'小米6',5000,null,3),
(null,'辣条',1,null,32),
(null,'啤酒',4,null,3),
(null,'啤酒',5000,null,3);
 
 
--------------------多表操作-----------------------------------
---外键操作------------
给product中的这个cno
添加一个外键约束 
 
alter table product add foreign key(cno)  references  category(cid);
    pid int primary key auto_increment,//主键设置为外键
一对多
多对多(多建一张中间表,  将多对多的关系拆成一对多关系,中间至少要有两个外键,这两个外键分别指向原来的那张表)
一对一
 
 
--------------------多表操作-----------------------------------
 
 
 

关于sql中constraint 前缀的用意(PK、UK、DF、CK、FK)



constraint 约束

--主键
constraint PK_字段 primary key(字段),

--唯一约束
constraint UK_字段 unique key(字段),

--默认约束
constrint DF_字段 default('默认值') for 字段,

--检查约束
constraint CK_字段 check(约束。如:len(字段)>1),

--主外键关系
constraint FK_主表_从表 foreign(外键字段) references 主表(主表主键字段)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
------------------------------------------------------------------------
 
mysqld --initialize-insecure --user=mysql
mysqld -install
mysqld -remove
 
 
mysqladmin -u root -p password 新密码
 
 
 
1.登录常用参数
    -u 用户名
 
    -p 密码
 
    mysql -uroot -p
    mysql -uroot -proot
 
    -h 服务器名称
 
    mysql -hlocalhost -uroot -p
    mysql -h127.0.0.1 -uroot -p
 
    -P 端口号
 
    mysql -uroot -p -P3306     
 
    -D 打开指定数据库
 
    -V 输出版本信息并退出
    mysql -V
    mysql -uroot -p -Vte
 
2.退出
quit
exit
\

多表设计原则:
1157177-20190308084412098-381795670.png

1157177-20190308084412440-1481700222.jpg

扩展:

sum

1157177-20190308084412667-1778676399.png

1157177-20190308084413096-402042272.jpg

 limit

语法select * from 表名 limit  offset, row_count;



外键:

1157177-20190308084413385-1098747476.jpg
restrict  限制 主从表有联系
cascade 删除一个表的记录时,已知关联的表的记录也会被删除.
set null  删除一个表的记录时,已知关联的表的记录的值被设置为null

null查询 

1157177-20190308084413729-1237657576.jpg

内连接

两边都有才会查出来的
1157177-20190308084414097-1115135079.jpg
左链接
1157177-20190308084414497-1234315210.jpg
on条件必须加入

两表联合查询及条件过滤

解决了迪卡尔集问题
1157177-20190308084415018-249693730.jpg

子条件查询

定义:用查询处理的结果作为查询的条件来继续查询
个人理解 :找出分数不是最高分的记录

1157177-20190308084415317-376546291.jpg
1157177-20190308084415642-330927226.jpg

转载于:https://www.cnblogs.com/mljqqh/p/10493766.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值