数据库:
数据库其实就是一个存储数据的仓库,它可以对数据进行存储和管理,并且按照一定的规则存储在磁盘中
数据库根据不同的数据类型可以分为
1.关系型数据库 2.非关系型数据库
目前所学的mysql数据库,,快捷可靠,免费开源,由瑞典MySQL AB 公司开发,目前属于 Oracle旗下产品。MySQL 流行的关系型数据库管理系统
sql语言 是连接mysql的可视化客户端工具
mysql的语法规范:
不区分大小写,关键字一般都会自己大写,还有表名,列名
2表中存储那些信息--列名
char 定长的,例如定义的长度为5,如果只存储了2个字符,也是会不全到5个字符
varchar 变长的,例如5个字符,如果只存储了2 个字符,实际只站村了2个字符
日期型
date 年月日(日期)
datetime 年月日时分秒
数值型
float
double 常用的,精度更高,建议使用
TINYINT1
SMALLINT2
MEDIUMINT3
int 4
bigint 8
text类型文本可以存储
表中必须有一列的值,能够唯一的表示一条记录
主键列在表中只能有一个,且不能重复,也不能为空
mycle还支持主键列自动增长(必须为整数类型 通过 AUTO_INCREMENT)
2不能为空 NOT NULL
3唯一约束 UNIQUE
4检查约束 设置条件,check
5外键约束(多表)
CREATE TABLE t_user(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
number INT(5) NOT NULL,
stuname VARCHAR(10) NOT NULL,
age INT(3)
CHECK(age>18),
birthday DATE,
weight DOUBLE,
opertime datetime,
CONSTRAINT 约束名 约束规则
INSERT INTO student(sname,gender,birthday,phone,address,height,reg_time)
VALUE('李丽','女','2002-10-1','156645645','西安',1.78,NOW())//sql语言中获取当前时间的函数NOW
//插入了一行记录
INSERT INTO student(sname,gender,birthday,phone,address,height,reg_time)
VALUES('李丽1','女','2002-10-1','156645888','西安1',1.68,NOW()),
('李丽2','女','2002-10-1','156645777','西安2',1.68,NOW())
//插入了多行记录
INSERT INTO student SET sname='王五',gender="男" //插入了一行只有特定信息的记录,其他值为空
INSERT INTO stu(num,sname,gender,birthday)SELECT num,sname,gender,birthday FROM student
//从student表中查询了特定的字段,插入到另一个表中
UPDATE student SET address = '成都'
//将表中的所有的address改为成都
UPDATE student SET address = '西安' WHERE num = 1
//将表中指定的num=1这一行记录的address改为西安
UPDATE student SET address = '西安',height=1.88 WHERE num = 3
//将表中指定的num=3这一行记录的address和height分别改为西安 和 1.88
DELETE FROM 表名 --只对表中的数据逐行删除
DROP TABLE 表名 --删除表的结构
TRUNCATE TABLE 表名 --清空整张表的数据,是针对ddl上的操作
DQL(数据查询语言)
SELECT * FROM student
SELECT num,sname,gender FROM student
SELECT num,sname,height+1 from stu
算出来的身高比如1.22,结果是2.22
SELECT num,sname,height+num FROM student
比如num是1,height是1.22,,结果是2.22
-- DISTINCT 去除重复数据,重复数据指的是每列的值都是相同的.
SELECT DISTINCT sname,gender FROM student
select后使用函数:
单行函数: 会对每行数据进行处理
分组函数/聚合函数/统计函数: 将多条结果转为一条 sum max count
字符串处理
逻辑处理
日期
算数
单行函数:
-- length(列名) 返回列的长度 以字节为单位 中文3个字节
SELECT num,LENGTH(sname) FROM student
-- char_length(列名) 以字符为单位的长度
SELECT num,CHAR_LENGTH(sname)sname FROM student
-- concat("","",""....) as 别名
SELECT CONCAT(num,":",sname,":",gender)AS studentInfo FROM student
//合在一块
--转为大小写
SELECT UPPER(sname)FROM student
SELECT LOWER(sname)FROM student
SELECT num,SUBSTRING(sname,2,2) FROM student
//从第二位开始截取2个
-- instr(列名,查找的字符) 返回指定字符在字符串中首次出现的位置
SELECT num,INSTR(sname,"i") FROM student
-- trim(子串 from 列名) 去掉列名前后的指定子串
SELECT TRIM("a" FROM sname) FROM student
-- 左(右)填充指定内容到指定长度
SELECT LPAD(sname,5,"a"),RPAD(sname,5,"a") FROM student
-- 替换
SELECT REPLACE(sname,"i","I") FROM student
-- 对查询结果进行逻辑处理
SELECT num,sname,
(CASE WHEN height>=1.80 THEN '大高个' ELSE '不是大高个' END)height,
(CASE
WHEN height>=1.80 THEN '大高个'
WHEN height<1.80 AND height>1.60 THEN '中等'
ELSE '低个子' END)height
FROM student
-- ifnull(列,默认值)
SELECT num,sname,IFNULL(address,'暂未录入') FROM student
-- if(条件,条件成立返回,不成立返回)
SELECT num,sname,IF(height>1.80,'大高个子',"不是大高个")height FROM student
--round(四舍五入),ceil(数值):向上取整,返回>=该参数的最小整数 ,
floor(数值):向下取整,返回<=该参数的最大整数
SELECT num,sname,ROUND(height) FROM student
SELECT num,sname,FLOOR(height) FROM student
-- 截断(小数点后截断几位) 不会进位 RAND() 随机生成 0-1之间的随机数
SELECT num,sname,TRUNCATE(height,1),RAND() FROM student
SELECT num,sname,NOW(),CURDATE(),CURTIME() FROM student
SELECT num,sname,YEAR(birthday),MONTH(birthday) FROM student
-- 字符串转 日期类型
SELECT STR_TO_DATE('2002-1-1',"%Y-%m-%d") FROM student
-- 日期转字符串类型
SELECT DATE_FORMAT(birthday,"%Y-%m")birthday FROM student
SELECT DATE_FORMAT(birthday,"%Y")birthday FROM student
-- 计算两个日期之间的天数,datediff(big,small):返回两个日期相差的天数
SELECT DATEDIFF(CURDATE(),birthday) FROM student
分组函数/聚合函数/统计函数 多变一
-- sum() avg()只能处理数值类型的列
-- max() min() count() 可以处理任何数据类型
SELECT SUM(height),AVG(height),MAX(height),MIN(height) FROM student
SELECT COUNT(*) FROM student //表中有多少行记录
SELECT COUNT(num) FROM student
SELECT MAX(sname),MIN(sname) FROM student
分组函数
SELECT * FROM student WHERE gender = '男'
SELECT * FROM student WHERE gender != '男'
SELECT * FROM student WHERE gender <> '男'
SELECT * FROM student WHERE gender = '男' AND height>1.7
SELECT * FROM student WHERE gender = '男' OR height>1.7
SELECT * FROM student WHERE height = 1.78 OR height=1.88 OR height=1.90
SELECT * FROM student WHERE height IN(1.78,1.88,1.90)
SELECT * FROM student WHERE height NOT IN(1.78,1.88,1.90)
-- is null 查询值为空的
SELECT * FROM student WHERE address IS NULL
SELECT * FROM student WHERE address IS NOT NULL
//不为空的
-- height BETWEEN 1.70 AND 1.90 之间
SELECT * FROM student WHERE height BETWEEN 1.70 AND 1.90
SELECT * FROM student WHERE height>=1.70 AND height<=1.90
-- like %关键字% % 匹配任意个字符 _ 匹配一个字符
SELECT * FROM student WHERE sname LIKE "张_"
SELECT * FROM student WHERE sname LIKE "%三%"
-- union 合并多个查询语句结果 可以去除多条结果中重复数据 多条查询结果列相同
SELECT num FROM student WHERE gender = "男"
UNION
SELECT num FROM student
-- union all 只是将多条查询简单合并 不会去除重复数据,有多少条就显示多少条记录
SELECT * FROM student WHERE gender = "男"
UNION ALL
SELECT * FROM student
-- 默认按主键从小到大排序
SELECT * FROM student
-- order by 列 asc(升序) desc(降序)
SELECT * FROM student ORDER BY reg_time ASC
SELECT * FROM student ORDER BY reg_time DESC
SELECT * FROM student ORDER BY height ASC
SELECT * FROM student WHERE gender = "男" ORDER BY height ASC
SELECT * FROM student ORDER BY height ASC, reg_time DESC
//如果height存在相同的,那就按照后者进行排序
-- 分页显示数据 假设每页显示4条
-- limit 开始的位置(从0开始),每次查询的数量
SELECT * FROM student WHERE num>0 ORDER BY num ASC LIMIT 0,4
SELECT * FROM student WHERE num>0 ORDER BY num ASC LIMIT 4,4
-- 分组查询 group by 分组条件 把分组条件相同的数据划分到同一个组中处理
SELECT gender,COUNT(*),MAX(height),AVG(height) FROM student GROUP BY gender
//前者必须与后者相同,,group by 后面的分组内容必须是表中共有的
-- 子查询
SELECT * FROM(SELECT gender,COUNT(*)c FROM student GROUP BY gender)AS t WHERE t.c>3
//想知道表中男女中谁个数大于3,将一开始查询出来的虚拟表看做一个表对它进行查询操作
这就叫做子查询
-- where 是对分组前(表中的原始数据)筛选, HAVING对已经分组后的数据再进行筛选
SELECT gender,COUNT(*)c FROM student WHERE num>0 GROUP BY gender HAVING c>3