SQL语言

 

SQL语言

概述

SQL Structure Query Language (结构化查询语言), SQL 被美国国家标准局( ANSI )确定为关 系型数据库语言的美国标准,后来被国际化标准组织(ISO )采纳为关系数据库语言的国际标准。
各数据库厂商都支持 ISO SQL 标准, 普通话
各数据库厂商在标准的基础上做了自己的扩展, 方言
SQL 是一种标准化的语言,它允许你在数据库上执行操作,如创建项目,查询内容,更新内容, 并删除条目等操作。
Create, Read, Update, and Delete 通常称为 CRUD 操作。

SQL语句分类

  • DDLData Defifinition Language):数据定义语言,用来定义数据库对象:库、表、列等。
  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)增删改。
  • DCLData Control Language):数据控制语言,用来定义访问权限和安全级别。
  • DQLData Query Language):数据查询语言,用来查询记录(数据)查询。
注意: sql 语句以 ; 结尾 , mysql 中的关键字不区分大小写

DDL操作数据库

1.创建

CREATE DATABASE语句用于创建新的数据库: 编码方式:gb2312,utf-8,gbk,iso-8859-1
 
//create database 数据库名 
CREATE DATABASE mydb1; 
//create database 数据库名 character set 编码方式 
CREATE DATABASE mydb2 character SET GBK; 
//create database 数据库名 set 编码方式 collate 排序规则 
CREATE DATABASE mydb3 character SET GBK COLLATE gbk_chinese_ci;

2 查看数据库

查看当前数据库服务器中的所有数据库
show databases;


//查看前面创建的mydb2数据库的定义信息
//show create database 数据库名; 
Show CREATE DATABASE mydb2;

3 修改数据库

查看服务器中的数据库,并把 mydb2 的字符集修改为 utf8;
//alter database 数据库名 character set 编码方式
ALTER DATABASE mydb2 character SET utf8;

4 删除数据库

//drop database 数据库名
DROP DATABASE mydb3;

5 其他语句

查看当前使用的数据库
Select database();
切换数据库 : use 数据库名
USE mydb2;

DDL操作表

CREATE TABLE 语句用于创建新表。
语法:
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

其他表操作

当前数据库中的所有表:

//drop table 表名;

DROP TABLE table_name;

 当前数据库中的所有表

//show tables;

SHOW TABLES;

 查看表的字段信息

//desc 表名;
DESC employee;

 增加列:在上面员工表的基本上增加一个image列。

//alter table 表名 add 新列名 新的数据类型
ALTER TABLE employee ADD image blob;

修改列,修改job列,使其长度为60

//alter table 表名 change 旧列名 新列名 新的数据类型

ALTER TABLE employee MODIFY job varchar(60); 
ALTER TABLE employee change job job varchar(60);
改列名,列名 name 修改为 username
ALTER TABLE user CHANGE name username varchar(100);
删除列,删除 image , 一次只能删一列。
//alter table 表名 drop 列名
ALTER TABLE employee DROP image;
改表名 , 表名改为 user
//alter table 旧表名 rename 新表名;
alter table user rename users;
查看表格的创建细节
 //show create table 表名;
SHOW CREATE TABLE user;
修改表的字符集为 gbk
 //alter table 表名 character set 编码方式;
ALTER TABLE user CHARACTER SET gbk;
练习:
表名 card( 会员卡表 )
列名 数据类型
cardid int
cardnum varchar(20)
regDate date
需求:
(1) 创建该表
(2) card 表名修改为 CardInfo
(3) 添加 delDate( 注销时间 ) 列到表中
(4) cardnum 改为 varchar(30)
(5) 删除 regDate
(6) 删除 cardInfo

DML操作

DML 是对表中的数据进行增、删、改的操作。不要与 DDL 混淆了。
主要包括: INSERT UPDATE DELETE
小知识: 在mysql 中,字符串类型和日期类型都要用单引号括起来。
空值: null
1.插入操作:INSERT:
//insert into 表名(列名) values(数据值);

insert into student(stuname,stuage,stusex,birthday) values('张三1',18,'a','2000- 1-1');


//将列名省略->当给所有列添加数据的时候列值的顺序按照数据表中列的顺序执行
insert into student values('李四',12,'1111',189.98,'2000-1-1','男','2007-1-1');
注意:1.多列和多个列值之间使用逗号隔开 2.列名要和列值一一对应
  • 非数值的列值两侧需要加单引号 常见错误: Data too long for column 'stusex' at row 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');
注意:列名与列值的类型、个数、顺序要一一对应参数值不要超出列定义的长度。 如果插入空值,请使用null 插入的日期和字符一样,都使用引号括起来。

 

sql中的运算符:

算术运算符 :+ - * /( 除法 ), 求余 (%)
赋值运算符 :=
逻辑运算符: and(并且 ),or( 或者 ),not (取非)
关系运算符: >,<,>=,<=,!=(不等于 ),=( 等于 ),<>( 不等于 )
 
 
2.修改(更新)操作:UPDATE:
 
语法:
UPDATE 表名 SET 列名1=列值1,列名2=列值2 ... WHERE 列名=值
3.删除操作:DELETE:
 
语法 :
DELETE from 表名 WHERE 列名=值
  1. DELETE 删除表中的数据,表结构还在;删除后的数据可以找回
  2. TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。
  3. 删除的数据不能找回。执行速度比DELETE快。  
小结 :
为空的条件:列名 is null or 列名 =''
: 两个单引号表示空字符串
日期类型值的区别:
date yyyy-MM-dd (年月日)
time hh:mm:ss ( 时分秒 )
datetime:yyyy-MM-dd hh:mm:ss ( 年月日时分秒 )
获取当前系统时间 :now()
select now();

DCL

1.创建用户:
//create user 用户名@指定ip identifified by 密码;
create user test123@localhost IDENTIFIED by 'test123';

//create user 用户名@客户端ip identified by 密码; 指定IP才能登陆
create user test456@10.4.10.18 IDENTIFIED by 'test456;

//create user 用户名@‘% ’ identified by 密码 任意IP均可登陆;
create user test7@'%' IDENTIFIED by 'test7';
2.用户授权:
//grant 权限1,权限2,........,权限n on
数据库名.* to 用户名@IP; 给指定用户授予指定指定数据库指定权限
grant select,insert,update,delete,create on chaoshi.* 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;
 

DQL数据查询

DQL 数据查询语言(重要)
数据库执行 DQL 语句不会对数据进行改变,而是让数据库发送结果集给客户端。
查询返回的结果集是一张虚拟表。
查询关键字:SELECT
语法:
//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 /*结果限定*/
示例操作:
1>创建学生表并添加数据
//创建表stu
CREATE TABLE stu ( sid CHAR(6), sname VARCHAR(50), age INT, gender VARCHAR(50) );


//添加数据 
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male'); 
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female'); 
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male'); 
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female'); 
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male'); 
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female'); 
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male'); 
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female'); 
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male'); 
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female'); 
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
2>创建雇员表并添加数据
 
 
//创建雇员表 

CREATE TABLE emp2(
empno INT,
ename VARCHAR(50), 
job VARCHAR(50), 
mgr INT, 
hiredate DATE, 
sal DECIMAL(7,2), 
comm decimal(7,2), 
deptno INT
) ; 

//添加数据 
INSERT INTO emp2 values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp2 values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp2 values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30); 
INSERT INTO emp2 values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20); 
INSERT INTO emp2 values(7654,'MARTIN','SALESMAN',7698,'1981-09- 28',1250,1400,30); 
INSERT INTO emp2 values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30); 
INSERT INTO emp2 values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); 
INSERT INTO emp2 values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20); 
INSERT INTO emp2 values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp2 values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); 
INSERT INTO emp2 values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
3>创建部门表并添加数据
//创建部门表
CREATE TABLE dept( deptno INT, dname varchar(14), loc varchar(13) );

//添加数据 
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK'); 
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS'); 
INSERT INTO dept values(30, 'SALES', 'CHICAGO'); 
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');

简单查询

条件查询就是在查询时给出 WHERE 子句,在 WHERE 子句中可以使用如下运算符及关键字:
=、!=、<>、<、<=、>、>=; BETWEEN…AND; IN(set); IS NULL; AND;OR; NOT;
 
(1) 查询性别为女,并且年龄 50 以内的记录
SELECT * FROM stu WHERE gender='female' AND age<50;
(2) 查询学号为 S_1001 ,或者姓名为 liSi 的记录
SELECT * FROM stu WHERE sid ='S_1001' OR sname='liSi';
(3) 查询学号为 S_1001 S_1002 S_1003 的记录
//列名 in (列值1,列值2)
SELECT * FROM stu WHERE sid IN ('S_1001','S_1002','S_1003');
(4) 查询学号不是 S_1001 S_1002 S_1003 的记录
SELECT * FROM tab_student WHERE sid NOT IN('S1001','S1002','S_1003');
(5) 查询年龄为 null 的记录
SELECT * FROM stu WHERE age IS NULL;
(6) 查询年龄在 20 40 之间的学生记录
SELECT * FROM stu WHERE age>=20 AND age<=40;

//或者:列名 between 开始值 and 结束值;
//注意:1.开始值<结束值 2.包含临界值的
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
(7) 查询性别非男的学生记录
SELECT * FROM stu WHERE gender!='male';

SELECT * FROM stu WHERE gender<>'male';

SELECT * FROM stu WHERE NOT gender='male';
(8) 查询姓名不为 null 的学生记录
SELECT * FROM stu WHERE NOT sname IS NULL;

SELECT * FROM stu WHERE sname IS NOT NULL;

模糊查询

当想查询姓名中包含 a 字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字 LIKE
语法 : 列名 like ' 表达式 ' // 表达式必须是字符串
通配符 : _(下划线 ): 任意一个字符                %:任意 0~n 个字符
 
(1) 查询姓名由 3 个字构成的学生记录
SELECT * FROM stu WHERE sname LIKE '___';
//tips:模糊查询必须使用LIKE关键字。其中 “”匹配任意一个字,3个“”表示3个任意字。
(2) 查询姓名由 5 个字母构成,并且第 5 个字母为 “i” 的学生记录
SELECT * FROM stu WHERE sname LIKE '____i';
(3) 查询姓名以 “z” 开头的学生记录
SELECT * FROM stu WHERE sname LIKE 'z%';
//其中“%”匹配0~n个任何字母。
(4) 查询姓名中第 2 个字母为 “i” 的学生记录
SELECT * FROM stu WHERE sname LIKE '_i%';
(5) 查询姓名中包含 “a” 字母的学生记录
SELECT * FROM stu WHERE sname LIKE '%a%';

 字段控制查询

去除重复记录
去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如 emp 表中 sal 字段就存在相同的 记录。当只查询emp 表的 sal 字段时,那么会出现重复记录,那么想去除重复记录,需要使用 DISTINCT:
SELECT DISTINCT sal FROM emp;
查看雇员的月薪与佣金之和
因为 sal comm 两列的类型都是数值类型,所以可以做加运算。如果 sal comm 中有一个字段不
是数值类型,那么会出错。
SELECT *,sal+comm FROM emp;
comm 列有很多记录的值为 NULL ,因为任何东西与 NULL 相加结果还是 NULL ,所以结算结果可能会出
NULL 。下面使用了把 NULL 转换成数值 0 的函数 IFNULL
SELECT *,sal+IFNULL(comm,0) FROM emp;
给列名添加别名
在上面查询中出现列名为 sal+IFNULL(comm,0) ,这很不美观,现在我们给这一列给出一个别名,为
total
SELECT *, sal+IFNULL(comm,0) AS total FROM emp

//给列起别名时,是可以省略AS关键字的:
SELECT *,sal+IFNULL(comm,0) total FROM emp;

排序

语法:
order by 列名 asc/desc, asc 升序 desc 降序 默认不写的话是升序
(1) 查询所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age ASC;

SELECT * FROM stu ORDER BY age;
(2) 查询所有学生记录,按年龄降序排序
 
SELECT * FROM stu ORDER BY age DESC;
(3) 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序。多列排序:当前面的列的值相同的时候,才会按照后面的列值进行排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;

聚合函数

聚合函数是用来做纵向运算的函数:
COUNT( 列名 ) :统计指定列不为 NULL 的记录行数;
MAX( 列名 ) :计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN( 列名 ) :计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM( 列名 ) :计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为 0
AVG( 列名 ) :计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为 0
(1) COUNT : 当需要纵向统计时可以使用COUNT()
//查询emp表中记录数:
SELECT COUNT(*) AS cnt FROM emp;

//查询emp表中有佣金的人数:
SELECT COUNT(comm) cnt FROM emp;
//注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数

//查询emp表中月薪大于2500的人数:
SELECT COUNT(*) FROM emp WHERE sal > 2500;

//统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) AS cnt FROM empWHERE sal+IFNULL(comm,0) > 2500;

//查询有佣金的人数,以及有领导的人数:
SELECT COUNT(comm), COUNT(mgr)FROM emp;

(2) SUMAVG:当需要纵向求和时使用sum()函数。

//查询所有雇员月薪和:
SELECT SUM(sal) FROM emp;

//查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal), SUM(comm) FROM emp;

//查询所有雇员月薪+佣金和:
SELECT SUM(sal+IFNULL(comm,0))FROM emp;

//统计所有员工平均工资:
SELECT AVG(sal) FROM emp;

(3) MAXMIN:

//查询最高工资和最低工资:
SELECT MAX(sal), MIN(sal) FROM emp;

分组查询

分组查询

当需要分组查询时需要使用GROUP BY 子句,例如查询每个部门的工资和,这说明要使用部分来分组。
注意 : 如果查询语句中有分组操作,则 select 后面能添加的只能是聚合函数和被分组的列名
示例:
//查询每个部门的部门编号和每个部门的工资和:
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;

//查询每个部门的部门编号以及每个部门的人数:
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;

//查询每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;

HAVING子句

注: having where 的区别 :
1.having 是在分组后对数据进行过滤 ,where 是在分组前对数据进行过滤
2.having 后面可以使用分组函数 ( 统计函数 )
where 后面不可以使用分组函数。
WHERE 是对分组前记录的条件,如果某行记录没有满足 WHERE 子句的条件,那么这行记录不会参加分
组;而 HAVING 是对分组后数据的约束。
//查询工资总和大于9000的部门编号以及工资和:
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;

//补充: 多列分组-- 统计出stu表中每个班级的男女生各多少人
 select gradename,gender ,count(*) from stu group by gradename,gender;

LIMIT

LIMIT 用来限定查询结果的起始行,以及总行数。
limit 开始下标 , 显示条数; // 开始下标从 0 开始
limit 显示条数; // 表示默认从 0 开始获取数据
//1.查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;
//注意,起始行从0开始,即第一行开始!


//2.查询10行记录,起始行从3开始:
SELECT* FROM emp LIMIT 3, 10;
分页查询
 

如果一页记录为10条,希望查看第3页记录应该怎么查呢?

//第一页记录起始行为0,一共查询10行; limit 0,10
//第二页记录起始行为10,一共查询10行;limit 10,10
//第三页记录起始行为20,一共查询10行; limit 20,10

limit (pageindex-1)*pagesize,pagesize;

//pageIndex 页码值 pageSize 每页显示条数



//查询语句书写顺序:select – from- where- groupby- having- order by-limit
//查询语句执行顺序:from - where -group by -having - select - order by-limit

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值