SQL的概念
(1)SQL(Structured Query Language):结构化查询语言;其实就是定义了操作所有关系型数据库的规则。是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。
(2)SQL通用语法
① SQL 语句可以单行或多行书写,以分号结尾。
② 可使用空格和缩进来增强语句的可读性。
③ MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
④ 3 种注释
* 单行注释: -- 注释内容 或 # 注释内容(mysql 特有)
* 多行注释: /* 注释 */
DDL:操作数据库、表
1. 操作数据库
① C(Create):创建
创建数据库:
create database 数据库名称;
② R(Retrieve):查询
查询所有数据库的名称:
show databases;
查询某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称;
③ U(Update):修改
修改数据库的字符集
alter database 数据库名称 character set 字符集名称;
④ D(Delete):删除
删除数据库
drop database 数据库名称;
判断数据库存在,存在再删除
drop database if exists 数据库名称;
⑤ 使用数据库
查询当前正在使用的数据库名称
select database();
使用数据库
use 数据库名称;
- 操作表
① C(Create):创建
语法:
create table 表名(
-- 字段名 类型 属性,
-- 字段名 类型 属性,
-- ....
-- 字段名 类型 属性
-- );
注意:
a.最后一列,不需要加逗号(,)
b.[]部分是可以省略的
c.`` 反引号(让关键字失效)可以省略,主要为了区分关键字和普通文字
表名命名规范:
a.表名和字段名:表名是数据库中的唯一标识,字段名是表中的唯一标识
b.采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔。
c.全部小写命名,禁止出现大写
d.字段名称不应该取得太长(一般不超过三个英文单词)
② 数据库类型(常用):
字符串类型:
- char[(M)]:固定长字符串,检索快但费空间(0<= M <=255)
- varchar[(M)]:可变字符串(0 <= M <=65535)
- text:文本串(4个G左右大小)
数值类型:
- tinyint:非常小的数据(1字节)
- int:标准整数(4字节)
- bigint:较大的整数,相当于long(8字节)
- Decimal(钱):字符串形式的浮点数(m,d),m个字节,小数点后d位
日期和时间类型
datetime: 日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
Null类型:
• 理解为“没有值”或“未知值”;
• 不要用NULL进行算术运算,结果仍为NULL;
• MySQL中,0或NULL都意味着为假,1为真。
两种表的适用场景:
使用MyISAM:节约空间及相应速度;
使用InnoDB:安全性,事务处理及多用户操作数据表。
创建表
create table student(
id int,
name varchar(32),
age int ,
score double(4,1),
birthday date,
insert_time timestamp
);
复制表:create table 表名 like 被复制的表名;
2. R(Retrieve):查询
查询某个数据库中所有的表名称
show tables;
查询表结构
desc 表名;
查看创建表的 SQL 语句
show creat table 表名;
3. U(Update):修改
1>. 修改表名
alter table 旧表名 rename as 新表名;
2>. 修改表结构
a.改变字段的属性
alter table 表名 modify 字段名 要修改的属性;
b.修改字段
alter tale 表名 change 旧的字段名 新的字段名 要修改的属性;
3>. 添加字段
alter table 表名 add 字段名 类型 属性;
4>. 删除字段
alter table 表名 drop 字段名;
4. D(Delete):删除
drop table 表名;
drop table if exists 表名 ;
DML:增删改表中数据
1. 新增:
insert into 表名(字段名1,字段名2,...字段名n) values(值1,值2,...值n);
insert into 表名 values(值1,值2,...值n);
注意:
①列名和值要一一对应。
②日期用字符串的形式表示
③除了数字类型,其他类型需要使用引号(单双都可以)引起来
eg:
让主键自增(全字段语句)
- 在主键值中写default
- 在主键值中写null
一次性插入多条数据
insert into 表名(字段1,字段2...) value(值1),(值2)...;
不常用的新增方式:
- 拷表(表都要存在)
insert into 要拷贝的表名 select 字段名... from 被拷贝数据的表名
- 新建表的时候插入数据(新表不存在)
create table 新表名 select 字段名... from 被拷贝数据的表名
insert into 表名 value(值1,值2...);[后面的值必须是全字段]
2.删除数据:
delete from 表名;(整表删除)
delete from 表名 where 子句;
清空表:truncate 表名;
注意:
① 如果不加条件,则删除表中所有记录。
② 如果要删除所有记录
(1). delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
(2). truncate table 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
3. 修改数据:
语法:
update 表名 set 字段名1=值1,字段名2=值2,...字段名n=值n... where 子句
修改where后面字段名对应的where前面字段名的值
注意:
- 如果不加任何条件,则会将表中所有记录全部修改。
- -- 改变一个范围内的数据(>= and <=)等价于 between 小数据 and 大数据
DQL:查询表中的记录
1 基础查询
(1)查询表所有行和列的数据(得到的是一张虚拟表)
select * from 表名
select 全字段 from 表名;
(2)查询指定字段
select 字段名1,字段名2... from 表名;
注意:如果查询所有字段,则可以使用*来替代字段列表。
(3)给字段起别名:
a.select 旧字段名 as '新字段名';
b.select 旧字段名'新字段名';
c.select 旧字段名 新字段名;
表使用别名的原因:用于多表查询操作。
- 去除重复(distinct),查询字段名中完全相同的才会去掉,只要有一个重复的就会留下
select distinct 字段名... from 表名;
- 带条件的查询 where 子句;
eg:查询学生表中sid在3-7范围内的学生
select * from student where sid between 3 and 7;
2 条件查询
条件查询:如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件。对记录进行过滤。
select字段名 from 表名 where子句;
*:查询表中生日(生日日期越大,年龄越小)
流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回
(1) where子句后跟条件
(2) 运算符
> 、< 、<= 、>= 、= 、<>/!=(不等于)
between...and (包头又包尾)
模糊查询:
a.like关键字
模糊符号 %:任意多的任意字符、_:一个任意字符
b.in关键字:在特定的范围内查找
c.is关键字(查询为空的数据:where 字段名 is null/查询非空的数据:where 字段名 is not null)
聚合函数:
语法:之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。聚合函数会忽略空值 NULL。
-- 统计个数 count(字段)/字段可以写*、常量、任意字段名/count不统计数据为null的个数
-- 统计平均值 avg(字段)
-- 统计最大值 max(字段)
-- 统计最小值 min(字段)
-- 统计总和 sum(字段)
eg:select count(*) 总个数, sum(score) 总成绩, avg(score) 平均分, max(score) 最高分, min(score) 最低分 from sc;
分组查询:
分组查询用group by语句对查询信息进行分组,相同数据作为一组,分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
select 分组字段名,聚合函数 from 表名 group by 分组字段名;
eg:select classid,count(*) from student group by classid;
where是对聚合(分组)前的每一条数据的筛选
having是对聚合(分组)后的每一条数据的筛选
having不能单独出现,必须搭配group by出现
eg:获取平均分大于80以上的同学
select sid,avg(score) from sc group by sid having avg(score) > 80;
排序 order by(降序desc、升序asc(默认升序))
可以写多个条件,用逗号隔开,先写第一需要排序的数据,以此类推
limit(分页)m,n m表示从几开始,n表示步长,取几条数据
查询表中5,6,7条学生的数据(公式:页码-1*步长,步长)
select * from student limit 4,3;
3 多表联查
- 等值联查(内联数据),适用于表少或表多数据少
select * from 表1,表2 where 表1.字段1 = 表2.字段2...
非等值联查
笛卡尔积,把需要查询表的数据全部都罗列下来形成一个大的数据表
select * from 表名1,表名2,...
2. 连接查询(外联查询)
select * from 表名1 inner join 表名2 on条件,inner join on,..., 数据大时建议使用
left join on(左外联)
从左表(表1)中返回所有的记录,即便在右(表2)中没有匹配的行
right join on(右外联)
从右表(表2)中返回所有的记录,即便在左(表1)中没有匹配的行
- 连接查询union
union是求两个查询的并集
union合并的是结果集,不区分来自哪一张表,所以可以合并多张表查询出来的数据
select * from 表名1 inner join 表名2 on条件,inner join on,... union select * from 表名1 inner join 表名2 on条件,inner join on,...
union特点:
- 字段名不一致时,会以第一张表的表头为准,并对其
- 会将重复的行过滤掉,与distinct类似
- 如果查询的表列数不对等,会报错
- 在每个句子中的排序是没有意义的,mysql在进行合并的时候会忽略掉
- 可以对合并后的整表进行排序
- 可以对表1的字段名起别名,就是最终的表头
union all,可以查询到联表中所有的信息
union all,可以查询到所有表的所有信息,求两个查询的并集,但不会把重复的过滤掉
4 子查询
- where子查询
查询id最大的一名学生
select * from student where sid = (select max(sid) from student);
2. from子查询
把内层的查询结果当成临时表,供外层sql再次查询,查询结果集可以当成表看待,临时表要使用一个别名。
3. exists 子查询
把外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出,内层查询是exists后的查询。
- any,some,all子查询
- any子查询
- 表示满足其中任意一个条件,假设any内部的查询语句返回的结果个数是三个result1...
- Select...from... where a > any(...);
- any子查询
相当于:
Select...from... where a > result1 or a > result2 or a > result3;
-
-
- any和some用法一致,可以互换
- all子查询
- 表示满足所有条件,假设any内部的查询语句返回的结果个数是三个result1...
- Select...from... where a > all(...);
-
相当于:
Select...from... where a > result1 and a > result2 and a > result3;
- case when then end语句
- 简单case函数
Case ssex
When 1 then ‘男’
When 2 then ‘女’
End,
2. Case搜索函数
Case
When ssex = 1 then ‘男’
When ssex = 2 then ‘女’
Else‘未知’
End,
以上就是MySQLDDL和DML和DQL的基本语法。