mysql select唯一数据库_数据库select查询语句进阶

昨日回顾:

一. 数据库的介绍

管理数据的软件

二. 数据库的 分类:

a.关系型数据库

有约束

b.非关系型数据库

没有约束

三. MySQl 的安装:

a. exe msi文件 点击下一步下一步

b. 压缩包

bin

mysqld : 启动mysql服务的

mysql : 连接mysql

环境变量

四. 数据库(文件夹)

数据表 (文件)

数据行(文件行)

五. 数据库:

增:

create database 数据库名;

删:

drop database 数据库名;

查:

show databases;

数据表:

创建:

create table 表名(

id int auto_increment primary key

列名1 列类型 [not null/ null default '' ],

列名2 列类型 [not null/ null default '' ],

列名n 列类型 [not null/ null default '' ]

)engine=Innodb charset=utf8;

列类型:

数值类型:

tinyint

samllint

mediumint

int

bigint

有符号 / 无符号 (unsigned)

字符串类型:

char varchar text

时间日期类型:

datetime 年月日时分秒

删除:

drop table 表名;

查询:

show tables;

修改:

alter table 表名 change/modify 旧列名 新列声明;

alter table 表名 add 新列声明;

alter table 表名 drop 旧列名;

数据行:

增:

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

删除:

delete from 表名 where id=12;;

truncate 表名;

修改:

update 表名 set name='xxxx';

update 表名 set name='xxxx' where id=12;

update 表名 set name='xxxx',age=12 where id=12;

查询:

select * from 表名;

select name, age from 表名;

六.外键 (一对多)

作用:

1. 约束

2. 节省空间

create table department (

id int auto_increment primary key,

depart_name varchar(32) not null default '',

num int not null default 0

)engine=Innodb charset=utf8;

create table userinfo (

id int auto_increment primary key,

name varchar(32) not null default '',

depart_id int not null default 1,

# constraint 外键名(fk_userinfo_depart) foreign key (列名(depart_id)) references 表名(department)(关联的列名(id)),

# constraint fk_userinfo_depart foreign key (depart_id) references department(id)

)engine=Innodb charset=utf8;

ps:

1. 不能将创建外键的语句单独拿出来

alter table userinfo add constraint fk_userinfo_depart foreign key (depart_id) references department(id);

alter table userinfo drop foreign key 外键名称(fk_userinfo_depart );

2. 外键关联的时候, 必须关联的是表的主键ID

3. 练习的时候, 将语句写在文本中, 然后考过去执行

4. 主键索引 : 加速查找 + 不能为空 + 不能重复

今日内容:

一. 外键的变种: (*********************************************************)

1. 唯一索引:

create table t5(

id int,

num int,

unique(num)

)engine=Innodb charset=utf8;

作用:

num列的值不能重复

加速查找

create table t6(

id int,

num int,

unique(id, num)

)engine=Innodb charset=utf8;

联合唯一索引作用:

num列和id列的值不能重复

加速查找

create table t6(

id int,

num int,

unique(id, num......)

)engine=Innodb charset=utf8;

2. 一对多:

部门表:

id depart_name

1 公关部

2 公共部

3 保安部

员工表:

id name age depart_id(外键)

1 lxxx 12 2

2 xxxx 13 1

3 xxxx 13 2

3. 一对一:

用户表:

id name age

1 zekai 23

2 eagon 34

3 lxxx 45

4 owen 83

博客表:

id url user_id (外键 + 唯一约束)

1 /linhaifeng 2

2 /zekai 1

3 /lxxx 3

4 /lxxx 4

4. 多对多:

用户表:

idnamephone

1root11234

2root21235

3root31236

4root41237

5root51238

6root61239

7root71240

8root81241

主机表:

idhostname

1c1.com

2c2.com

3c3.com

4c4.com

5c5.com

为了方便查询, 用户下面有多少台主机以及某一个主机上有多少个用户, 我们需要新建第三张表:

user2host:

iduseridhostid

111

212

313

424

525

632

734

创建的时候, userid 和 hostid 必须是外键, 然后联合唯一索引 unique(userid, hostid)

Django orm 也会设计

二. 数据行的操作:

增:

insert into 表名 (列名1, 列名2,) values(值1, 值2);

insert into 表名 (列名1, 列名2,) values(值1, 值2),(值1,值2),(值n,值n);

insert into 表名 (列名1, 列名2,) select 列名1, 列名2 from 表名;

删除:

delete from 表名;

delete from 表名 where id > 10

delete from 表名 where id < 10

delete from 表名 where id <= 10

delete from 表名 where id >= 10

delete from 表名 where id != 10

delete from 表名 where id = 10 and name='xxx'; and : 并且 两个条件都必须要成立

delete from 表名 where id = 10 or name='xxx'; or : 或者 只要满足一个条件成立

修改:

update 表名 set name='zekai', age=23 where id > 10;

查询:

基本:

select * from 表名;

select name , age from 表名;

高级:

a. where 条件查询:

select * from 表名 where id=10;

select * from 表名 where id >10 and id<15;

select * from 表名 where id > 10;

!= : 不等与

>= <=

between and: 闭区间

select * from t4 where id between 9 and 12;

in: 在某一个集合中

select * from t4 where id in (9,10,11....);

select * from t4 where id in (select id from t3 where id between 2 and 4)

是可以这样使用的, 但是不建议大家使用;

b. 通配符:

alex

select * from 表 where name like 'ale%' - ale开头的所有(多个字符串)

select * from 表 where name like 'ale_' - ale开头的所有(一个字符)

c. 限制取几条:

select * from 表名 limit 索引偏移量, 取出多少条数据;

select * from t3 limit 0, 10; 第一页

select * from t3 limit 10, 10; 第二页

page = input('page:')

page 索引偏移量 数据量(offset)

1 0 10

2 10 10

3 20 10

4 30 10

page (page-1)*offset offset

分页核心SQL:

select * from t3 limit (page-1)*offset, offset;

d. 排序:

order by

降序:

select * from t4 order by 列名 desc; descending

升序:

select * from t4 order by 列名 asc; ascending

多列:

create table t7(

id int auto_increment primary key,

num int not null default 0,

age int not null default 0

)charset=utf8;

insert into t7 (num, age) values (2, 12),(3,13),(4, 12);

select * from t4 order by num desc, name asc;

如果前一列的值相等的话, 会按照后一列的值进行进一步的排序.

e. 分组

select age, 聚合函数(count(num)/sum(num)/max(num)/min(num)/avg(num)) from 表名 group by 列名;

select age, avg(num) from t7 group by age;

select age, count(num) from t7 group by age;

select age, count(num) as cnt from t7 group by age; 显示别名 as

having的二次删选:

select age, count(num) as cnt from t7 group by age having cnt>1;

where 和 having的区别:

1). having与where类似,可筛选数据

2). where针对表中的列发挥作用,查询数据

3). having针对查询结果中的列发挥作用,二次筛选数据, 和group by配合使用

f. 连表操作

select * from userinfo, department; (笛卡尔积)

select * from userinfo, department where userinfo.depart_id=department.id;

左连接:

select * from userinfo left join department on userinfo.depart_id=department.id;

左边的表全部显示, 右边没有用到不显示

右连接:

select * from userinfo right join department on userinfo.depart_id=department.id;

右边的表全部显示, 左边没关联的用null表示

内连接:

左右两边的数据都会显示

ps:

a.只需要记住左连接 left join

b.可以连接多张表 通过某一个特定的条件

注意查询的顺序:

select name,sum(score) from 表 where id > 10 group by score having age> 12 order by age desc limit 2, 10

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值