SQL语言简介

SQL:Structure Query Language(结构化查询语言)

  • 各数据库厂商都支持ISOSQL标准

  • 各数据库厂商在标准的基础上做了自己的扩展

SQL 是一种标准化的语言,它允许你在数据库上执行操作,如创建项目Create,查询内容Read,更新内容Update,和删除条目Delete等,通常称为CRUD操作。

SQL语句分类:

  • DDLData Defifinition Language):数据定义语言,用来定义数据库对象:库、表、列等。

  • DMLData Manipulation Language):数据操作语言,用来定义数据库记录(数据)增删改。

  • DCLData Control Language):数据控制语言,用来定义访问权限和安全级别。

  • DQLData 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。
语法 :
列名 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 分组查询

当需要分组查询时需要使用 GROUP BY 子句,例如查询每个部门的工资和,这要使用部门来分组。
注意 : 如果查询语句中有分组操作,则 select 后面能添加的只能是聚合函数和被分组的列名
1)分组查询示例
//查询每个部门的部门编号和每个部门的工资和
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;
havingwhere的区别:
  • having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
  • having后面可以使用聚合函数 ,where后面不可以使用聚合函数。

(WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。

3) 多列分组

字面意思,先按一列进行分组,分出来的组再按一列进行分组

//统计出student表中每个班级的男女生各多少人
select gradename,gender,count(*) from student group by gradename,gender;

4.7 limit

LIMIT 用来限定查询结果的起始行,以及总行数。
语法:
  • limit 开始下标,显示条数;//开始下标从0开始
  • limit 显示条数;//表示默认从0开始获取数据
//查询5行记录,起始行从0开始
SELECT * FROM employ LIMIT 0, 5;

//查询10行记录,起始行从3开始
SELECT * FROM employ LIMIT 3, 10;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值