SQL语言

一、数据表操作

  • 创建表

create table 表名(
字段名 类型 约束,
字段名 类型 约束

)

例1:创建学生表:姓名(长度为10),年龄,身高(保留两位小数)

create table students(
 		id int unsigned primary key auto_increment,
 		name varchar(20),
 		age int unsigned,
 		height decimal(5,2)
)
  • 删除表

drop table 表名
drop table if exists 表名

例:删除学生表

drop table students

drop table if exists students

二、数据操作

查询

查询所有字段
select * from 表名
查询指定字段
select 列1,列2,… from 表名

插入

insert into 表名 values(…)

例:添加一行数据

格式一:所有字段设置值,值的顺序与表中字段的顺序对应
insert into 表名 values(...)

插入一个学生,设置所有字段的信息
insert into students values(0,'亚瑟',22,177.56)

格式二:部分字段设置值,值的顺序与给出的字段顺序对应
insert into 表名(字段1,...) values(值1,...)

例:插入一个学生,只设置姓名
insert into students(name) values('老夫子')

例:添加多行数据

方式一:写多条insert语句,语句之间用英文分号隔开
insert into students(name) values('老夫子2');
insert into students(name) values('老夫子3');
insert into students values(0,'亚瑟2',23,167.56)

方式二:写一条insert语句,设置多条数据,数据之间用英文逗号隔开
格式一:insert into 表名 values(...),(...)...
例:插入多个学生,设置所有字段的信息
insert into students values(0,'亚瑟3',23,167.56),(0,'亚瑟4',23,167.56)

格式二:insert into 表名(列1,...) values(值1,...),(值1,...)...
例:插入多个学生,只设置姓名
insert into students(name) values('老夫子5'),('老夫子6')

修改

update 表名 set 列1=值1,列2=值2… where 条件

例:修改id为5的学生数据,姓名改为 狄仁杰,年龄改为 20

update students set name='狄仁杰',age=20 where id=5

删除

delete from 表名 where 条件

例:删除id为6的学生数据

delete from students where id=6

注意: 对于重要的数据,不能轻易执行delete语句进行删除,一旦删除,数据无法恢复,这
时可以进行逻辑删除

  1. 给表添加字段,代表数据是否删除,一般起名isdelete,0代表未删除,1代表删除,默认值为0
  2. 当要删除某条数据时,只需要设置这条数据的isdelete字段为1
  3. 以后在查询数据时,只查询出isdelete为0的数据

三、数据操作-查询

创建数据表

drop table if exists students;
create table students (
 studentNo varchar(10) primary key,
 name varchar(10),
 sex varchar(1),
 hometown varchar(20),
 age tinyint(4),
 class varchar(10),
 card varchar(20)
)

准备数据

insert into students values
('001', '王昭君', '女', '北京', '20', '1班', '340322199001247654'),
('002', '诸葛亮', '男', '上海', '18', '2班', '340322199002242354'),
('003', '张飞', '男', '南京', '24', '3班', '340322199003247654'),
('004', '白起', '男', '安徽', '22', '4班', '340322199005247654'),
('005', '大乔', '女', '天津', '19', '3班', '340322199004247654'),
('006', '孙尚香', '女', '河北', '18', '1班', '340322199006247654'),
('007', '百里玄策', '男', '山西', '20', '2班', '340322199007247654'),
('008', '小乔', '女', '河南', '15', '3班', null),
('009', '百里守约', '男', '湖南', '21', '1班', ''),
('010', '妲己', '女', '广东', '26', '2班', '340322199607247654'),
('011', '李白', '男', '北京', '30', '4班', '340322199005267754'),
('012', '孙膑', '男', '新疆', '26', '3班', '340322199000297655')

消除重复行(distinct)

select distinct 列1,… from 表名

条件

where子句

select 字段1,字段2… from 表名 where 条件;

where后面支持多种运算符,进行条件的处理

  • 比较运算
  • 逻辑运算
  • 模糊查询
  • 范围查询
  • 空判断

(一)比较运算符

  • 等于: =
  • 大于: >
  • 大于等于: >=
  • 小于: <
  • 小于等于: <=
  • 不等于: != 或 <>

(二)逻辑运算符

  • and
  • or
  • not

(三)模糊查询

  • like
  • %表示任意多个任意字符
  • _表示单个任意字符

(四)范围查询

  • in表示在一个非连续的范围内
  • between … and …表示在一个连续的范围内

(五)空判断

  • null与 " 是不同的
  • 判空 is null

排序

select * from 表名
order by 列1 asc|desc,列2 asc / desc,…

asc升序,desc降序

聚合函数(聚合函数不能在 where 中使用)

  • count(*)表示计算总行数,括号中写星与列名,结果是相同的
  • max(列)表示求此列的最大值
  • min(列)表示求此列的最小值
  • sum(列)表示求此列的和
  • avg(列)表示求此列的平均值

分组

select 列1,列2,聚合… from 表名 group by 列1,列2…

分组后的数据筛选

select 列1,列2,聚合… from 表名
group by 列1,列2,列3…
having 列1,…聚合…

补充:对比where与having

  • where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
  • having是对group by的结果进行筛选

获取部分行

select * from 表名
limit start,count

从start开始,获取count条数据
start索引从0开始

分页

已知:每页显示m条数据,求:显示第n页的数据

select * from students limit (n-1)*m,m

连接查询

准备数据

drop table if exists courses;
create table courses (
 courseNo int(10) unsigned primary key auto_increment,
 name varchar(10)
);
insert into courses values 
('1', '数据库'),
('2', 'qtp'),
('3', 'linux'),
('4', '系统测试'),
('5', '单元测试'),
('6', '测试过程');
drop table if exists scores;
create table scores (
 id int(10) unsigned primary key auto_increment,
 courseNo int(10),
 studentno varchar(10),
 score tinyint(4)
);
insert into scores values 
('1', '1', '001', '90'),
('2', '1', '002', '75'),
('3', '2', '002', '98'),
('4', '3', '001', '86'),
('5', '3', '003', '80'),
('6', '4', '004', '79'),
('7', '5', '005', '96'),
('8', '6', '006', '80');

内连接

select * from 表1
inner join 表2 on 表1.列=表2.列

例1:查询学生信息及学生的成绩

select
 *
from
 students stu,
 scores sc
where
 stu.studentNo = sc.studentNo
---------------------------------------
select
 *
from
 students stu
inner join scores sc on stu.studentNo = sc.studentNo

例2:查询课程信息及课程的成绩

select
 *
from
 courses cs,
 scores sc
where
 cs.courseNo = sc.courseNo
---------------------------------------
select
 *
from
 courses cs
inner join scores sc on cs.courseNo = sc.courseNo

例3:查询学生信息及学生的课程对应的成绩

select
 *
from
 students stu,
 courses cs,
 scores sc
where
 stu.studentNo = sc.studentno
 and cs.courseNo = sc.courseNo
---------------------------------------
select
 *
from
 students stu
inner join scores sc on stu.studentNo = sc.studentNo
inner join courses cs on cs.courseNo = sc.courseNo

例4:查询王昭君的数据库成绩,要求显示姓名、课程名、成绩

select
 stu.name,
 cs.name,
 sc.score
from
 students stu,
 scores sc,
 courses cs
where
 stu.studentNo = sc.studentNo
 and sc.courseNo = cs.courseNo
 and stu.name = '王昭君'
 and cs.name = '数据库'
---------------------------------------
select
 stu.name,
 cs.name,
 sc.score
from
 students stu
inner join scores sc on stu.studentNo = sc.studentNo
inner join courses cs on sc.courseNo = cs.courseNo
where
 stu.name = '王昭君' and cs.name = '数据库'

例5:查询所有学生的数据库成绩,要求显示姓名、课程名、成绩

select
 stu.name,
 cs.name,
 sc.score 
from
 students stu,
 scores sc,
 courses cs
where
 stu.studentNo = sc.studentNo
 and sc.courseNo = cs.courseNo
 and cs.name = '数据库'
---------------------------------------
select
 stu.name,
 cs.name,
 sc.score
from
 students stu
inner join scores sc on stu.studentNo = sc.studentNo
inner join courses cs on sc.courseNo = cs.courseNo
where
 cs.name = '数据库'

例7:查询男生中最高成绩,要求显示姓名、课程名、成绩

select
 stu.name,
 cs.name,
 sc.score
from
 students stu,
 scores sc,
 courses cs
where
 stu.studentNo = sc.studentNo
 and sc.courseNo = cs.courseNo
 and stu.sex = '男'
order by
 sc.score desc
limit 1
---------------------------------------
select
 stu.name,
 cs.name,
 sc.score
from
 students stu
inner join scores sc on stu.studentNo = sc.studentNo
inner join courses cs on sc.courseNo = cs.courseNo
where
 stu.sex = '男'
order by
 sc.score desc
limit 1

左连接

左连接查询:查询的结果为两个表匹配到的数据加左表特有的数据,对于右表中不存在的数据使用null填充

select * from 表1
left join 表2 on 表1.列=表2.列

例1:查询所有学生的成绩,包括没有成绩的学生

select
 *
from
 students stu
left join scores sc on stu.studentNo = sc.studentNo

例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名

select
 *
from
 students stu
left join scores sc on stu.studentNo = sc.studentNo
left join courses cs on cs.courseNo = sc.courseNo

右连接

右连接查询:查询的结果为两个表匹配到的数据加右表特有的数据,对于左表中不存在的数据使用null填充

select * from 表1
right join 表2 on 表1.列=表2.列

例1:查询所有课程的成绩,包括没有成绩的课程

select
 *
from
 scores sc
right join courses cs on cs.courseNo = sc.courseNo

例2:查询所有课程的成绩,包括没有成绩的课程,包括学生信息

select
 *
from
 scores sc
right join courses cs on cs.courseNo = sc.courseNo
left join students stu on stu.studentNo = sc.studentNo

四、实例练习

准备数据

create table goods(
 id int unsigned primary key auto_increment,
 name varchar(150),
 cate varchar(40),
 brand_name varchar(40),
 price decimal(10,3) default 0,
 is_show bit default 1,
 is_saleoff bit default 0
);
insert into goods values(0,'r510vc 15.6英寸笔记本','笔记本','华硕','3399',default,default
);
insert into goods values(0,'y400n 14.0英寸笔记本电脑','笔记本','联想','4999',default,defa
ult);
insert into goods values(0,'g150th 15.6英寸游戏本','游戏本','雷神','8499',default,default
);
insert into goods values(0,'x550cc 15.6英寸笔记本','笔记本','华硕','2799',default,default
);
insert into goods values(0,'x240 超极本','超级本','联想','4999',default,default);
insert into goods values(0,'u330p 13.3英寸超极本','超级本','联想','4299',default,default)
;
insert into goods values(0,'svp13226scb 触控超极本','超级本','索尼','7999',default,defaul
t);
insert into goods values(0,'ipad mini 7.9英寸平板电脑','平板电脑','苹果','1998',default,d
efault);
insert into goods values(0,'ipad air 9.7英寸平板电脑','平板电脑','苹果','3388',default,de
fault);
insert into goods values(0,'ipad mini 配备 retina 显示屏','平板电脑','苹果','2788',defaul
t,default);
insert into goods values(0,'ideacentre c340 20英寸一体电脑 ','台式机','联想','3499',defau
lt,default);
insert into goods values(0,'vostro 3800-r1206 台式电脑','台式机','戴尔','2899',default,d
efault);
insert into goods values(0,'imac me086ch/a 21.5英寸一体电脑','台式机','苹果','9188',defau
lt,default);
insert into goods values(0,'at7-7414lp 台式电脑 linux )','台式机','宏碁','3699',default,
default);
insert into goods values(0,'z220sff f4f06pa工作站','服务器/工作站','惠普','4288',default,
default);
insert into goods values(0,'poweredge ii服务器','服务器/工作站','戴尔','5388',default,def
ault);
insert into goods values(0,'mac pro专业级台式电脑','服务器/工作站','苹果','28888',default
,default);
insert into goods values(0,'hmz-t3w 头戴显示设备','笔记本配件','索尼','6999',default,defa
ult);
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);
insert into goods values(0,'x3250 m4机架式服务器','服务器/工作站','ibm','6888',default,de
fault);
insert into goods values(0,'hmz-t3w 头戴显示设备','笔记本配件','索尼','6999',default,defa
ult);
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);

简单查询

求所有电脑产品的平均价格,并且保留两位小数

select round(avg(price),2) as avg_price from goods;

查询所有价格大于平均价格的商品,并且按价格降序排序

select id,name,price from goods
where price > (select round(avg(price),2) as avg_price from goods)
order by price desc;

查询类型为’超极本’的商品价格

select price from goods where cate = '超级本';

查询价格大于或等于"超级本"价格的商品,并且按价格降序排列

select id,name,price from goods
where price = any(select price from goods where cate = '超级本')
order by price desc;

= any 或者 =some 等价 in

select id,name,price from goods
where price in (select price from goods where cate = '超级本')
order by price desc;

!=all 等价于 not in

select id,name,price from goods
where price not in (select price from goods where cate = '超级本')
order by price desc;

数据分表

创建“商品分类”表

create table if not exists goods_cates(
 cate_id int unsigned primary key auto_increment,
 cate_name varchar(40)
);

查询goods表的所有记录,并且按"类别"分组

select cate from goods group by cate;

将分组结果写入到goods_cates数据表

insert into goods_cates (cate_name) select cate from goods group by cate;

通过goods_cates数据表来更新goods表

update goods as g inner join goods_cates as c on g.cate = c.cate_name
set cate = cate_id;

通过create…select来创建数据表并且同时写入记录,一步到位

create table goods_brands (
 brand_id int unsigned primary key auto_increment,
 brand_name varchar(40)) select brand_name from goods group by brand_name;

通过goods_brands数据表来更新goods数据表

update goods as g inner join goods_brands as b on g.brand_name = b.brand_name
set g.brand_name = b.brand_id;

查看 goods 的数据表结构,会发现 cate 和 brand_name对应的类型为 varchar 但是存储的都
是字符串
修改数据表结构,把cate字段改为cate_id且类型为int unsigned,把brand_name字段改为
brand_id且类型为int unsigned

分别在 good_scates 和 goods_brands表中插入记录

insert into goods_cates(cate_name) values ('路由器'),('交换机'),('网卡');
insert into goods_brands(brand_name) values ('海尔'),('清华同方'),('神舟');

在 goods 数据表中写入任意记录

insert into goods (name,cate_id,brand_id,price)
values('LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');

查询所有商品的详细信息 (通过左右链接来做)

select * from goods left join goods_cates on goods.cate_id=goods_cates.id
inner join goods_brands on goods.brand_id=goods_brands.id

显示没有商品的品牌(通过右链接+子查询来做) – 右链接

select * from goods right join goods_brands on goods.brand_id =goods_brands.id

– 子查询

select * from goods_brands where id not in (select DISTINCT brand_id from goods)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值