SQL概述:
发布日期:2021-07-22 10:54:23 浏览次数:1 分类:技术文章

本文共 6232 字,大约阅读时间需要 20 分钟。

sql概述:

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

sql的分类:

DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库,表,列等

DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)

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

DQL(Data Query Language):数据查询语言,用来查询记录(数据)。注意:sql语句以;结尾

DDL操作:操作数据库,表,列等

使用的关键字:CREATE,ALTER,DROP

对库的操作:

创建:

CREATE DATABASE mysql1;CREATE DATABASE mysql2 CHARACTER SET GBK

查询:

1.查看所有的数据库    SHOW DATABASE2.查看当前使用的数据库    SELECT DATABASE();

修改:

1.将当前的数据库的字符集改成utf8    ALTER DATABASES mydb1 CHARACTER SET utf8

删除:

1.删除指定的数据库    DROP DATABASES mydb1

切换:

USE mydb2;

对表的操作:

CREATE TABLE 表名(	字段1 字段类型    字段2 字段类型    ...    字段n 字段类型)CHARSET=UTF8;

常用的数据类型:

int:整型double:浮点型,例如double(5,2)表示最多5位,其中必须有两位小数,即最大值为999.99char(length):固定length长度的字符串类型varchar(length):可变长的字符串类型,length为最大长度,实际长度视情况而而定text:字符串类型blob:字节类型date:日期类型,格式为:yyyy-MM-dd;time:时间类型,格式为hh:mm:sstimestamp:时间戳类型,yyyy-MM-dd hh:mm:ss 会自动赋值datetime:日期时间类型 yyyy-MM-dd hh:mm:ssboolean:mysql不支持,oracle支持

常用操作(表):

1.查看当前数据库中所有的表:   SHOW DATABASES;2.查看表的信息:    DESC employee;3.在上面的员工表的基础上增加一个image列    ALTER TABLE employee ADD image blob;4.修改job列,使其长度变成60    ALTER TABLE employee MODIFY job varchar(60);5.删除表中的image列,一次只能删除一列    ALTER TABLE employee DROP image;6.表名修改为user    RENAME TABLE employee TO user;7.查看表格的创建细节    SHOW CREATE TABLE user;8.修改表的字符集为gbk    ALTER TABLE user CHARACTER SET gbk;9.列名name修改为username    ALTER TABLE user CHANGE name username varchar(100);10.备份表结构和表数据	CREATE TABLE tname2 like tname1;11.删除表    DROP TABLE user;

DML操作:

是对表中的数据进行的增,删,改的操作,

INSERT,UPDATE,DELETE小知识:在mysql中字符串类型和日期类型都要用单引号括起来。空值:null

插入操作:

INSERT INTO 表名(列名1,列名2,…) VALUES(内容1,内容2…); 注意:列名和列值的类型,个数,顺序要一一对应。

可以把列名当作java中的形参,把列值当作Java中的实参,值不要超过列定义的长度,如果插入控制,请使用null插入,和日期,字符一样,都是用单引号括起来

-- 插入操作-- 注意:在mysql中,字符串和日期类型的数据需要使用''括起来INSERT INTO teachers(id,`name`,age,entryDate,sex) VALUES('01','zhangsan',20,'2021-6-11','男');-- 如果值列表是全的,字段列表可以省略INSERT INTO teachers VALUES('02','lisi',21,'2021-5-12','女');-- 如果值列表信息不全时,必须要保证字段列表和值列表保持一致INSERT INTO teachers(id,`name`,age) VALUES('03','wangwu',22);-- 一次插入多条记录INSERT INTO teachers(id,`name`,age,entryDate,sex) VALUES('05','zhangsan1',21,'2021-6-11','女'),('06','zhangsan1',21,'2021-6-11','女'),('07','zhangsan1',21,'2021-6-11','女'),('08','zhangsan1',21,'2021-6-11','女');-- 第五种,将teacher中的数据插入到teacher1中CREATE TABLE teacher1(	id VARCHAR(10),	`name` VARCHAR(20),	age INT,	entryDate DATE,	sex VARCHAR(1))CHARSET=utf8-- select 列名 from 表名-- * 表示全部-- 表示将teachers表中的所有数据全部插入到teacher1中-- 注意:我们要保证插入的列与teacher1中的列数,类型保持一致INSERT INTO teacher1 SELECT * FROM teachers;

注意:

1.mysql不支持select into

2.在复制的时候,是按照列的顺序依次进行的

3.新表的列和原来表的列的名字,类型都可以不一样,照样复制成功,但是会出现数据类型转换错误,具体的:名字不一样,问题不大,类型不一样,出现错误,比如将int类型转换成varchar类型,会显示0;

修改操作:

语法:

UPDATE 表名 SET 列名1=值1,列名2=值2,… WHERE 列名=值

-- 修改操作-- 修改所有老师的某一栏信息UPDATE  teachers SET age = 20;-- 修改某位老师的某一栏信息UPDATE teachers SET age = 22 WHERE NAME = 'zhangsan';-- 修改某一位老师的多栏信息UPDATE teachers SET age = 40,id = '1001' WHERE NAME = 'zhangsan';-- 修改某一位老师的信息的某一栏信息(在原有的基础上进行改变)UPDATE teachers SET age = age +10 WHERE NAME  = 'lisi';

删除操作:

DELETE FROM 表名 【WHERE 列名 = 值】;

-- 删除操作-- 删除表中的某一行记录DELETE FROM teachers WHERE NAME = 'zhangsan1';-- 删除表中所有的记录DELETE FROM teacher;-- 使用truncate删除表中的记录TRUNCATE TABLE teacher;

TRUNCATE和DELETE的区别:

DELETE删除表中的数据表结构还存在,删除的数据可以找回,TRUNCATE删除是把表直接DROP掉,然后再创建一个同样的新表,TRUNCATE删除的数据不能找回(这里找回的意思是回滚),执行速度比DELETE快

DQL操作:

数据库执行的DQL语句不会对数据进行改变,而是让数据库发送结果给客户端 ,查询返回的结果是一张虚拟表。

语法:

SELECT 列名 FROM 表名

语法说明:

SELECT 列名:要查询的列名称FROM 表名:要查询的表名称WHERE condition:行条件GROUP BY grouping_colunms:对结果进行分组HAVING condition:分组后的行条件OEDER BY sorting_columns:对结果进行排序LIMIT offset_start,row_count:对结果进行限定

基础查询

-- 1.查询所有的列SELECT * FROM student;-- 2.查询部分的列SELECT sid,age,gender FROM student;

条件查询

语法:

条件查询就是在查询时给出where子句,在where子句中可以使用如下运算符以及关键字

where查询常用的条件

查询条件 谓词
比较 =,<,>,>=,<=,!=,<>(不等于),!<(不小于),!>,NOT+以上比较运算符
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,IS NOT NULL
多重条件(逻辑运算) AND,OR,NOT
-- 条件查询SELECT * FROM student WHERE gender = 'female' AND age < 50;SELECT * FROM student WHERE sid = 'S_1001' OR sname = 'liSi'; SELECT * FROM student WHERE sid IN('S_1001','S_1002','S_1003');

模糊查询

语法:

当想查询,姓名中包含了a字母的学生就需要使用模糊查询了,模糊查询需要使用的关键字为LIKE

通配符:

_ : 任意一个字母

% :任意0-n个字母

SELECT * FROM student WHERE sname LIKE '_____';SELECT * FROM student WHERE sname LIKE 'l%i';

字段控制查询:

-- 去除重复记录(去除重复记录需要使用distinct关键字)SELECT DISTINCT gender FROM student;SELECT DISTINCT salary FROM employee; -- 转换NULL值SELECT ename,salary+IFNULL(comm,0) FROM employee;-- 给列名添加别名SELECT *, IFNULL(comm,0)+salary AS total FROM employee;

sql中的注意点

1.在sql中对列的数据进行运算时,只有数据类型相同的数据才能运算,如果类型不一样,那么会出错

2.在sql中任何数据与NULL相加的结果还是NULL,所以我们需要使用IFNULL(列名,parameter1)函数,这个函数可以将NULL转换我们指定的值;

排序:

-- 查询所有学生的记录,并按年龄升序排列SELECT * FROM student ORDER BY age ASC;-- 查询所有学生的记录,并按照年龄降序排列SELECT * FROM student ORDER BY age DESC;-- 不指定排序规则,默认按照升序排列SELECT * FROM student ORDER BY age;-- 多层排序规则SELECT * FROM employee ORDER BY salary DESC,empno ASC;

聚合函数:

聚合函数是用来做纵向运算的函数:

COUNT():统计指定列不为null的记录行数(count([distinct/all] <列名>))

MAX():计算指定列的最大值,如果指定列为字符串类型,那就按字符串的字典排序运算

MIN();计算指定列的最小值

SUM():计算指定列的数值和,如果数据类型不是数值类型,那么计算结果为0

AVG();计算指定列的平均值

注意:where子句中是不能用聚集函作为条件表达式的,聚合函数只能用于select子句或者group by中的having子句中

-- count()SELECT COUNT(*) FROM employee;SELECT COUNT(comm) FROM employee;-- min()/max()SELECT MAX(salary) FROM employee;SELECT MIN(ename) FROM employee;SELECT MAX(salary),MIN(salary) FROM employee;-- sum()/avg()SELECT SUM(salary) FROM employee;SELECT SUM(comm) FROM employee;SELECT  AVG(salary) FROM employee;

分组查询:

分组查询需要使用GROUP BY

和聚合函数同时出现的列名,一定要写在group by之后

-- 分组查询-- 查询每个部门的部门编号和每个部门的工资和:SELECT deptno,SUM(salary) FROM employee GROUP BY deptno;SELECT SUM(salary) FROM employee GROUP BY deptno;SELECT deptno FROM employee GROUP BY deptno;-- HAVING子句-- 查询工资总和大于9000的部门编号以及工资和:SELECT deptno,SUM(salary) FROM employee GROUP BY deptno  HAVING SUM(salary) > 9000;
注意:having和where的区别1.having是在分组之后对数据进行过滤,但是where是在分组之前对数据进行过滤2.having后面可以使用分组函数(聚合函数),where后面不可以使用分组函数(聚合函数)3.where是对分组前记录的条件,如果某行记录没有满足where子句么这行记录不会参与分组;二having是对分组后数据的约束

Limit

limit用来限定查询结果的起始行,以及总行数

SELECT * FROM employee LIMIT 0,5;SELECT * FROM employee LIMIT 3,10;
查询语句书写顺序:select > from > where > group by > having > order by > limit查询语句执行顺序:from > where > group by > having > select > order by > limit

转载地址:https://blog.csdn.net/m0_56433040/article/details/117917758 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SQL高级:
下一篇:IO流高级

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月19日 13时37分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章