数据库分为关系型数据库和非关系型数据库,我们要学的MySQL数据库是关系型数据库。
<>SQL语言:结构化查询语言(Structured Query Language)
结构化查询语言是关系型数据库标准语言,其特点是:简单,灵活,功能强大。
SQL包含6个部分:
* 数据查询语言(DQL):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER
BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
* 数据操作语言(DML): 其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
* 事务处理语言(TPL): 它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN
TRANSACTION,COMMIT和ROLLBACK。
* 数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
* 数据定义语言(DDL): 其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP
TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
* 指针控制语言(CCL): 它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE
CURRENT用于对一个或多个表单独行的操作。
我们使用过程中主要使用数据查询语言(DQL)数据定义语言(DDL)和数据操作语言(DML)
<>1、数据定义语言DDL(Data Definition Language)
对象:数据库和表
*
关键字:create、alter、drop、truncate(删除当前表再新建一个一模一样的表结构)
*
创建数据库:create database 库名;
*
删除数据库:drop database 库名;
*
切换数据库:use 库名;
*
创建表:create table 表名(
字段名 类型(大小) 关系描述);
*
查看数据库里存在的表:show tables;
*
修改表:alter table 表名 约束;
*
删除表:drop table 表名 ;
*
查看生成表的sql语句:show create table 表名 ;
*
查看表结构:desc 表名;
例:
#注意在MySQL数据库里写可以不带";",但是在DOS命令下写必须带。 create database school; #建库 drop database
school; #删库 use school; #用库 create table student( #建表 id int(4) primary key
auto_increment, name varchar(20), socre int(3), ); show tables; alter table
studentrename studentplus; #修改表名 rename alter table student add password varchar
(20); #添加字段 add alter table student change password pwd varchar(20); alter table
studentmodify pwd int; alter table student drop pwd; drop table student; show
create table student; desc student;
<>2、数据操纵语言DML(Data Manipulation Language)
对象:纪录(行)
*
关键词:insert、update 、delete
*
插入:insert into 表名 values(全属性); (插入所有的字段)
insert into 表名(属性1,属性2) values (属性1,属性2); (插入指定的字段)
*
更新:update 表名 set 属性1 = ‘值’,属性2= ‘值’ where 主键(通常) = 值;
*
删除:delete from 表名 where 主键(通常) = 值;
注意:
truncate和delete的区别:truncate是删除表,再重新创建这个表。属于DDL,delete是一条一条删除表中的数据,属于DML。
insert into student values(01,'Tonny',90); insert into student(name,score)
values ('Keby',98),('somenne',78); update student set name = 'Tonn',score = '99'
where id = 01; delete from student where id = 01;
<>3、数据查询语言DQL(Data Query Language)
select ... from student where 条件 group by 分组字段 having 条件 order by 排序字段 #最复杂不过如此
执行顺序:from --> where --> group by --> having --> order by
<>3.1、条件查询
简单条件运算符:> < = != <> >= <=
逻辑运算符:&& || ! and or not (用于连接条件表达式)
模糊查询:like、between and、in、not in、is null
<>3.2、排序查询
* 语法:order by 子句
* order by 排序字段1 排序方式1 , 排序字段2 排序方式2…
* 排序方式:
* ASC:升序,默认的。
* DESC:降序。
* 注意:
* 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
<>3.3、聚合函数
将一列数据作为一个整体,进行纵向的计算。
* count:计算个数
一般选择非空的列:主键
select count(id) from 表名
* max:计算最大值
* min:计算最小值
* sum:计算和
* avg:计算平均值
注意:聚合函数的计算,排除null值。
<>3.4、分组查询
* 语法:group by 分组字段;
* 注意:
* 分组之后查询的字段:分组字段、聚合函数
* where 和 having 的区别?
* where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
* where 后不可以跟聚合函数,having可以进行聚合函数的判断。
注意:
例如:
#所有字段查询 select * from student; #带条件查询 SELECT * FROM `student` WHERE id > 1;
SELECT * FROM `student` WHERE name like '%on%'; #模糊查询 select count(id) from
student; # 综合 SELECT *,AVG(score) FROM `student` WHERE id > 1 GROUP BY id HAVING
AVG(score)>20 ORDER BY id DESC;
<>4、高级查询
<>4.1、嵌套查询
嵌套查询也叫子查询,是把内层的查询结果作为外层的查询条件,并且可以多层嵌套。
语法格式:
select 字段名列表 from 表名 where 字段名 运算符(select 字段名 from 表名 where 条件) # select *
...就是查询全部
**注意:**外层的where的条件必须和内层的select查询的字段名一样,个数也一样。
<>4.2、多表查询
语法格式:
select 字段名列表 from 表一,表二 where 条件;
但是这种查询,很容易出现笛卡尔积,为了避免,我们可以将条件尽量细致化。
笛卡尔积
1.什么是笛卡尔积:两个集合的乘积,产生一个 新的集合。表示两个集合所有的可能的组合情况
2.笛卡尔积和关系:笛卡尔积中,去掉没有意义 或不存在的组合,就是关系(规范的二维表)
* 笛卡尔积的匹配规则(面试常考点):
* 记录多的表的每一天记录,去匹配另一张表的所有记录。
* 两张表的记录条数相同时,则后表的每一条记录去匹配前表。
<>4.3、连接查询
* 内连接 inner join
* 外连接
1>. 左连接 left join
2>. 右连接 right join
语法格式:
select 字段名列表 from 表1 连接方式 join 表2 on 表1.字段=表2.字段;
左连接:left join( 以左表为基准,匹配右表的所有内容,不够的显示NULL )
右连接:right join(以右表为基准,去匹配左表的内容,不够的显示NULL )
<>4.4、联合查询
联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合在一起,使用为此为UNINO或UNION ALL
联合查询:将多个查询的结果合并到一起(纵向合并):字段数不变,多个查询的记录数合并.
select 语句1 union[union 选项] select 语句2 union|[union 选项] select 语句n
//all:表示无论重复都输出 //distinct: 去重(整个重复)(默认的) select *from addr union all select *
from addr;