数据库和SQL
什么数据库
数据库是存储在一起的相关数据的集合,这些数据是结构化的,无有害的或不必要的冗余,并为多种应用服务。
什么是SQL
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
什么是mysql
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQLAB公司,在2008年1月16号被Sun公司收购。MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
关系数据库管理系统(Relational Database Management System:RDBMS):
指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。关系数据库管理系统就是管理关系数据库,并将数据逻辑组织的系统。
mysql中的数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度浮点数值 |
DOUBLE | 8 字节 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
时间/日期类型
类型 | 大小(字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
mysql的数据库操作
数据库的新增
登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下:
CREATE DATABASE 数据库名;
DROP DATABASE if exists 数据库名;create database 数据库名;
实例:
CREATE DATABASE test_db;
数据库的查询
获取所有表名:
USE information_schema;SELECT table_name FROM TABLES WHERE TABLE_SCHEMA=’数据库名’;
数据库的删除
使用 drop 命令删除数据库,语法如下:
DROP DATABASE 数据库名;
mysql的数据表操作
数据表的新建
实例:
USE test_db;CREATE TABLE IF NOT EXISTS `student`( `stu_id` INT UNSIGNED AUTO_INCREMENT, `stu_age` INT NOT NULL COMMENT '学生的年龄', `stu_name` VARCHAR(20) NOT NULL COMMENT '学生的姓名', `stu_number` VARCHAR(30) NOT NULL UNIQUE COMMENT '学号', `stu_address` VARCHAR(30) NOT NULL COMMENT '学生的地址', PRIMARY KEY ( `stu_id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8;
总结:
CREATE TABLE table_name ( column_name1 data_type constraint[...], column_name2 data_type constraint[...], column_name3 data_type constraint[...], ... PRIMARY KEY ( `column_name` ))ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据的增添
实例:
INSERT INTO `student`(`stu_age`, `stu_name`, `stu_number`, `stu_address`)VALUES(22, '刘太刚', '1234', '贵州'),(15, '徐维松', '2345', '四川'),(19, '徐任达', '3456', '贵州'),(18, '彭克喜', '4567', '贵州'),(20, '潘姚瑶', '5678', '新疆');
总结:
INSERT INTO table_name(column_name1, column_name2, column_name3, ...)VALUES(value1, value2, value3, ...),(value1, value2, value3, ...),...(value1, value2, value3, ...);
数据表的删除
删除数据表
DROP TABLE 表名;
删除数据
删除表内数据,用 delete。格式为:
DELETE FROM 表名 WHERE 删除条件;
实例:
DELETE FROM student WHERE stu_name = "刘太刚"; --删除学生表内姓名为刘太刚的记录
注: 只用delete的时候,一定要使用where并注明删除的条件,否则会删除整张表。
删除数据,但是保留表结构
清除表内数据,保存表结构,用 truncate。格式为:
TRUNCATE TABLE 表名;
数据表的修改
增加一个字段:
ALTER TABLE 表名 ADD COLUMN 字段名 数据类型 字段约束;
实例:
ALTER TABLE student ADD COLUMN stu_honor VARCHAR(20) DEFAULT NULL;
删除一个字段:
ALTER TABLE 表名 DROP COLUMN 字段名;
修改一个字段:
ALTER TABLE 表名 MODIFY 字段名 数据类型; --修改数据类型ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型; --修改字段名称
ALTER TABLE student MODIFY stu_honor VARCHAR(10); ALTER TABLE student CHANGE stu_honor stu_honour varchar(200);
数据表的查询
一般查询
一般查询的格式
SELECT column_name,column_name, ...FROM table_name[WHERE Clause][LIMIT N][ OFFSET M]
查询所有数据
实例:
SELECT * FROM student ;SELECT stu_name, stu_number FROM student ; --所有数据中的指定字段
根据条件查询
实例:
select * from student where id= 1;select * from student where stu_name='徐维松' and stu_number='2345' ;select * from student where stu_name='徐维松' or stu_number='3456' ;select * from student where stu_age>=18 and stu_age<=21 ;select * from student where stu_age between 20 and 23;
模糊查询
实例:
select * from student where stu_name like '%克喜'; --%通配符代表任意多个字符
排序
实例:
select * from student order by stu_age asc; --按照价格升序排列select * from student order by stu_age desc; --按照价格降序排列
统计函数(聚合函数)
实例:
select count(*) from student; --查询表中有多少条数据select max(stu_age) from student; --取价格的最大值select min(stu_age) from student; --取价格的最小值select sum(stu_age) from student; --取价格的总和select avg(stu_age) from student; --取价格的平均值
分组查询
实例1:
select count(*) from student group by stu_address;
注: group by,一般和聚合函数一起使用,如果,查询的字段出现在GROUP BY后,却没有包含在聚合函数中,该字段显示的是,分组后的第一条记录的值,这样,可能会导致查询结果不符合我们的预期。
实例2:
SELECT COUNT(*) FROM student GROUP BY stu_address HAVING SUM(stu_age)>60; --使用stu_address作为分组的条件, 找出满足stu_age的和大于60的那一组
注: HAVING关键字和WHERE关键字的作用相同,都是用于设置条件表达式,对查询结果进行过滤。两者的区别是,HAVING关键字后,可以跟聚合函数,而WHERE关键字不能,通常情况下,HAVING关键字,都是和GROUP BY一起使用,用于对分组后的结果进行过滤。
分页查询
select * from student limit 0,3; -- 跳过几条数据取几条数据
总结:
SELECT * FROM table_name LIMIT offset, size; -- offset:偏移量; size:数据量
去重(chong)查询
select distinct stu_address from student;
连结查询
内联接
(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。
外联接
外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN 完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
交叉联接
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。 FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。
例子
1) 内连接
2)左连接
3) 右连接
4) 完全连接