数据库基础(三)

本文详细解释了SQL创建表的完整语法,包括字段定义、约束条件(如无符号、默认值、非空、唯一和主键)、自增属性,以及SQL修改表、删除字段、分组、筛选、排序和分页操作。
摘要由CSDN通过智能技术生成

创建表的完整语法

create table 库名.表名(
    字段名1 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名2 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名3 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名4 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名5 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名6 数据类型 约束条件 约束条件 约束条件 约束条件
);

注意:

1. 字段名和数据类型必须写的,不能省略
2. 约束条件是可选的,可有可无,而且可有有多个
3. 表结构中最后一个字段不能有逗号 

约束条件(在数据类型基础进行约束)

1.unsigned(无符号) 

create table 表名(id int unsigned)

2.zerofill(0填充)

3.default(默认值)

create table 表名 (id int, name varchar(32) default 'kk');
insert into 表名 values(1, 'jj');
insert into 表名(id) values(1);

4.not null (非空)

create table t3 (id int ,name varchar(32) not null);

 insert into t3(id) values(1); #如果没有加入数据就会报错

5.unique (唯一)

 create table t4(id int ,name varchar(32) unique);

 insert into t4 values(1,'kk');

 insert into t4 values(1,'kk');  #单列相同的数据就会报错

create table t7 (id int,  ip varchar(32), port varchar(32),unique(ip, port));        #这样多列都是唯一

6.primary key(主键)

create table t5 (id int primary key);

主键本身是一种索引,索引能够加快查询速度。

InnoDB存储引擎规定每一张表都要有一个主键,没有指定主键也能创建成功表这是为什么呢?

是因为InnoDB存储引擎内部有一个隐藏的主键,这个主键我们看不到,它也不能够加快查询速度,仅仅是为了帮助我们把表创建成功. 所以,以后我们创建表的时候都主动的创建一个主键,我们自己创建的主键能够加快查询速度,因为是一个索引。

一般情况下,主键都给id aid sid uid pid,大多都给id字段加了,所以,每一张表都要有一个id字段,并且一张表中不只是有一个主键,可以有多个主键,但是,大多数情况下,都只有一个

7.auto_incrment(自增) 

通常配合主键使用

create table t6(id int primary key auto_increment,name varchar(32));

 insert into t7(name) values('kk');

 insert into t7(name) values('kk');

 insert into t7(name) values('kk');

补充:

id int(10) 数字不代表的是范围

name varchar(32)数字代表的就是存储的范围

清空表的两种方式

1.delete from 表名;   # 不会重置id值

2.truncate 表名;  # 清空表、重置id值

建议使用truncate,万一清空错了还有机会恢复

因为MySQL有很多日志文件,比如binlog日志,记录了你所有的SQL语句

其他SQL语句

1.修改表名

alter table 表名 rename 新表名;

2.增加字段

alter table 表名 add 字段名 数据类型 约束条件;

alter table 表名 add 字段名 数据类型 约束条件 first; #字段加在第一行

alter table 表名 add 字段名 数据类型 约束条件 after 字段名;  #加在某一字段后

3.删除字段

alter table 表名 drop 字段名;

4.修改字段

alter table 表名 modify 字段名 数据类型 完整性条件约束;

alter table 表名 change 旧字段名 新字段名 旧数据类型 完整约束条件;

注意:modify只能改字段数据完整约束,不能改字段名,但是change可以。

查询关键字

where(筛选条件的)

模糊查询:没有明确的筛选条件

关键字:like

关键符号:% 匹配任意个数任意字符

                  _  匹配单个个数任意字符

1.查询id大于等于3小于等于6的数据
select id,name from emp where id >= 3 and id <= 6;
select *  from emp where id between 3 and 6;  

2.查询薪资是20000或者18000或者17000的数据
select * from emp where salary = 20000 or salary = 18000 or salary = 17000;
select * from emp where salary in (20000,18000,17000);  # 简写

3.查询员工姓名中包含o字母的员工姓名和薪资
select name,salary from emp where name like '%o%';

4.查询员工姓名是由四个字符组成的员工姓名与其薪资
select name,salary from emp where name like '____';
select name,salary from emp where char_length(name) = 4;

5.查询id小于3或者大于6的数据
select *  from emp where id not between 3 and 6;

6.查询薪资不在20000,18000,17000范围的数据
select * from emp where salary not in (20000,18000,17000);

7.查询岗位描述为空的员工名与岗位名
select name,post from emp where post_comment = NULL;  # 针对null不能用等号,只能用is查询为空!
select name,post from emp where post_comment is NULL;
select name,post from emp where post_comment is not NULL;

group by分组

分组一般配合聚合函数使用:sum max min avg count 

分组的关键字:group by

注意:

1. 分组之后默认可以获取所有的字段信息
2. 分组之后,展示的数据都是每个组的第一条数据

针对5.6需要自己设置sql_mode
set global sql_mode = 'only_full_group_by,STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';

设置sql_mode为only_full_group_by,

使用group by有几点需要注意的地方:

(1)、group by查询语句中select后面字段必须是by后面的分组字段,如果其他的字段想出现在select中必须要和聚合函数一起使用。

(2)、group by查询语句中返回分组后每个组的第一条数据。

(3)、group by多字段分组是将具有相同多个字段的数据放到同一个分组中,比如group by a,b,意思是将所有具有a字段值和b字段值的数据放到一个分组里。

(4)、group by常用的五种聚合函数:

max(列名):求最大值; 

select max(salary) from emp group by post;

min(列名):求最小值;

select post,min(salary) from emp group by post;

sum(列名):求和;

select post,sum(salary) from emp group by post;

avg(列名):求平均值;

select post,avg(salary) from emp group by post;

count(列名):统计记录的条数;

select post,count(id) from emp group by post;

补充:在显示的时候还可以给字段取别名
select post as '部门',max(salary) as '最高工资' from emp group by post;

group_concat

如果真的需要获取分组以外的数据字段 可以使用group_concat(),他是在分组之后使用的

select post,group_concat(name) from emp group by post;

也可以在获取的数据间使用符号隔开

select post,group_concat(name,'|',sex, '|', gender) from emp group by post;

concat

不分组使用

select concat(name,sex) from emp;
select concat(name,'|',sex) from emp;

concat_ws()

select post,concat_ws('|', name, age, gender) from emp group by post;

having过滤

where与having都是筛选功能,有区别
where在分组之前对数据进行筛选    having在分组之后对数据进行筛选

 小练习:.统计各部门年龄在30岁以上的员工平均薪资,并且保留平均薪资大于10000的部门

select avg(salary) as avg_salary from emp where age > 30 group by post having avg(salary) > 10000;

思路是先筛选出年龄在30岁以上的,再进行分组,按照部门分组,保留平均薪资大于10000的部门

distinct去重

select distinct id,age from emp;

注意,带主键的数据去重有没有意义? 没有,主键本身就是唯一的 

order by排序

select * from emp order by salary;     #默认升序排
select * from emp order by salary desc;      #降序排

小练习:统计各部门年龄在20岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序 

select avg(salary) from emp where age > 20 group by post having avg(salary) > 1000 order by avg(salary) desc;

思路:先筛20岁以上的员工,再各部门的平均薪资

limit分页 

查询工资最高的人的详细信息
select * from emp order by salary desc limit 1;
select * from emp limit 0,5;  

select * from emp limit 5,5;

# 第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置

regexp正则 

select * from emp where name regexp '^j.*(n|y)$'; 

#匹配j开头的n或者y结尾的字符串 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值