SQL:Structure Query Language(结构化查询语言)
-
各数据库厂商都支持ISO的SQL标准
-
各数据库厂商在标准的基础上做了自己的扩展
SQL 是一种标准化的语言,它允许你在数据库上执行操作,如创建项目Create,查询内容Read,更新内容Update,和删除条目Delete等,通常称为CRUD操作。
SQL语句分类:
-
DDL(Data Defifinition Language):数据定义语言,用来定义数据库对象:库、表、列等。
-
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)增删改。
-
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别。
-
DQL(Data Query Language):数据查询语言,用来查询记录(数据)查询。
SQL中的运算符:
- 算术运算符:+,-,*,/(除法),求余(%)
- 赋值运算符:=
- 逻辑运算符: and(并且),or(或者),not(取非)
- 关系运算符:>,<,>=,<=,!=(不等于),=(等于),<>(不等于)
语句规范:
- SQL语句以;结尾
- mysql中的关键字不区分大小写
1.DDL——数据定义语言,用来定义数据库对象:库、表、列等
1.1DDL操作数据库
1)创建数据库
//create database 数据库名
CREATE DATABASE mydb1;
//create database 数据库名 character set 编码方式
//编码方式:gb2312,utf-8,gbk,iso-8859-1
CREATE DATABASE mydb2 character SET GBK;
//create database 数据库名 set 编码方式 collate 排序规则
CREATE DATABASE mydb3 character SET GBK COLLATE gbk_chinese_ci;
2)查看数据库
//查看当前数据库服务器中所有数据库
show database;
//查看创建的某个数据库的定义信息 show create database 数据库名;
show create database mydb1;
3)修改数据库
//alter database 数据库名 character set 编码方式
ALTER DATABASE mydb2 character SET utf8;
4)删除数据库
drop database mydb1;
5)其他语句
//查看当前使用的数据库
select database();
//切换数据库:use 数据库名;
use mydb2;
1.2 DDL操作表
1)创建新表
CREATE TABLE 表名(
列名1 数据类型 [约束],
列名2 数据类型 [约束],
列名n 数据类型 [约束]
);
//表名,列名是自定义,多列之间使用逗号间隔,最后一列的逗号不能写;
//[约束]可有可无。
CREATE TABLE Employees(
id INT,
age INT,
first VARCHAR(255),
last VARCHAR(255)
);
常用数据类型:
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
2)删除表
drop table 表名;
3)显示当前数据库中的所有表
show tables;
4)查看表的字段信息
desc 表名;
5)修改表名
//alter table 旧表名 rename 新表名;
alter table user rename users;
6)查看表格的创建细节
//show create table 表名;
SHOW CREATE TABLE user;
7)修改表的编码方式
//alter table 表名 character set 编码方式
ALTER TABLE user CHARACTER SET gbk;
1.3 DDL操作列
1)增加列
//alter table 表名 add 新列名 新的数据类型
ALTER TABLE employee ADD image blob;
2)修改列
//modify只能修改属性 change也可以修改名称
//alter table 表名 MODIFY 列名 新的数据类型
//alter table 表名 change 旧列名 新列名 新的数据类型
ALTER TABLE employee MODIFY name varchar(60);
ALTER TABLE employee change name employname varchar(60);
3)删除列
//alter table 表名 drop 列名
ALTER TABLE employee DROP image;
2.DML——数据操作语言,用来定义数据库记录(数据)增删改
DML是对表中的数据进行增、删、改的操作。主要包括:INSERT 、UPDATE、 DELETE。
(在mysql中,非数值的列值两侧需要加单引号)
2.1 INSERT
//insert into 表名(列名) values(数据值);
//不同列名和不同列值之间使用逗号隔开
//列名要和列值一一对应
insert into student (stuname,stuage,stusex,birthday) values('张三1',18,'a','2000- 1-1');
当给所有列添加数据时,可以将列名省略,此时的列名默认按照数据表中列的顺序执行。如果插入空值,请使用null。
insert into student values('李四',12,'1111',189.98,'2000-1-1','男','2007-1-1');
同时添加多行数据时:
//insert into 表名(列名) values(第一行数据),(第二行数据),(),();
insert into student(stuname,stuage,stusex,birthday)
values('张三3',18,'a','2000-1-1'),
('张三4',18,'a','2000-1-1'),
('张三5',18,'a','2000-1-1'),
('张三6',18,'a','2000-1-1'),
('张三7',18,'a','2000-1-1'),
('张三8',18,'a','2000-1-1');
2.2 UPDATE
//UPDATE 表名 SET 列名1=列值1,列名2=列值2 ... WHERE 列名=值
update employ set salary=salary+1000,resume='byebye' where name='zhangsan' and birthday='1990-5-10';
2.3 DELETE
//DELETE from 表名 [WHERE 列名=值];
//TRUNCATE from 表名 [WHERE 列名=值];
//[] 表示where可有可无 没有就表示删除表中所有数据
delete from employ where name='zhangsan';
- DELETE 删除表中的数据,表结构还在;删除后的数据可以找回
- TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快。
3.DCL——数据控制语言,用来定义访问权限和安全级别
1)创建用户
//create user 用户名@客户端ip identified by 密码; 指定IP才能登陆
create user test456@10.4.10.18 IDENTIFIED by 'test456';
//create user 用户名@‘% ’ identified by 密码 任意IP均可登陆
create user test@'%' IDENTIFIED by 'test';
2)用户授权
//grant 权限1,权限2,...,权限n on 数据库名.* to 用户名@IP;
//给指定用户授予指定指定数据库指定权限
grant select,insert,update,delete,create on mydb1.* to 'test456'@'127.0.0.1';
//grant all on . to 用户名@IP 给指定用户授予所有数据库所有权限
grant all on *.* to 'test456'@'127.0.0.1'
3)用户权限查询
//show grants for 用户名@IP; %表示匹配所有主机
show grants for 'root'@'%';
4)撤销用户权限
//revoke 权限1,权限2,...,权限n on 数据库名.* from 用户名@IP;
REVOKE SELECT ON *.* FROM 'root'@'%' ;
5)删除用户
//drop user 用户名@IP;
drop user test123@localhost;
4.DQL——数据查询语言,用来查询记录(数据)查询
//SELECT 列名 FROM 表名 [WHERE --> BROUP BY-->HAVING--> ORDER BY]
//[]表示其中内容可有可无
SELECT 要查询的列名称 FROM 表名称
WHERE 限定条件 /*行条件*/
GROUP BY grouping_columns /*对结果分组*/
HAVING condition /*分组后的行条件*/
ORDER BY sorting_columns /*对结果排序*/
LIMIT offset_start, row_count /*结果限定*/
4.1 条件查询示例
//条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:=、!=、<>、<、<=、>、>=; BETWEEN…AND; IN(set); IS NULL; AND;OR; NOT;
//查询所有列
SELECT * FROM stu;
//查询指定列
SELECT sid, sname, age FROM stu;
//查询性别为女,并且年龄50以内的记录
SELECT * FROM stu WHERE gender='female' AND age<50;
//查询学号为S_1001,S_1002,S_1003的记录
SELECT * FROM stu WHERE sid IN ('S_1001','S_1002','S_1003');
//查询学号不是S_1001,S_1002,S_1003的记录
SELECT * FROM tab_student WHERE sid NOT IN('S1001','S1002','S_1003');
//查询年龄为null的记录
SELECT * FROM stu WHERE age IS NULL;
//查询年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
SELECT * FROM stu WHERE age>=20 AND age<=40;
//查询性别非男的学生记录
SELECT * FROM stu WHERE gender!='male';
SELECT * FROM stu WHERE gender<>'male';
SELECT * FROM stu WHERE NOT gender='male';
4.2 模糊查询
列名 like '表达式' //表达式必须是字符串
_(下划线): 任意一个字符
%:任意0~n个字符,'张%'
示例:
//查询姓名由3个字构成的学生记录
SELECT * FROM stu WHERE sname LIKE '___';
//查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '____i';
//查询姓名以“z”开头的学生记录
SELECT * FROM stu WHERE sname LIKE 'z%';
//查询姓名中包含“a”字母的学生记录
SELECT * FROM stu WHERE sname LIKE '%a%';
4.3 字段控制查询
1) 去除重复记录
比如当我们想要查询员工的性别时,只有男女的区分,但是查询出来的表中会出现很多数据,那么想去除重复记录,需要使用DISTINCT关键字:
SELECT DISTINCT sex FROM employ;
2) 查看某几列数据之和
当某n列的数据类型都是数值时可以进行加法运算。
SELECT sal+comm FROM employ;
但是如果上文的sal或者comm列中存在null值的话,二者相加还是NULL,所以我们需要一个将null转换为0的函数:IFNULL()
SELECT sal+IFNULL(comm,0) FROM employ;
3) 给列添加别名
比如上文中查询出来的列名为sal+IFNULL(comm,0),这很不美观,所以会给该列起一个别名total:
SELECT sal+IFNULL(comm,0) [AS] total FROM emp;
//同样as关键字是可以省略的
4.4 排序
语法:
order by 列名 asc/desc;
//asc 升序 desc 降序 默认不写的话是升序
示例:
//查询所有学生记录,按年龄升序排序
SELECT * FROM student ORDER BY age ASC;
//查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
//多列排序:当前面的列的值相同的时候,才会按照后面的列值进行排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;
4.5 聚合函数
- COUNT(列名):统计指定列不为NULL的记录行数;
- MAX(列名):计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
- MIN(列名):计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
- SUM(列名):计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
- AVG(列名):计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
//查询employ表中记录数
SELECT COUNT(*) as cnt FROM employ;
//查询emp表中有佣金的人数:
SELECT COUNT(comm) cnt FROM employ;
//查询emp表中月薪大于2500的人数
SELECT COUNT(*) FROM employ WHERE sal > 2500;
//查询有佣金的人数,以及有领导的人数
SELECT COUNT(comm), COUNT(mgr)FROM employ;
//查询所有雇员月薪和,以及所有雇员佣金和
SELECT SUM(sal), SUM(comm) FROM employ;
//统计所有员工平均工资
SELECT AVG(sal) FROM employ;
//查询最高工资和最低工资
SELECT MAX(sal), MIN(sal) FROM employ;
4.6 分组查询
//查询每个部门的部门编号和每个部门的工资和
select deptno,sum(sal) from employ group by deptno;
//查询每个部门的部门编号以及每个部门的人数
SELECT deptno,COUNT(*) FROM employ GROUP BY deptno;
//查询每个部门的部门编号以及每个部门工资大于1500的人数
SELECT deptno,COUNT(*) FROM employ WHERE sal>1500 GROUP BY deptno;
2) having语句
having语句是对分组后的数据进行限定,having出现一定有group by的出现
//查询工资总和大于9000的部门编号以及工资和
SELECT deptno, SUM(sal) FROM employ GROUP BY deptno HAVING SUM(sal) > 9000;
- having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
- having后面可以使用聚合函数 ,where后面不可以使用聚合函数。
(WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。)
3) 多列分组
字面意思,先按一列进行分组,分出来的组再按一列进行分组
//统计出student表中每个班级的男女生各多少人
select gradename,gender,count(*) from student group by gradename,gender;
4.7 limit
- limit 开始下标,显示条数;//开始下标从0开始
- limit 显示条数;//表示默认从0开始获取数据
//查询5行记录,起始行从0开始
SELECT * FROM employ LIMIT 0, 5;
//查询10行记录,起始行从3开始
SELECT * FROM employ LIMIT 3, 10;