3. SQL概述
SQL :Structure Query Language。(结构化查询语⾔)SQL被美国国家标准局 (ANSI)确定为关系型数据库语⾔的美国标准,后来被国际化标准组织(ISO)采纳 为关系数据库语⾔的国际标准。 各数据库⼚商都⽀持ISO的SQL标准。
各数据库⼚商在标准的基础上做了⾃⼰的扩展。
4. SQL的分类
DDL(Data Definition Language):数据定义语⾔,⽤来定义数据库对象:库、表、列等;
DML(Data Manipulation Language):数据操作语⾔,⽤来定义数据库记录(数据);
DCL(Data Control Language):数据控制语⾔,⽤来定义访问权限和安全级别;
DQL(重要)(Data Query Language):数据查询语⾔,⽤来查询记录(数据)。 注 意:sql语句以;结尾
5. SQL详情
5.1 DDL操作
5.1.1 操作数据库
定义:操作数据库、表、列等 使⽤的关键字:CREATE、 ALTER、 DROP
-
创建
Create database mydb1;
Create database mydb2 character set gbk;
Create database mydb3 character set gbk COLLATE gbk_chinese_ci;
-
查询
查看当前数据库服务器中的所有数据库
Show databases;
查看前⾯创建的mydb2数据库的定义信息
Show create database mydb2;
删除前⾯创建的mydb3数据库
Drop database mydb3;
-
修改
查看服务器中的数据库,并把mydb2的字符集修改为utf8;
alter database mydb2 character set utf8;
-
删除
Drop database mydb3;
-
其他
查看当前使⽤的数据库
Select database();
切换数据库
Use mydb2;
5.5.2 操作数据表
-
语法
create table 表名(
字段1 字段类型,
字段2 字段类型,
...
字段n 字段类型
);
-
常用数据类型
int:整型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位⼩数,即最⼤值为
999.99;
char:固定⻓度字符串类型;
char(10): 'aaa ' 占10位
varchar:可变⻓度字符串类型;
varchar(10): 'aaa' 占3为
text:字符串类型;
blob:字节类型;
date:⽇期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会⾃动赋值
datetime:⽇期时间类型 yyyy-MM-dd hh:mm:ss
boolean:mysql不⽀持,oracle⽀持
-
常用操作
查看当前数据库中的所有表
SHOW TABLES;
查看表的字段信息
DESC employee;
在上⾯员⼯表的基本上增加⼀个image列。
ALTER TABLE employee ADD image blob;
修改job列,使其⻓度为60。
ALTER TABLE employee MODIFY job varchar(60);
删除image列,⼀次只能删⼀列。
ALTER TABLE employee DROP image;
表名改为user。
RENAME TABLE employee TO user;
查看表格的创建细节
SHOW CREATE TABLE user;
修改表的字符集为gbk
ALTER TABLE user CHARACTER SET gbk;
列名name修改为username
ALTER TABLE user CHANGE name username varchar(100);
备份表结构和表数据
create table tname2 as select * from tname1;
备份表结构
create table tname2 like tname1;
删除表
DROP TABLE user ;
5.2 DML操作
DML是对表中的数据进⾏增、删、改的操作。不要与DDL混淆了。
INSERT 、UPDATE、 DELETE ⼩知识:在mysql中,字符串类型和⽇期类型都要⽤ 单引号括起来。空值:null
5.2.1插入操作
-
语法:
INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);注意:列名与列值 的类型、个数、顺序要⼀⼀对应。
可以把列名当做java中的形参,把列值当做实参。值不要超出列定义的⻓度。如果插 ⼊空值,请使⽤null插⼊的⽇期和字符⼀样,都使⽤单引号括起来。
-
小知识
查看数据库编码的具体信息Show variables like 'character%';
临时更改客户端和服务器结果集的编码
Set character_set_client=gbk;
Set character_set_results=gbk;
第⼆种插⼊数据的⽅法 insert into 新表 select 列 from 已有表
create table emp1(
id int,
name varchar(100),
gender varchar(10),
birthday date,
salary float(10,2),
entry_date date,
resume text
);
INSERT INTO emp1 select * from emp 将emp表的所有数据复制到emp1中
-
注意
-
mysql不⽀持select into
-
在复制时是按照列的顺序依次进⾏
-
新表的列与原来表的列的名字,类型都可以不⼀样,照样复制成功.但是会出现数据转 换错误.具体的:名字不⼀样,问题不⼤.类型不⼀样,出现错误,⽐如将int型的数据强制转 换成varchar型,会显示0,反之亦然
5.2.2修改操作
语法
UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 WHERE 列名=值
5.2.3删除操作
-
语法
DELETE FROM 表名 【WHERE 列名=值】
-
truncate和delete的区别
DELETE 删除表中的数据,表结构还在;删除后的数据可以找回 TRUNCATE 删除是把 表直接DROP掉,然后再创建⼀个同样的新表。 Truncate删除的数据不能找回。执⾏ 速度⽐DELETE快。
5.3 DQL操作
数据库执⾏DQL语句不会对数据进⾏改变,⽽是让数据库发送结果集给客户端。查询 返回的结果集是⼀张虚拟表
-
语法
SELECT 列名 FROM 表名
【WHERE --> GOUP BY -->HAVING--> ORDER BY LIMIT】
语法子句说明:
SELECT selection_list /要查询的列名称/
FROM table_list /要查询的表名称/
WHERE condition /⾏条件/
GROUP BY grouping_columns /对结果分组/
HAVING condition /分组后的⾏条件/
ORDER BY sorting_columns /对结果排序/
LIMIT offset_start, row_count /结果限定/
5.3.1 基础查询
1.查询所有列
SELECT * FROM stu;
2.查询指定列
SELECT sid, sname, age FROM stu;
5.3.2 条件查询
语法
条件查询介绍 条件查询就是在查询时给出WHERE⼦句,在WHERE⼦句中可以使⽤如下运算符及关 键字:
=、!=、<>、<、<=、>、>=;BETWEEN…AND;IN(set);IS NULL; AND;OR; NOT,XOR (逻辑异或);
5.3.3 模糊查询
语法
当想查询姓名中包含a字⺟的学⽣时就需要使⽤模糊查询了。模糊查询需要使⽤关键 字LIKE。
通配符:
_ 任意⼀个字⺟ %:任意0~n个字⺟ '张%'
5.4 聚合函数
sum avg max min count
聚合函数是⽤来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录⾏数;
MAX():计算指定列的最⼤值,如果指定列是字符串类型,那么使⽤字符串排序运 算;
MIN():计算指定列的最⼩值,如果指定列是字符串类型,那么使⽤字符串排序运 算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
5.5 分组查询
当需要分组查询时需要使⽤GROUP BY⼦句,例如查询每个部⻔的⼯资和,这说明要 使⽤部⻔来分组。
注:凡和聚合函数同时出现的列名,则⼀定要写在group by 之后
having与where的区别
1.having是在分组后对数据进⾏过滤.
where是在分组前对数据进⾏过滤
2.having后⾯可以使⽤分组函数(统计函数)
where后⾯不可以使⽤分组函数。
WHERE是对分组前记录的条件,如果某⾏记录没有满⾜WHERE⼦句的条件,那么这⾏记录
不会参加分组;⽽HAVING是对分组后数据的约束。
5.6 LIMIT
LIMIT⽤来限定查询结果的起始⾏,以及总⾏数。