本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!