MySQL的数据类型

1.字符串类型 char varchar
2.数值型
1)整数型(显示宽度)

类型

所占空间

取值范围

tinyInt

1B

有符号(默认):-128 - 127;无符号:0 - 255

Int

4B

有符号:-2^16 - 2^16-1 ;无符号:0 - 2^32-1

Bigint

8B

int(size)
size:最大显示宽度,最大显示宽度255
2)小数型

类型

所占空间

取值范围

float(m,d)

4B

m:总位数 d:小数位(最多可以精确到7位小数)

double(m,d)

8B

m:总位数 d:小数位(最多可以精确到15位小数)

以上两种类型容易出现偏差。
decimal(m,d)|(m+2)B|m表示数字的最大数1 - 65;d :0-30不能超过m
3)日期类型

类型

格式

date

2020-03-13

Time

09:19:30

datetime

2020-03-13 09:19:30(手动设置时间)

timestamp

2020-03-13 09:19:30(表内容更新自动变化时间)

创建表代码实例
-- 创建学生表
CREATE TABLE student (
	stuid INT (11) NOT NULL AUTO_INCREMENT COMMENT '学生ID',
	`name` VARCHAR (32) NOT NULL COMMENT '姓名',
	sex VARCHAR (2) NOT NULL COMMENT '性别',
	phone VARCHAR (11) DEFAULT NULL COMMENT '性别',
	birthday DATE DEFAULT NULL COMMENT '出生日期',
	cid INT (11) NOT NULL COMMENT '班级号',
	PRIMARY KEY(stuid),
	CONSTRAINT fk_student_classinfo FOREIGN KEY(cid) REFERENCES classinfo(cid)
)
增删改查实例
-- 插入数据 
-- 不指定字段
INSERT INTO classinfo VALUES(1,'一班',5,55,60)
-- 指定具体字段
INSERT INTO student(`name`,sex,phone,birthday,cid) 
VALUES('tina','女','123456789',NOW(),1)
-- 插入多条数据
INSERT INTO student(`name`,sex,phone,birthday,cid) 
VALUES('eric','男','123456789',NOW(),1),
			('jack','男','123456589',NOW(),2)
-- 修改数据
UPDATE student SET sex='男' WHERE stuid=1
UPDATE student SET sex='女',birthday='2019-02-02' WHERE stuid=3
-- 删除数据(删除存在外键关系的表数据的时候,先删被参照表数据
DELETE FROM student WHERE stuid=2
-- 查询
SELECT * FROM `subject`
SELECT * FROM score
查询语句实例
USE studentmanager
-- 一、简单查询
-- 1.查询全部的行和列
SELECT * FROM student
-- 2.查询所有学生姓名
SELECT `name` FROM student
-- 3.查询多个列(学号、姓名、性别)
SELECT 
	stuid,
	`name`,
	sex 
FROM 
	student
-- 4.DISTINC(去除重复)
SELECT DISTINCT birthday FROM student
SELECT DISTINCT IFNULL(birthday,"出生不详") FROM student
-- 二、常用算术运算符
-- 使用别名 AS 
SELECT stuid AS '学生编号',sex AS gender FROM student
SELECT cid '班级编号',cname '班级名称' FROM classinfo
SELECT DISTINCT IFNULL(birthday,'出生不详') AS '出生日期' FROM student
-- 三、where比较运算符
-- 1.查询学号为4的学生信息
SELECT * FROM student WHERE stuid=4
SELECT * FROM student WHERE birthday>'1995-07-13'
-- 2.查询所有女生的学员信息
SELECT * FROM student WHERE sex='女'
SELECT * FROM student WHERE sex='男' AND birthday<='1995-07-16'
-- 四、其他比较
-- 1.BETWEEN AND(包括临界值)
-- 1)查询在1995-07-13到1995-07-15之间出生的学生信息
SELECT * FROM student WHERE birthday BETWEEN '1995-07-13' AND '1995-07-15'
-- 2 IN 查询男生和女生的信息
SELECT * FROM student WHERE sex IN ('男','女') 
-- 也可以使用OR
SELECT * FROM student WHERE sex='男' OR sex='女'
-- 查看所有电话为NULL的信息
SELECT * FROM student WHERE phone IS NULL
SELECT * FROM student WHERE phone IS NOT NULL OR phone <>''
-- 查询班级编号是1或者是2的学员信息
-- 查询班级编号不是1或者不是2的学员信息
SELECT * FROM student WHERE cid NOT IN (1,2)
-- 3 LIKE _代表只能匹配单个字符
-- 查询姓张的学员信息 
SELECT * FROM student WHERE `name` LIKE '张%'-- 开头
SELECT * FROM student WHERE `name` LIKE '%飞鸿'-- 结尾
SELECT * FROM student WHERE `name` LIKE '_%a%'-- 中间
SELECT * FROM student WHERE `name` RLIKE '[a]'-- 包含a的
SELECT * FROM student WHERE `name` RLIKE '^[a]'-- 包含a开头的
SELECT * FROM student WHERE `name` RLIKE '[ac]'-- 包含a或c的
SELECT * FROM student WHERE `name` RLIKE '^[ac]'-- 以a或c开头的
SELECT * FROM student WHERE BINARY `name` LIKE 'A%'-- 区分大小写
-- 4 NULL
-- 查询所有电话为NULL的学生信息
SELECT * FROM student WHERE phone IS NULL
-- 五、逻辑运算
-- 1 AND
-- 查询成绩大于等于70并且科目编号是2的学生成绩,学生编号,科目编号
SELECT stuid,subid,score FROM score WHERE score>=70 AND subid=2
聚合函数:

MAX(),MIN(),SUM(),COUNT()

COUNT()

1.COUNT(1):代表统计表中的所有记录,包含字段为null的记录,1代表代码行,如果有多个字段,COUNT(1)效率高。
2.COUNT():包含了所有的列,相当于行数,在统计时不会忽略值为NULL的记录。如果列中只有一个字段,COUNT()执行效率最高。
3.COUNT(字段):统计该字段在表中的出现次数,忽略值为NULL的数据。如果字段为主键,COUNT(字段)效率最高;如果不是主键,COUNT(1)效率比COUNT(字段)高。

顺序

SELECT
FROM
WHERE
GROUP BY
HAVING – 分组后的过滤
ORDER BY

LIMIT 0,5 – 记录从0开始,0代表第一条
常用函数
-- 1.把字符串“abcd”转成“dcba”
SELECT REVERSE('abcd') '翻转'
-- 2.获取员工姓名的长度
SELECT LENGTH(ename)
FROM employee
-- 3.把员工信息表中的员工姓名,员工职位拼接到一块,并用()隔开 tom(经理)
SELECT CONCAT(ename,'(',job,')') '拼接'
FROM employee
-- 4.当员工工资大于等于6000时,显示“高薪”,低于6000时显示“低薪”
SELECT eid,salary,IF(salary>=6000,'高薪','低薪') '工资等级'
FROM employee
-- 5.获取当前时间
SELECT NOW()
-- 6.提取字符串“qwertyuiop”,起始位置为5,长度为3
SELECT SUBSTRING('qwertyuiop',5,3) '内容' -- 字符串索引是从1开始
-- 7.获取当前日期的函数和获取当前时间的函数
SELECT CURRENT_DATE(),CURRENT_TIME()
-- 8.获取当前日期和时间的函数
SELECT CURRENT_TIMESTAMP(),NOW()
-- 9.增加两年(重点!!!)
SELECT DATE_ADD(NOW(),INTERVAL 2 YEAR)
SELECT DATE_ADD(NOW(),INTERVAL 2 DAY)
SELECT DATE_ADD(NOW(),INTERVAL 2 MONTH)
SELECT DATE_ADD(birthday,INTERVAL 2 DAY)
-- 10.连接字符串
SELECT CONCAT(`name`,'{',sex,'}')
FROM student
-- 11.大小写转换
SELECT UCASE(`name`),LCASE(`name`)
FROM student
-- 12 .获取长度
-- 截取字符串函数
SELECT SUBSTRING(`name`,1,2)
-- 13绝对值函数
SELECT ABS(-5)
-- 14.IF函数
SELECT scoid,score,IF(score>=60,'及格','不及格') AS '等级'
FROM score
-- 15.获取当前用户
SELECT USER()
-- 16.加密函数
SELECT MD5(`name`)
FROM student
-- 17.改变字段的数据类型
SELECT CASE('123' AS UNSIGNED INT)+1
SELECT CONVERT('125',UNSIGNED INT)+1
注入式攻击
概念:利用程序漏洞,在输入信息时构造特定的SQL语句,来绕过程序的控制台。使用PreparedStatement预编译对象,即占位符解决这一问题。

EG:输入错误用户名、密码,通过传入某个特点参数,绕过验证,直接登录成功。
SELECT * FROM login WHERE username=’123’ AND ‘password’=’123456’改为
SELECT * FROM login WHERE username=’’ OR 1=1