共计 7501 个字符,预计需要花费 19 分钟才能阅读完成。
SQL:Structured Query Language, 结构化查询语言,SQL 是用来存取关系数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能。其特点是:非过程性语言,那么什么是非过程语言呢?
过程性语言:当前的这条语句执行需要依赖于上一条或几条语句;
非过程性语言:可一条语句,就会执行一个结果。
SQL 分类
(1)DDL(数据定义语言):Data Definition Language,用来定义数据库的对象,如数据表、视图、索引等;
(2)DML(数据操纵语言):Data Manipulation Language,在数据库表中更新,增加和删除记录,如 update,insert,delete;
(3)DCL(数据控制语言):Data Control Language,指用于设置用户权限和控制事务语句,如 grant,revoke,if…else,while,begin transaction;
(4)DQL(数据查询语言):Data Query Language,如 select。
1,创建数据库
语法:create database 数据库名称 ; (创建数据库采用数据库服务器默认字符集)
复杂写法 create database 数据库名称 character set 字符集 collate 比较规则 ;
每次创建一个数据库在数据存放目录中生成一个文件夹,每个文件夹中存在 db.opt 存放默认字符集和校对规则
例如:
创建一个名称为 mydb1 的数据库。create database mydb1;
创建一个使用 utf8 字符集的 mydb2 数据库。create database mydb2 character set utf8;
创建一个使用 utf8 字符集,并带校对规则的 mydb3 数据库。create database mydb3 character set utf8 collate utf8_bin;
2,查询数据库
show databases; —– 查看所有数据库
show create database 数据库名; —— 查看数据编码集
3,删除数据库
语法:drop database 数据库名称;
4,修改数据库
修改数据库编码集:语法:alter database 数据库名称 character set 字符集 collate 比较规则; eg:修改 mydb2 字符集为 gbk; alter database mydb2 character set gbk;
切换当前使用数据库:use 数据库名称
查看当前正在使用数据库: select database();
下面是有关数据库中表的操作:
1,创建表
CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype,
)character set 字符集 collate 校对规则
field:指定列名 datatype:指定列类型。一个数据表 可以存在很多列,每列具有类型和长度,创建表时没有指定 字符集,将采用数据库默认字符集,创建表之前 必须使用 use db 语法指定操作数据库
创建数据表时,只有字符串类型必须写长度,而其他类型都有默认长度
MySQL 常用数据类型
(1)字符串型:VARCHAR、CHAR,Java 中 String char 对应于 mysql 中字符串型 char varchar,其中 char 是定长,如果不够用空格补全,varchar 是变长,经常使用。char 的效率要高。例如:char(8) 保存 star,因为 star 只有四个字符,所有会补充四个空格,成为 8 个字符存入 char(8)中,如果有 varchar(8) 自动根据存放内容改变长度
(2)大数据类型:BLOB、TEXT,java 中 大数据类型 inputStream 二进制文件和 Reader 文本文件对应于 mysql 大数据类型 blob(存放大二进制数据) text(存放大的文本文件),tinyblob tinytext 255 字节 blob text 64KB mediumblob mediumtext 16MB longblob longtext 4GB。
(3)数值型:java 中 byte short int long float double 对应于 mysql 中数值类型 TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
(4)逻辑型:BIT,java 中 boolean 对应于 mysql 逻辑型 bit 存放一位数值 0 或者 1
(5)日期型:DATE、TIME、DATETIME、TIMESTAMP。mysql 日期类型 date (只有日期) time(只有时间) datetime(日期时间都有) timestamp(日期时间都有)datetime 和 timestamp 表现形式上完全相同,区别就在于 timestamp 在数据库可以自定更新(当前时间),即 datetime 需要手动录入时间,timestamp 若不传入数据,会默认选择当前系统的时间。
定义单表字段的约束
约束是用来保证数据有效性和完整性,下面为约束的几种类型
(1)定义主键约束(primary key):信息记录某个字段可以唯一区分其他信息记录,这个字段就可以是主键(唯一 非空),不允许为空,不允许重复。
删除主键:alter table tablename drop primary key ;
主键自动增长:auto_increment
(2)唯一约束(unique):该字段的值不允许重复,一张表中可以有很多个唯一约束,只能有一个 (两个) 作为主键约束。eg:name varchar(20) unique;
(3)非空约束(not null):该字段的值不能为空,eg:salary double not null。
举例:如果主键约束类型为 数值型 int bigint,添加 auto_increment 自动增长
create table employee2 (
id int primary key auto_increment,
name varchar(20) unique not null,
gender varchar(20) not null,
birthday date not null,
entry_date date not null,
job varchar(30) not null,
salary double not null,
resume longtext
);
2, 数据表删除
语法:drop table 表名;
3, 查看数据表结构
desc 表名; 查看表结构
show tables ; 查看当前库内所有表名
show create table 表名; 查看建表语句和字符集
4, 修改表
1) 修改表名: rename table 旧表名 to 新表名;
2) 增加列 语法: alter table 表名 add 列名 类型(长度) 约束;
3) 修改现有列类型、长度和约束:语法:alter table 表名 modify 列名 类型(长度) 约束;
4) 修改现有列名称:语法:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
5) 删除现有列:语法:alter table 表名 drop 列名 ;
5,数据库 CRUD 语句
(1)Insert 语句:使用 INSERT 语句向表中插入数据,语法如下:
INSERT INTO table [(column [, column…])]
VALUES (value [, value…]);
其中需要注意的有:插入的数据应与字段的数据类型相同;
数据的大小应在列的规定范围内,例如:不能将一个长度为 60 的字 符串加入到长度为 30 的列中。
在 values 中列出的数据位置必须与被加入的列的排列位置相对应。
字符和日期型数据应包含在单引号中。
插入空值:不指定或 insert into table values (null)
例如:插入一条中文记录
insert into employee(id,name,job,salary) values(1,’小明’,’医生’,1500);
出错了:
ERROR 1366 (HY000): Incorrect string value:‘\xC3\xF7’for column‘name’at row 1 ;
错误原因:mysql client 采用默认字符集编码 gbk
此时,查看系统所有字符集:show variables like‘character%’;
解决办法:修改客户端字符集为 gbk
第一种:当前窗口临时修改 set names gbk ; 只对当前窗口有效,关闭后就会失效
第二种:配置 mysql/my.ini 文件
[mysql] 客户端配置:修改客户端字符集 [mysql] 后字符集 default-character-set=gbk
[mysqld] 服务器端配置
MySQL 中共有 6 个地方字符集:client connetion result 是和客户端相关、database server system 是和服务器端相关:
client 是客户端使用的字符集。
connection 是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。
database 是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
results 是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
server 是服务器安装时指定的默认字符集设定。
system 是数据库系统使用的字符集设定(utf- 8 不可修改)
(2)Update 语句 :使用 update 语句修改表中数据。语法如下:
UPDATE tbl_name
SET col_name1=expr1 [, col_name2=expr2 …]
[WHERE where_definition]
注意点:
UPDATE 语法可以用新值更新原有表行中的各列。
SET 子句指示要修改哪些列和要给予哪些值。
WHERE 子句指定应更新哪些行。如没有 WHERE 子句,则更新所有的行。
(3)Delete 语句 :使用 delete 语句删除表中数据,语法如下:
delete from tbl_name
[WHERE where_definition]
注意点:
如果不使用 where 子句,将删除表中所有数据。
Delete 语句不能删除某一列的值(可使用 update)
使用 delete 语句仅删除记录,不删除表本身。如要删除表,使用 drop table 语句。
(4)Select 语句:基本语法如下:
SELECT [DISTINCT] *|{column1, column2. column3..}
FROM table;
其中:
select 指定查询哪些列的数据。
column 指定列名。
* 号代表查询所有列。
from 指定查询哪张表。
DISTINCT 可选,指显示结果时,是否剔除重复数据
注意点:
(1)在 select 语句中可使用表达式对查询的列进行运算
SELECT *|{column1|expression, column2|expression,..}
FROM table;
(2)在 select 语句中可使用 as 语句
SELECT column as 别名 from 表名;
(3)使用 where 子句,进行过滤查询
在 where 子句中经常使用的运算符:
Like 语句中,% 代表零个或多个任意字符,_ 代表一个字符。
举一些小例子:
查询英语分数在 90-100 之间的同学:select * from exam where english>=90 and english <= 100; 或者:select * from exam where english between 90 and 100;
查询数学分数为 65,75,85 的同学:select * from exam where math in(65,75,85);
查询所有姓赵的学生成绩:select * from exam where name like‘赵 %’;
查询英语分 >80,语文分 >80 的同学:select * from exam where english > 80 and chinese > 80;
查询语文没有成绩学生:select * from exam where chinese is null;
查询语文有成绩学生:select * from exam where chinese is not null;
(4)使用 order by 子句排序查询结果。
SELECT column1, column2. column3..
FROM table;
order by column asc|desc
其中:
Order by 指定排序的列,排序的列即既可以是表中的列名,也可以是 select 语句后指定的列名;
Asc 升序、Desc 降序;
ORDER BY 子句应位于 SELECT 语句的结尾。
(5)聚集函数-count:Count(列名)返回某一列,行的总数
Select count(*)|count(列名) from tablename
[WHERE where_definition]
例如:
统计一个班级共有多少学生?:select count(*) from exam;
统计英语成绩大于 90 的学生有多少个?:select count(*) from exam where english > 90;
统计总分大于 220 的人数有多少?:select count(*) from exam where chinese+math+english > 220;
(6)聚集函数-SUM:Sum 函数返回满足 where 条件的列的和(忽略 NULL),sum 仅对数值起作用,否则会报错。对多列求和时“,”号不能少。
Select sum(列名){,sum(列名)…} from tablename
[WHERE where_definition]
例如:
sum 统计某一列数据的和:select sum(列名) from 表名;
统计一个班级数学总成绩?:select sum(math) from exam;
统计一个班级语文、英语、数学各科的总成绩:select sum(chinese),sum(math),sum(english) from exam;
统计一个班级语文、英语、数学的成绩总和 select sum(chinese+math+english) from exam; 或者:select sum(chinese)+sum(math)+sum(english) from exam;
若有一个同学小明的语文 null,null 进行所有运算,结果都是 null:
select sum(chinese)+sum(math)+sum(english) from exam; 含有小明英语和数学成绩
select sum(chinese+math+english) from exam; 不含小明英语和数学成绩
使用 ifnull 函数处理 null 情况 :ifnull(xxx,0) 如果为 null,则值是 0
select sum(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam; 含有小明英语和数学成绩
统计一个班级语文成绩平均分:select sum(chinese)/count(*) from exam;
(7)聚集函数-AVG:AVG 函数返回满足 where 条件的一列的平均值
例如:
求一个班级数学平均分:select avg(math) from exam;
求一个班级总分平均分:select avg(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;
(8)聚集函数-MAX/MIN:Max/min 函数返回满足 where 条件的一列的最大 / 最小值。
Select max(列名) from tablename
[WHERE where_definition]
例如:
求班级最高分和最低分:select max(chinese+math+english),min(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;
(9)GROUP BY 子句:使用 group by 子句对列进行分组
可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的值,使用 having 子句 对分组结果进行过滤(Having 和 where 均可实现过滤,但在 having 可以使用聚集函数,having 通常跟在 group by 后,它作用于分组
)。
SELECT column1, column2. column3.. FROM table;
group by column having …
举例如下:
create table orders(
id int,
product varchar(20),
price float
);
insert into orders(id,product,price) values(1,’电视’,900);
insert into orders(id,product,price) values(2,’洗衣机’,100);
insert into orders(id,product,price) values(3,’洗衣粉’,90);
insert into orders(id,product,price) values(4,’桔子’,9);
insert into orders(id,product,price) values(5,’洗衣粉’,90);
对订单表中商品归类后,显示每一类商品的总价(需要按照商品名称进行分组):
select product,sum(price) from orders group by product;
查询购买了几类商品,并且每类总价大于 100 的商品:select product,sum(price) from orders group by product having sum(price) > 100;
注意:where 和 having 条件语句的区别?
where 是在分组前进行条件过滤,having 是在分组后进行条件过滤
使用 where 地方都可以用 having 替换,但是 having 可以使用分组函数,而 where 后不可以用分组函数。
使用 GROUP BY 时,SELECT 子句中只能由以下部分组成:
1,汇总函数
2,GROUP BY 中出现的列名
3,1 和 2 通过函数和表达式的结果
例如:
SELECT A_ID ,COUNT(*) FROM C GROUP BY A_ID; => 合法
SELECT A_DATE,COUNT(*) FROM C GROUP BY A_ID; => 不合法,按 A_ID 分组后,对于其他各列的查询只能是汇总查询,否则没有意义
小结 select 语句:S-F-W-G-H-O 组合 select … from … where … group by… having… order by … ; 它们的顺序不能改变
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-04/142601.htm