关于SQL语言:
字符集
字符集的由来
- 计算机只能识别二进制代码无论是计算机程序还是数据,最终都会转换成二进制,计算机才能认识。
- 为了计算机不只能做科学计算,也能处理文字信息。
人们想出了给每一个文字符号编码以便于计算识别处理的办法,这就是计算机字符集的由来。
ASSCII
一套文字符号及其编码,比较规则 的集合。
- 20世纪60年代初。美国标准化组织ANSI发布了第一个字符集。ASCII
- 后来又进一步变成了国际标准ISO-646
各大字符集
自ASCII后。为了处理不同的文字。各大计算机公司,各国,标准化政府,组织先后发明了几百种字符集。
- ISO-8859
- GB2312-80
- GBK
- BIG5
这些五花八门的字符集从收录的字符集到编码规则各不相同。给计算机软件开发和移值带来了很大的困难。
一个软件要在使用不同文字的国家和地区发布,必须得要做本地化开发。
- 基于这个原因,要统一字符编码。
unicode
- 为了统一字符编码。国际标准化组织ISO的一些成员国于1984年发起制定了新的国际字符集标准。容纳全世界各种语言,文字,和 符号。最后产生了这个标准ISO-10646
- ISO-10646发布后,遭到了美国计算机公司的反对。
- 1988年,Xerox公司提议制定了新的以16位编码人统一字符集。并联合了Apple,IBM,SUN,Microsoft等公司成立了Unicode技术委员会。专门负责收集,整理,和编码。于1991年推出了Unicode1.0
- 针对字符编码统一问题,ISO和Unicode协会推出了各自不同的标准。这显然是不利的。后来双方开始谈判。1991年10月达成协议。ISO将Unicode收编。起了个名BMP
UTF-16
- ISO-10646编码空间足以容纳从古自今使用过的文字和字符。但很多文字字符已经很少用了。
超过99%的在用文字字符都编入了BMP.因此,绝大部分情况下,Unicode双字节方式都能满足需求。
而且比双字节编码方式4字节原始编码来说,更节省内存和处理时间 。这也是Unicode流行的原因。 - 万一使用了BMP以外的文字怎么办?
Unicode提出了UTF-16的解决办法。
UTF-8
- 虽然UTF-16解决了上面问题。但当时的计算机和网络世界还是ASCII的天下。只能处理单字节数据流。UTF-16离开了Unicode环境后。在传输和处理中,都存在问题。
- 于是又提出了UTF-8的解决文案,
- UTF-8按一定的规则,将一个ISO10646或Unicode转换成1至4个字节的编码
- 其中ASCII转成单字节编码。也就严格兼容了ASCII字符集。
- UTF-8的2,3,4字节用以转换ISO-10646标准的UCS-4原始码。
汉字的一些常见字符集
- GB2312
- GB13000
- GBK
- GB18030
MySql存储引擎
数据库对象
- 存储,管理和使用数据的不同结构形式,如:表、视图、存储过程、函数、触发器、事件等。
数据库
- 存储数据库对象的容器。
什么是存储引擎
- MySQL中的数据用各种不同的技术存储在文件(或者内存)中。
- 每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。
- 通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
- 不同的存储引擎性能是不一样的
什么是事务
- 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
存储引擎分类
MYISAM
它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。
每个MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,但是扩展名分别为:
- .frm(存储表定义)
- MYD(MYData,存储数据)
- MYI(MYIndex,存储索引)
INNODB
- InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
MEMORY
- memory使用存在内存中的内容来创建表。每个MEMORY表实际对应一个磁盘文件,格式是.frm
- MEMORY类型的表访问非常快,因为它到数据是放在内存中的,并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。
什么是SQL
SQL是Structured Quevy Language(结构化查询语言)的缩写。
SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。
在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。
SQL语言功能很强,其核心功能只用了6个命令,分别是SELECT、CREATE、INSERT、DELETE、UPDATE、和GRANT(REVOKE)。
sql功能分类
DDL:数据定义语言
- 用来定义数据库对象:创建库,表,列等。
DML:数据操作语言
- 用来操作数据库表中的记录
DQL:数据查询语言
- 用来查询数据
DCL:数据控制语言
- 用来定义访问权限和安全级别
SQL数据类型
MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持所有标准SQL数值数据类型。
MySQL支持多种类型,大致可以分为三类
数值类型
字符串类型
日期和时间类型
常用数据类型
- double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
- char:固定长度字符串类型; char(10) ‘abc ‘
- varchar:可变长度字符串类型;varchar(10) ‘abc’
- text:字符串类型;
- blob:二进制类型;
- date:日期类型,格式为:yyyy-MM-dd;
- time:时间类型,格式为:hh:mm:ss
- datetime:日期时间类型 yyyy-MM-dd hh:mm:ss
在mysql中,字符串类型和日期类型都要用单引号括起来。
‘Myxq’ ‘2020-01-01’
DDL
创建数据库
- create database 数据库名 character set utf8;
修改数据库
- alter database 数据库名 charactor set gbk;
显示当前数据库
- select database( );
删除数据库
- drop database 数据库名;
创建学生表
添加一列
- ALTER TABLE 表名 ADD 列名 数据类型;
查看表的字段信息
- DESC 表名;
修改一个表的字段类型
- ALTER TABLE 表名 MODIFY 字段名 数据类型;
删除一列
- ALTER TABLE 表名 DROP 字段名;
修改表名
- RENAME TABLE 原始表名 TO 要修改的表名;
复制表
- create table 新表名 like 参照表名;
查看表的创建细节
- SHOW CREATE TABLE 表名;
修改表的字符集为gbk
- ALTER TABLE 表名 CHARACTER SET 字符集名称;
修改表的列名
- ALTER TABLE 表名 CHANGE 原始列名 新列名 数据类型;
删除表
- DROP TABLE 表名;
DML
查询表中的所有数据
- SELECT * FROM 表名;
DML是对表中的数据进行增、删、改的操作
插入操作
INSERT INTO 表名(列名1,列名2 …)VALUES (列值1,列值2…);
注意事项
- 列名与列值的类型、个数、顺序要一一对应。
- 值不要超出列定义的长度。
- 插入的日期和字符一样,都使用引号括起来。
批量插入
- INSERT INTO 表名(列名1,列名2 …)VALUES (列值1,列值2…),(列值1,列值2…);
更新操作
UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 WHERE 列名=值
把所有学生的分数改为90
- update students set score=90
把姓名为张三的学生分数改为60
- update student set score=60 where name=’张三’;
把姓名为李四的年龄改为20和分数改为70
- update student set age=20,score=70 where name=’李四’;
把赵六的年龄在原来基础上加1岁
- update students set age=age+1 where name=’赵六’;
修改数据库密码
- use mysql;
- update user set password=password(‘abc’) WHERE User=’root’;
- flush privileges;刷新MySQL的系统权限相关表
- mysqladmin -u root -p password 12356
删除操作
DELETE FROM 表名 【WHERE 列名=值】
TRUNCATE TABLE 表名;
DELETED 与TRUNCATE的区别
- DELETE 删除表中的数据,表结构还在;删除后的数据可以找回
- TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。
删除的数据不能找回。执行速度比DELETE快。
DQL
查询所有列
- SELECT * FROM 表名;
结果集
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
结果集
- 通过查询语句查询出来的数据以表的形式展示我们称这个表为虚拟结果集。存放在内存中。
- 查询返回的结果集是一张虚拟表。
查询指定列的数据
- SELECT 列名1,列表2… FROM 表名;
条件查询
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用一些运算符及关键字:
条件查询运行符及关键字
=(等于)、!=(不等于)、<>(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于);
BETWEEN…AND;值在什么范围
IN(set);
- 固定的范围值
IS NULL;(为空) IS NOT NULL(不为空)
AND;与
OR;或
NOT; 非
使用
查询性别为男,并且年龄为20的学生记录
- SELECT * FROM students WHERE gender=’男’ AND age=20;
查询学号为1 或者 名为zs的记录
- SELECT * FROM students WHERE id =1 OR name=’zs’;
查询学号为1,2,3的记录
- SELECT * FROM students WHERE id=’1001’ OR id=’1002’ OR 1001=’1003’;
- SELECT * FROM students WHERE id IN(‘1001’,’1002’,’1003’);
- SELECT * FROM students WHERE id NOT IN (‘1001’,’1002’,’1003’);
查询年龄为null的记录
- SELECT * FROM students WHERE age IS NULL;
查询年龄在18到20之间的学生记录
- SELECT * FROM students WHERE age>=18 AND age<=20;
- SELECT * FROM students WHERE age BETWEEN 18 AND 20;
查询性别非男的学生记录
- SELECT * FROM students WHERE gender !=’男’;
查询姓名不为null的学生记录
- SELECT * FROM students WHERE name IS NOT NULL;
模糊查询
根据指定的关键进行查询
使用LIKE关键字后跟通配符
通配符
- _ :任意一个字符
- %:任意0~n个字符
使用
查询姓名由5个字母构成的学生记录
- SELECT * FROM students WHERE name LIKE ‘_____’;
- 模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。
查询姓名由5个字母构成,并且第5个字母为“s”的学生记录
- SELECT * FROM students WHERE name LIKE ‘____s’;
查询姓名以“m”开头的学生记录
- SELECT * FROM students WHERE name LIKE ‘m%’;
- 其中“%”匹配0~n个任何字母。
查询姓名中第2个字母为“u”的学生记录
- SELECT * FROM students WHERE name LIKE ‘_u%’;
查询姓名中包含“s”字母的学生记录
- SELECT * FROM stu WHERE name LIKE ‘%s%’;
字段控制查询
去除重复字段
- SELECT DISTINCT name FROM students;
把查询字段的结果进行运算,必须都要是数据型
- SELECT *,字段1+字段2 FROM 表名;
- 列有很多记录的值为NULL,
因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。
下面使用了把NULL转换成数值0的函数IFNULL:
- SELECT *,age+IFNULL(score,0) FROM students;
对查询结果起别名
- 在上面查询中出现列名为sx+IFNULL(yw,0),这很不美观,现在我们给这一列给出一个别名,为total:
- SELECT *, yw+IFNULL(sx,0) AS total FROM score;
- 省略 AS SELECT *, yw+IFNULL(sx,0) total FROM score;
排序
创建表
CREATE TABLE
employee
(id
int(11) NOT NULL,name
varchar(50) DEFAULT NULL,gender
varchar(1) DEFAULT NULL,hire_date
date DEFAULT NULL,salary
decimal(10,0) DEFAULT NULL,performance
double(255,0) DEFAULT NULL,manage
double(255,0) DEFAULT NULL,department
varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO
employee
VALUES (1001, ‘张三’, ‘男’, ‘1991-7-25’, 2000, 200, 500, ‘营销部’);INSERT INTO
employee
VALUES (1002, ‘李四’, ‘男’, ‘2017-7-5’, 4000, 500, NULL, ‘营销部’);INSERT INTO
employee
VALUES (1003, ‘王五’, ‘女’, ‘2018-5-1’, 6000, 100, 5000, ‘研发部’);INSERT INTO
employee
VALUES (1004, ‘赵六’, ‘男’, ‘1991-6-1’, 1000, 3000, 4000, ‘财务部’);INSERT INTO
employee
VALUES (1005, ‘孙七’, ‘女’, ‘2018-3-23’, 8000, 1000, NULL, ‘研发部’);INSERT INTO
employee
VALUES (1006, ‘周八’, ‘男’, ‘2010-9-8’, 5000, 500, 1000, ‘人事部’);INSERT INTO
employee
VALUES (1007, ‘吴九’, ‘女’, ‘2017-7-5’, 8000, 601, NULL, ‘研发部’);INSERT INTO
employee
VALUES (1008, ‘郑十’, ‘女’, ‘2014-4-6’, 4000, 1801, NULL, ‘人事部’);
对查询的结果进行排序
使用关键字ORDER BY
排序类型
升序ASC
- 从小到大 默认
降序DESC
- 从大到小
使用
对所有员工的薪水进行排序
- SELECT *FROM employee ORDER BY salary ASC;
查询所有员工记录,按年龄降序排序
- SELECT * FROM employee ORDER BY salary DESC;
查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
- SELECT * FROM employee ORDER BY salary DESC, id ASC;
聚合函数
对查询的结果进行统计计算
常用聚合函数
- COUNT():统计指定列不为NULL的记录行数;
- MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
- MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
- SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
- AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
使用
COUNT
查询employee表中记录数:
- SELECT COUNT(*) AS total_record FROM employee;
查询员工表中有绩效的人数
- SELECT COUNT(performance) FROM employee;
查询员工表中月薪大于2500的人数:
- SELECT COUNT(*) FROM employee WHERE salary > 2500;
统计月薪与管理费之和大于5000元的人数:
- SELECT COUNT(*) FROM employee WHERE salary+IFNULL(manage,0) > 5000;
查询有绩效的人数,和有管理费的人数:
- SELECT COUNT(performance), COUNT(manage) FROM employee;
SUM和AVG
查询所有雇员月薪和:
- SELECT SUM(salary) FROM employee;
查询所有雇员月薪和,以及所有雇员绩效和
- SELECT SUM(salary), SUM(performance) FROM employee;
查询所有雇员月薪+绩效和:
- SELECT SUM(salary+IFNULL(performance,0)) FROM employee;
统计所有员工平均工资:
- SELECT AVG(salary) FROM employee;
MAX和MIN
查询最高工资和最低工资:
- SELECT MAX(salary), MIN(salary) FROM employee;
ps:
以上就是对sql语句使用的详细操作说明了,
如果这篇文章对您有帮助,可以在下方进行留言;
下面的赏是对我最大的鼓励。
您的鼓励就是我最大的动力!
资料参考于课本,csdn开发者论坛,博客园开发者论坛…
转载请注明出处https://lil-sum.github.io/, 感谢配合.