SQL单表&多表查询

1.sql分类

	数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等 
	数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。
	数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等  ***
	数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等

2.操作数据库表

1.创建表之数据类型
create table 表名称(字段名称 字段类型(长度) 约束,字段名称 字段类型(长度) 约束…);
字段类型 :
常用 int varchar
char和varchar : char固定长度 varchar 可变长度 基本上使用varchar
身份证号 固定 char 姓名 不固定 varchar
date 只有日期 //生日
time 只有时间
datetime和timestamp
datetime就是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用null存入到数据库中.
timestamp也是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用当前的系统时间存 入到数据库中。//用户的注册时间
file 几乎不用

约束:
约束作用:保证数据的完整性
单表约束分类:
主键约束:primary key 主键约束默认就是唯一 非空的
唯一约束:unique
非空约束:not null

//建表语句
	create database web_test1;    
	use web_test1;
	create table user(				**** 
		id int primary key auto_increment, 
		username varchar(20) unique,
		password varchar(20) not null,
		age int,
		birthday date
	);

2.查看所有表和查看某个表结构
查看某个数据库下的所有的表
show tables;
查看某个表的结构信息
desc 表名;
删除表
语法:drop table 表名; ****
3.修改表
添加列
alter table 表名 add 列名 类型(长度) 约束; ***
修改列类型,长度和约束
alter table 表名 modify 列名 类型(长度) 约束;
删除列
alter table 表名 drop 列名; ***
修改列名称
alter table 表名 change 旧列名 新列名 类型( 长度) 约束;
修改表名
rename table 表名 to 新的表名;
修改表的字符集
alter table 表名 character set 字符集;
4.添加记录
向表中插入某些列:
insert into 表名 (列名1,列名2,列名3…) values (值1,值2,值3…)
向表中插入所有列:
insert into 表名 values (值1,值2,值3…);
注意事项
1.值的类型与数据库中表列的类型一致。
2.值的顺序与数据库中表列的顺序一致。
3.值的最大长度不能超过列设置最大长度。
4.值的类型是字符串或者是日期类型,使用单引号引起来
补充:添加中文记录
需要将MySQL数据库服务器中的客户端部分的字符集改为gbk。
找到MySQL的安装路径:my.ini文件,修改文件中[client]下的字符集,然后重新启动MySQL的服务(services.msc)

5.修改记录
语法:update 表名 set 列名=值,列名=值 [where 条件];
注意事项
1.值的类型与列的类型一致。
2.值的最大长度不能超过列设置的最大长度。
3.字符串类型和日期类型添加单引号。

修改某一列的所有值
	update user set password = 'abc';
按条件修改数据
	update user set password = 'xyz' where username = 'bbb';
按条件修改多个列
	update user set password='123',age=34 where username='aaa';

6.删除记录
语法:delete from 表名 [where 条件];
注意事项
1.删除表的记录,指的是删除表中的一行记录。
2.删除如果没有条件,默认是删除表中的所有记录。
删除某一条记录
delete from user where id = 2;
删除表中的所有记录
delete from user;
删除表中的记录有两种做法区别
delete from user;
删除所有记录,属于DML语句,一条记录一条记录删除。事务可以作用在DML语句上的
truncate table user;
删除所有记录,属于DDL语句,将表删除,然后重新创建一个结构一样的表。事务不能控制DDL

事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全都成功,要么全都失败。
回滚(Rollback)指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。
开启事物: start transaction ;回滚事物: rollback;

3.单表查询操作

3.1基本查询
select [distinct] |列名 from 表 [条件];
//select 列名|属性|
from 表 [条件];

数据准备
   create table exam(
        			id int primary key auto_increment,
        			name varchar(20),
        			english int,
        			chinese int,
        			math	int
        		);
        
        		insert into exam values (null,'张三',85,74,91);
        		insert into exam values (null,'李四',95,90,83);
        		insert into exam values (null,'王五',85,84,59);
        		insert into exam values (null,'赵六',75,79,76);
        		insert into exam values (null,'田七',69,63,98);
        		insert into exam values (null,'李老八',89,90,83);
        		1.select * from exam;
			2.select name,english from exam;
			3.select distinct english from exam;(不显示重复的值)
			4.select name,english+chinese+math from exam;
			5.select name,english+chinese+math as sum from exam;
			6.SELECT NAME,(english+chinese+math)/3 AS AVG FROM exam;

3.2条件查询
使用where连接条件
> , < , >= , <= , <> ,=
like:模糊查询
in:范围查询
条件关联:and , or ,not ,between…and…

like可以进行模糊查询,在like子句中可以使用_或者%作为占位符。_只能代表一个字符,而%可以代表任意个字符。
	* like ‘李_’		:名字中必须是两个字,而且是姓李的。
	* like ‘李%’		:名字中姓李的学生,李子后可以是1个或任意个字符。
	* like ‘%四’		:名字中以四结尾的。
	* like ‘%王%’	:只要名称中包含这个字就可以。
		select * from exam where name = '李四';
		select * from exam where name = '李四' and english > 90;  
		select * from exam where name like '李%';
		select * from exam where english in (69,75,89);

3.3排序查询
使用order by 字段名称 asc/desc;

查询学生信息,并且按照语文成绩进行排序:
 select * from exam order by chinese;
查询学生信息,并且按照语文成绩倒序排序:	
select * from exam order by chinese desc;
查询学生信息,先按照语文成绩进行倒序排序,如果成绩相同再按照英语成绩升序排序
select * from exam order by chinese desc,english asc;
查询姓李的学生的信息,按照英语成绩降序排序
select * from exam where name like '李%' order by english desc;

3.4聚合函数查询
sum:

			select sum(english) from exam;
			select sum(english),sum(math) from exam;
			select sum(english) from exam where name like '李%';
			select sum(english)+sum(chinese)+sum(math) from exam; 或者 select sum(english+chinese+math) from exam;
	  区别:前者按照列的方式统计,英语成绩总和+语文成绩总和+数学成绩总和。后者是先计算英语+数学+语文然后再求和。后者的话,如果有一个为null的话,都为null,使用if null 函数解决 select sum(ifnull(english,0)+chinese+math) from exam;

count:

	count;select count(*) from exam; [count(1)]		
	max:select max(math) from exam;	
	min:select min(chinese) from exam;
	avg:select avg(chinese) from exam;

单表查询语句总结:
书写的一般顺序
S(select)… F(from)…W(where)…G(group by)…H(having)…O(order by);(其中select和from是必须的,其他关键词是可选的)
执行的一般顺序
数据库在执行查询的时候,六个关键词的执行顺序(注意:与书写顺序不一样)
from–where–group by–having–select–order by
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据

扫描二维码关注公众号,回复: 4496560 查看本文章

4.多表查询

4.1交叉连接:cross join
交叉连接:查询到的是两个表的笛卡尔积。

select * from 表1 cross join 表2;
select * from 表1,表2; *****

4.2内连接:inner join(inner是可以省略的)
显示内连接:在SQL中显示的调用inner join关键字

select * from 表1 inner join 表2 on 关联条件;
隐式内连接:在SQL中没有调用inner join关键字
select * from 表1,表2 where 关联条件;

4.3外连接:outer join(outer可以省略的)
左外连接:select * from 表1 left outer join 表2 on 关联条件;

右外连接:`select * from 表1 right outer join 表2 on 关联条件;`

4.4子查询
子查询:一个查询语句条件需要依赖另一个查询语句的结果。
4.4.1 SQL语句的嵌套带in的子查询
查询学生生日在91年之后的班级的信息。
1,首先查到学生生日在91年之后
select * from student where birthday > ‘1991-01-01’ 然后只取班级编号 改为 select cno from student where birthday > ‘1991-01-01’
2,然后查询班级的信息
select * from classes where cid in …
3,最后把第1步的语句放到in里面

select * from classes where cid in (select cno from student where birthday > '1991-01-01');
4.4.2 带exists的子查询
	查询学生生日在91年1月1日之后的班级,如果记录存在,前面的SQL语句就会执行
		1,首先查到学生生日在91年之后
				select * from student where birthday > '1991-01-01'  然后只取班级编号 改为 select  cno from student where birthday > '1991-01-01'
				2,然后查询班级的信息
				select * from classes where cid in ...
			3,最后把第1步的语句放到exists里面
				select * from classes where exists (select cno from student where birthday > '1991-01-01');
4.4.3带any的子查询
	查询大于任意一个(学生所在班级的编号)的班级的信息
	1,首先查询学生里面班级的信息
				select cno from student 
			2,然后查询班级的信息
				select * from classes where cid > ANY ...
			3,最后把第1步的语句放到any里面
				select * from classes where cid > ANY (select cno from student)
4.4.4 带all的子查询
	查询大于所有(学生所在班级的编号)的班级的信息
1,首先查询学生里面班级的信息
				select cno from student 
			2,然后查询班级的信息
				select * from classes where cid > ALL ...
			3,最后把第1步的语句放到all里面
select * from classes where cid > ALL (select cno from student)
总结:子查询使用场景为前面条件进行查询的时候需要依赖后面的查询结果

猜你喜欢

转载自blog.csdn.net/weixin_43851540/article/details/84989671