首页 > 代码库 > mysql<二>

mysql<二>

  1 -- ########## 01、MySQL的一些基本概念 ##########
  2 -- 学习数据库时,应该具备集合论的思想:把数据形成的结果作为一个集合(无序的)
  3 -- 关注点在于作为集合的一系列的数据,而不是集合中的单个孤立的数据
  4 
  5 -- 概念描述                物理描述
  6 -- Entity实体    ----->    table表
  7 -- Attribute属性----->    field字段
  8 
  9 -- ########## 02、MySQL的约束 ##########
 10 -- 约束:指的是针对字段进行的条件限制
 11 
 12 -- 1、主键约束:描述表中的一个或多个字段为主键,不允许为空
 13 -- A:字段后添加 PRIMARY KEY(适用于单一字段作为主键)
 14 -- B:表中的字段定义均完成后,添加PRIMARY KEY(需要设置为主键的字段1, 需要设置为主键的字段2, ... 需要设置为主键的字段n)(适用于多个字段作为主键)
 15 
 16 -- 2、非空约束:描述某一个字段的内容不允许为空
 17 -- 字段后添加 NOT NULL
 18 
 19 -- 3、唯一性约束:描述某一个字段的内容是唯一的,允许为空,但是只能出现一次空值
 20 -- 字段后添加 UNIQUE
 21 
 22 -- 4、默认约束:指定某个字段的内容的默认值
 23 -- 字段后添加 DEFAULT 默认值
 24 
 25 -- 注意:和约束经常搭配使用的【属性值自增】(常常用于INT类型的主键字段上)
 26 -- 字段后添加 AUTO_INCREMENT
 27 
 28 -- 综合使用上述的约束及自增,制作一个学生信息表
 29 CREATE TABLE student
 30 (
 31     -- 考虑到通过【学生编号】对学生进行区分,所以设置【学生编号】作为表的主键
 32     -- 同时考虑到人脑记忆编号排到多少了比较困难,所以考虑设置【学生编号】为自增
 33     studentid INT AUTO_INCREMENT PRIMARY KEY,
 34     -- 考虑【学生姓名】不会是空值,所以在【学生姓名】上使用非空约束
 35     studentname VARCHAR(20) NOT NULL,
 36     -- 考虑【学生性别】上使用默认约束
 37     gender VARCHAR(2) DEFAULT ‘女‘,
 38     -- 考虑【联系电话】上使用唯一性约束
 39     phone VARCHAR(11) UNIQUE
 40 );
 41 
 42 DESC student;
 43 
 44 -- 1、新增数据
 45 INSERT INTO student VALUES(NULL, ‘刘备‘, ‘男‘, ‘110‘);
 46 -- 测试一下【学生姓名】为null的情况
 47 -- 错误代码: 1048  Column ‘studentname‘ cannot be null
 48 INSERT INTO student VALUES(NULL, NULL, ‘男‘, ‘120‘);
 49 -- 选取表中的非自增字段赋值插入
 50 INSERT INTO student(studentname, gender, phone) VALUES(‘关羽‘, ‘男‘, ‘120‘);    -- 编号为2
 51 -- 测试一下【联系电话】不唯一的情况
 52 -- 错误代码: 1062 Duplicate entry ‘110‘ for key ‘phone‘
 53 INSERT INTO student VALUES(NULL, ‘张飞‘, ‘男‘, ‘110‘);
 54 -- 测试一下【学生性别】为默认值的情况
 55 INSERT INTO student VALUES(NULL, ‘黄月英‘, DEFAULT, ‘119‘);                        -- 编号为4
 56 
 57 -- 2、修改数据
 58 -- 错误代码: 1062 Duplicate entry ‘110‘ for key ‘phone‘
 59 UPDATE student SET phone = ‘110‘ WHERE studentname = ‘黄月英‘;
 60 
 61 -- 3、删除数据
 62 -- 删除满足条件的数据
 63 DELETE FROM student WHERE studentname = ‘关羽‘;
 64 
 65 -- 删除全部数据(使用DELETE)
 66 DELETE FROM student;
 67 
 68 -- 再插入数据
 69 INSERT INTO student VALUES(NULL, ‘孙权‘, ‘男‘, ‘110‘);        -- 编号为5
 70 INSERT INTO student VALUES(NULL, ‘鲁肃‘, ‘男‘, ‘120‘);        -- 编号为6
 71 INSERT INTO student VALUES(NULL, ‘大乔‘, DEFAULT, ‘114‘), (NULL, ‘周瑜‘, ‘男‘, ‘119‘);    -- 编号为7、8
 72 
 73 -- 删除全部数据(使用TRUNCATE)
 74 TRUNCATE TABLE student;
 75 
 76 -- 再插入数据
 77 INSERT INTO student VALUES(NULL, ‘曹操‘, ‘男‘, ‘110‘);        -- 编号为1
 78 INSERT INTO student VALUES(NULL, ‘曹丕‘, ‘男‘, ‘120‘);        -- 编号为2
 79 
 80 -- 删除全部数据(使用TRUNCATE)
 81 TRUNCATE TABLE student;
 82 
 83 INSERT INTO student VALUES(NULL, ‘甄姬‘, DEFAULT, ‘114‘), (NULL, ‘司马懿‘, ‘男‘, ‘119‘);    -- 编号为1、2
 84 
 85 -- 注意:DELETE 和 TRUNCATE 删除全部数据后再插入数据的区别
 86 -- 对于DELETE,删除数据后再插入数据,使用自增的字段会在删除的数据基础上继续自增
 87 -- 对于TRUNCATE,删除数据后再插入数据,从初始值重新开始
 88 
 89 -- 最简单的查询操作
 90 SELECT * FROM student;
 91 
 92 -- ########## 03、MySQL的数据类型 ##########
 93 -- 数据类型:
 94 -- 1、数值类型(使用UNSIGNED关键字修饰无符号整数,即 零 和 正整数)
 95 --         A:整数类型:
 96 --            tinyint:    1个字节(-128 ~ 127,如果使用UNSIGNED关键字范围变成0~255)
 97 --            smallint:    2个字节
 98 --            mediumint:    3个字节
 99 --            int:        4个字节
100 --            bigint:    8个字节
101 --        B:小数类型:
102 --            浮点数类型:(小数点后位数不确定)
103 --            float:
104 --            double:
105 --            精确小数类型:(小数点后位数确定,推荐使用)
106 --            decimal:decimal(最大位数,小数点后数字的位数即精度)
107 -- 2、字符串类型
108 --            char:            定长字符串
109 --            varchar:        变长字符串
110 --            tinytext:
111 --            mediumtext:
112 --            text:            文本类型
113 --            longtext:
114 -- 3、日期类型
115 --            date        : 3个字节,格式:YYYY-MM--DD
116 --            time        : 3个字节,格式:HH:ii:ss
117 --            year        : 1个字节,格式:YYYY
118 --            datetime    : 8个字节,格式:YYYY-MM--DD HH:ii:ss
119 --            timestamp    : 8个字节,格式:YYYY-MM--DD HH:ii:ss
120 -- 4、复合类型
121 --            enum类型    :枚举类型,只允许从一个集合中取出某一个值,集合最多65535个元素
122 --            set类型        :集合类型,允许从一个集合中取出多个值,集合最多64个元素
123 -- 5、二进制类型(作为了解即可)
124 --            binary
125 --            varbinary
126 --            bit
127 --            tinyblob
128 --            mediumblob
129 --            blob
130 --            longblob
131 -- ****************************************************************************
132 -- 1、数值类型
133 CREATE TABLE test_int
134 (
135     field1 TINYINT,
136     field2 TINYINT UNSIGNED
137 );
138 
139 -- 插入成功
140 INSERT INTO test_int VALUES(-3, 4);
141 -- 错误代码: 1264 Out of range value for column ‘field2‘ at row 1
142 INSERT INTO test_int VALUES(-3, -4);
143 -- 插入成功
144 INSERT INTO test_int VALUES(-128, 255);
145 -- 错误代码: 1264 Out of range value for column ‘field1‘ at row 1
146 INSERT INTO test_int VALUES(-129, 256);
147 
148 SELECT * FROM test_int;
149 
150 CREATE TABLE test_numeric
151 (
152     field1 DECIMAL(10, 2),
153     field2 FLOAT
154 );
155 
156 INSERT INTO test_numeric VALUES(123.456, 987.654);    -- field1显示为123.46
157 INSERT INTO test_numeric VALUES(123.454, 987.654);    -- field1显示为123.45
158 INSERT INTO test_numeric VALUES(123.455, 987.654);    -- field1显示为123.46
159 -- 根据上面的测试,得知,对于decimal类型的数据,小数点位数超过设置位数,但总长度没有超出设置的总位数的,按四舍五入的规则
160 
161 TRUNCATE TABLE test_numeric;
162 -- 修改test_numeric表的field1字段
163 ALTER TABLE test_numeric MODIFY field1 DECIMAL(4, 2);
164 DESC test_numeric;
165 
166 -- 根据上面的测试,得知,对于decimal类型的数据,小数点位数超过设置位数,但总长度超出设置的总位数的,无法插入成功
167 -- 错误代码: 1264 Out of range value for column ‘field1‘ at row 1
168 INSERT INTO test_numeric VALUES(123.456, 987.654);
169 
170 SELECT * FROM test_numeric;
171 
172 -- ****************************************************************************
173 -- 2、字符串类型
174 -- CHAR:定长字符串,存储字符时,按照设定好的长度进行存储,存储不足长度的字符时,不足的部分会以空格补足
175 -- VARCHAR:变长字符串,存储字符时,按照放入其中的字符内容的实际长度进行存储
176 -- 注意:MySQL处理时是按照上述的规则进行处理的,但是显示时,定长字符串不足长度的部分的空格不会显示
177 
178 CREATE TABLE test_character
179 (
180     field1 VARCHAR(4),
181     field2 CHAR(4)
182 );
183 
184 -- 左右均无空格
185 INSERT INTO test_character VALUES(‘sb‘, ‘nb‘);
186 -- 左侧有空格
187 INSERT INTO test_character VALUES(‘ sb‘, ‘ nb‘);
188 -- 右侧有空格
189 INSERT INTO test_character VALUES(‘sb ‘, ‘nb ‘);
190 -- 左右均有空格
191 INSERT INTO test_character VALUES(‘ sb ‘, ‘ nb ‘);
192 
193 -- 注意:
194 -- 以UTF-8字符集存储,一个汉字3个长度
195 -- 以GBK字符集存储,一个汉字2个长度
196 
197 -- MySQL常用的函数:
198 -- LENGTH():长度函数,统计的是标准字符个数(按一个长度计算),非标准字符个数(按字符集的不同有所不同,以UTF-8字符集存储,一个汉字3个长度)
199 -- CHAR_LENGTH():字符长度函数,统计的是字段内容中字符的个数(一个字符按一个长度计算)
200 
201 -- 从上面四条测试数据,得知,对于CHAR类型,右侧的空格不算为长度;对于VARCHAR类型,两侧空格都算为长度
202 SELECT LENGTH(field1), LENGTH(field2) FROM test_character;
203 SELECT CHAR_LENGTH(field1), CHAR_LENGTH(field2) FROM test_character;
204 
205 SELECT * FROM test_character;
206 
207 TRUNCATE TABLE test_character;
208 
209 -- 错误代码: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘field2 char(8)‘ at line 1
210 ALTER TABLE test_character MODIFY field1 VARCHAR(8), field2 CHAR(8);
211 ALTER TABLE test_character MODIFY field1 VARCHAR(8);
212 ALTER TABLE test_character MODIFY field2 CHAR(8);
213 
214 DESC test_character;
215 
216 
217 -- 左右均无空格
218 INSERT INTO test_character VALUES(‘sb朝鲜‘, ‘nb天朝‘);
219 -- 左侧有空格
220 INSERT INTO test_character VALUES(‘ sb朝鲜‘, ‘ nb天朝‘);
221 -- 右侧有空格
222 INSERT INTO test_character VALUES(‘sb朝鲜 ‘, ‘nb天朝 ‘);
223 -- 左右均有空格
224 INSERT INTO test_character VALUES(‘ sb朝鲜 ‘, ‘ nb天朝 ‘);
225 
226 
227 SELECT LENGTH(field1), LENGTH(field2) FROM test_character;
228 SELECT CHAR_LENGTH(field1), CHAR_LENGTH(field2) FROM test_character;
229 
230 -- 错误代码: 1406 Data too long for column ‘field1‘ at row 1
231 -- 定义的field1、field2的长度指的是字符长度
232 INSERT INTO test_character VALUES(‘中华人民共和国万岁‘, ‘中华人民共和国万岁‘);
233 
234 SELECT * FROM test_character;
235 
236 -- ****************************************************************************
237 -- 3、日期类型
238 CREATE TABLE test_date_time
239 (
240     field1 DATE,
241     field2 DATETIME
242 );
243 
244 INSERT INTO test_date_time VALUES(‘2016-09-21‘, ‘2016-09-21 10:55:30‘);
245 INSERT INTO test_date_time VALUES(‘20160921‘, ‘20160921105530‘);
246 INSERT INTO test_date_time VALUES(‘1816-09-21‘, ‘1816-09-21 10:55:30‘);
247 -- 错误代码: 1292 Incorrect date value: ‘1816-13-32‘ for column ‘field1‘ at row 1
248 INSERT INTO test_date_time VALUES(‘1816-13-32‘, ‘18161332256162‘);
249 
250 -- MySQL常用的函数:
251 -- CURRENT_DATE()函数:获取当前的日期
252 -- CURRENT_TIMESTAMP()函数:获取当前的日期和时间
253 -- NOW()函数:获取当前的日期和时间
254 INSERT INTO test_date_time VALUES(CURRENT_DATE(), CURRENT_TIMESTAMP());
255 INSERT INTO test_date_time VALUES(CURRENT_DATE(), NOW());
256 
257 SELECT * FROM test_date_time;
258 
259 -- ****************************************************************************
260 -- 4、复合类型
261 CREATE TABLE test_enum_set
262 (
263     field1 ENUM(‘男‘, ‘女‘),
264     field2 SET(‘听音乐‘, ‘玩游戏‘, ‘运动‘, ‘购物‘)
265 );
266 
267 DESC test_enum_set;
268 
269 INSERT INTO test_enum_set VALUES(‘男‘, ‘听音乐,玩游戏‘);
270 -- 错误代码: 1265 Data truncated for column ‘field1‘ at row 1
271 INSERT INTO test_enum_set VALUES(‘男,女‘, ‘听音乐,玩游戏‘);
272 -- 错误代码: 1265 Data truncated for column ‘field1‘ at row 1
273 -- 注意:复合类型对于插入的数据内容可以进行限制
274 INSERT INTO test_enum_set VALUES(‘男孩‘, ‘听音乐,玩游戏‘);
275 
276 -- 插入SET类型的字段的值和设置的值的顺序不一致,也可以正常插入
277 -- 但是显示时,以设置的值得顺序为准,从中挑选选中的值显示
278 INSERT INTO test_enum_set VALUES(‘女‘, ‘购物,听音乐‘);
279 
280 SELECT * FROM test_enum_set;
281 
282 -- ****************************************************************************
283 -- 数据库学习中的重点和难点:DQL查询语句
284 
285 -- # 查询语句关键字执行顺序图
286 (8)SELECT (9)DISTINCT <select_list>
287 (1)FROM <left_table>
288 (3)<join_type> JOIN <right_table>
289 (2)ON <join_condition>
290 (4)WHERE <where_condition>
291 (5)GROUP BY <group_by_list>
292 (6)WITH {CUBE|ROLLUP}
293 (7)HAVING <having_condition>
294 (10)ORDER BY <order_by_list>
295 (11)LIMIT <limit_number>;
296 
297 -- ########## 04、MySQL的基本查询 ##########
298 -- 全能通配符:* 匹配所有的字段
299 SELECT * FROM student;
300 
301 -- 注意:在实际工作中,不建议使用*星号通配符,因为效率较低
302 -- 推荐使用指定列的形式(即指明要查询的属性列):SELECT COLUMNLIST FROM 表名;
303 
304 -- 查询全部列
305 SELECT studentid, studentname, gender, phone FROM student;
306 
307 -- 查询部分列
308 SELECT studentname, gender, phone FROM student;
309 
310 -- 注意:表的字段名一般不包含空格,如果字段名中有空格,那么在查询属性列时,需要使用重音符``包在字段名外
311 -- 形如:`有空格的字段名`
312 
313 -- ########## 05、MySQL的直接量 ##########
314 -- 直接量:选择特定的值作为一列,该值和表中的数据没有直接的关系
315 
316 SELECT ‘China‘;
317 SELECT 123;
318 SELECT ‘中国安徽‘, studentname FROM student;
319 
320 -- 注意:在执行表的查询时使用直接量,会在得到的结果行的每一行都重复出现直接量(根据查询的执行顺序)
321 
322 -- 算术运算(+-*/%)
323 SELECT 1+2;
324 SELECT 6-4;
325 SELECT 3*5;
326 SELECT 7/3;        -- 2.3333
327 SELECT 7%3;        -- 1
328 
329 -- MySQL的常用函数:
330 -- CONCAT:字符连接函数,用于连接字段,CONCAT(连接内容1, 连接内容2, ... 连接内容n)
331 SELECT CONCAT(‘中国‘, ‘安徽‘);
332 SELECT CONCAT(2, 1, 4);
333 
334 -- ########## 06、AS起别名 ##########
335 SELECT * FROM student;
336 
337 -- 1、使用AS:给字段起别名,格式:字段名 AS 别名
338 -- 使用场景:字段名难以识别
339 SELECT studentname AS 学生姓名, phone AS 联系电话 FROM student;
340 
341 -- 2、使用AS:给表起别名,格式:表名 AS 别名
342 -- 使用场景:表名很长或者需要更清晰的区分表名时或者查询的列存在重名时
343 
344 -- 给表起了别名,但是对于字段不使用表的别名(在没有出现重复的字段列时)没有问题
345 SELECT studentname, phone FROM student AS t1;
346 
347 -- 给表起了别名,并对字段使用表的别名,在出现重复的字段列时,可以清楚的区分是哪一个表的字段
348 SELECT t1.`studentname`, t1.`phone` FROM student AS t1;
349 
350 -- 如下两种写法可以理解为:别名就是表自身
351 SELECT student.`studentname`, student.`phone` FROM student;
352 SELECT student.`studentname`, student.`phone` FROM student AS student;
353 
354 -- 可以同时对字段和表使用别名
355 SELECT t1.`studentname` AS 学生姓名, t1.`phone` AS 联系电话 FROM student AS t1;
356 
357 -- 对字段和表起别名时,也可以省略掉AS关键字,但是不能省略原名 和 别名 之间的空格
358 SELECT t1.`studentname` 学生姓名, t1.`phone` 联系电话 FROM student t1;
359 
360 -- 注意:经过对比,显然使用AS起别名的形式可读性更好,强制使用这种
361 
362 -- ########## 07、常用函数 ##########
363 -- 1、字符函数:
364 -- LEFT()、RIGHT()、SUBSTRING()、SUBSTR()、LENGTH()、CHAR_LENGTH()、LTRIM()、RTRIM()、TRIM()、CONCAT()、UPPER()、LOWER()
365 SELECT LEFT(‘java‘, 3) AS 左截取;            -- jav
366 SELECT LEFT(‘不明觉厉‘, 3) AS 左截取;        -- 不明觉
367 
368 SELECT RIGHT(‘java‘, 3) AS 右截取;            -- ava
369 SELECT RIGHT(‘不明觉厉‘, 3) AS 右截取;        -- 明觉厉
370 
371 -- SUBSTRING()函数的第2个参数表示从哪一个位置开始,左侧的起始位置为1
372 SELECT SUBSTRING(‘temptation‘, 3) AS 子串;    -- mptation
373 SELECT SUBSTRING(‘temptation‘, 1) AS 子串;    -- temptation
374 SELECT SUBSTRING(‘temptation‘, 0) AS 子串;    -- 无内容
375 
376 SELECT SUBSTRING(‘temptation‘, 3, 5) AS 子串;    -- mptat
377 SELECT SUBSTRING(‘temptation‘, 3, 0) AS 子串;    -- 无内容
378 SELECT SUBSTRING(‘temptation‘, 3, -1) AS 子串;    -- 无内容
379 SELECT SUBSTRING(‘temptation‘, 3, 10) AS 子串;    -- mptation
380 
381 -- SUBSTR()函数,效果和SUBSTRING()函数一致
382 SELECT SUBSTR(‘temptation‘, 3) AS 子串;    -- mptation
383 SELECT SUBSTR(‘temptation‘, 1) AS 子串;    -- temptation
384 SELECT SUBSTR(‘temptation‘, 0) AS 子串;    -- 无内容
385 
386 SELECT SUBSTR(‘temptation‘, 3, 5) AS 子串;    -- mptat
387 SELECT SUBSTR(‘temptation‘, 3, 0) AS 子串;    -- 无内容
388 SELECT SUBSTR(‘temptation‘, 3, -1) AS 子串;    -- 无内容
389 SELECT SUBSTR(‘temptation‘, 3, 10) AS 子串;    -- mptation
390 
391 -- LENGTH()函数 和 CHAR_LENGTH()函数参见数据类型中的讲解
392 
393 SELECT LENGTH(‘ temp tation ‘) AS 原始长度;
394 
395 -- LTRIM()函数:去除左侧空格
396 SELECT LTRIM(‘ temp tation ‘) AS 去除左侧空格;
397 SELECT LENGTH(LTRIM(‘ temp tation ‘)) AS 去除左侧空格后的长度;
398 
399 -- RTRIM()函数:去除右侧空格
400 SELECT RTRIM(‘ temp tation ‘) AS 去除右侧空格;
401 SELECT LENGTH(RTRIM(‘ temp tation ‘)) AS 去除右侧空格后的长度;
402 
403 -- 需求:去除两侧空格
404 -- 写法1、综合使用LTRIM()函数 和 RTRIM()函数
405 SELECT LTRIM(RTRIM(‘ temp tation ‘)) AS 去除两侧空格;
406 SELECT LENGTH(LTRIM(RTRIM(‘ temp tation ‘))) AS 去除两侧空格后的长度;
407 -- 写法2、使用TRIM()函数
408 SELECT TRIM(‘ temp tation ‘) AS 去除两侧空格;
409 SELECT LENGTH(TRIM(‘ temp tation ‘)) AS 去除两侧空格后的长度;
410 
411 -- UPPER()函数:全部大写
412 SELECT UPPER(‘Temptation‘) AS 全部大写;
413 
414 -- LOWER()函数:全部小写写
415 SELECT LOWER(‘TempTation‘) AS 全部小写;
416 
417 -- 2、日期/时间函数
418 -- NOW()、CURRENT_DATE()、CURRENT_TIME()、CURRENT_TIMESTAMP()、DATE_FORMART()、DATEDIFF()
419 SELECT CURRENT_DATE() AS 当前日期;        -- 2016-09-21
420 SELECT CURRENT_TIME() AS 当前时间;        -- 15:20:48
421 SELECT CURRENT_TIMESTAMP() AS 当前日期和时间;    -- 2016-09-21 15:20:48
422 SELECT NOW() AS 当前日期和时间;            -- 2016-09-21 15:20:48
423 
424 -- DATE_FORMART()对日期时间进行格式化
425 -- DATE_FORMART()常用格式:
426 SELECT DATE_FORMAT(NOW(), ‘%y‘) AS 年份;    -- 16
427 SELECT DATE_FORMAT(NOW(), ‘%m‘) AS 月份;    -- 09
428 SELECT DATE_FORMAT(NOW(), ‘%d‘) AS 天;        -- 21
429 SELECT DATE_FORMAT(NOW(), ‘%Y‘) AS 完整年份;    -- 2016
430 SELECT DATE_FORMAT(NOW(), ‘%M‘) AS 英文月份;    -- September
431 SELECT DATE_FORMAT(NOW(), ‘%D‘) AS 天的序数词;    -- 21st
432 
433 SELECT DATE_FORMAT(NOW(), ‘%h‘) AS 小时(12小时制);    -- 03
434 SELECT DATE_FORMAT(NOW(), ‘%i‘) AS 分钟;    -- 25
435 SELECT DATE_FORMAT(NOW(), ‘%s‘) AS 秒;        -- 32
436 SELECT DATE_FORMAT(NOW(), ‘%H‘) AS 小时(24小时制);    -- 15
437 SELECT DATE_FORMAT(NOW(), ‘%I‘) AS 分钟;    -- 没有这种形式
438 SELECT DATE_FORMAT(NOW(), ‘%S‘) AS 秒;        -- 53
439 
440 -- DATEDIFF()函数计算间隔天数,结果 = 第1个参数 - 第2个参数
441 SELECT DATEDIFF(NOW(), ‘2016-09-20‘) AS 间隔天数;    -- 1
442 SELECT DATEDIFF(NOW(), ‘2016-09-22‘) AS 间隔天数;    -- -1
443 SELECT DATEDIFF(NOW(), ‘2016-09-10‘) AS 间隔天数;    -- 11
444 SELECT DATEDIFF(NOW(), ‘2015-02-14‘) AS 间隔天数;    -- 585
445 SELECT DATEDIFF(NOW(), ‘2016-09-21‘) AS 间隔天数;    -- 0
446 
447 -- 3、数值函数
448 -- ROUND()、RAND()、PI()
449 
450 -- ROUND()函数:获取四舍五入的结果
451 -- A:只有一个参数,那么按照整数部分进行四舍五入
452 -- B:有两个参数,那么小数部分按照第2个参数的位数进行四舍五入,如果小数部分计算完毕就推到整数部分进行计算
453 SELECT ROUND(123);        -- 123
454 SELECT ROUND(125);        -- 125
455 SELECT ROUND(123.456);        -- 123
456 SELECT ROUND(123.567);        -- 124
457 SELECT ROUND(123.678);        -- 124
458 
459 SELECT ROUND(123.456, 3);    -- 123.456
460 SELECT ROUND(123.456, 2);    -- 123.46
461 SELECT ROUND(123.455, 2);    -- 123.46
462 SELECT ROUND(123.454, 2);    -- 123.45
463 SELECT ROUND(123.456, 1);    -- 123.5
464 SELECT ROUND(123.456, 0);    -- 123
465 SELECT ROUND(123.456, -1);    -- 120
466 
467 -- RAND()函数:每次随机出不同的值,范围在0~1之间
468 SELECT RAND();
469 -- RAND(参数)函数:范围在0~1之间,但是每次随机出的是相同的那个随机数
470 SELECT RAND(123);    -- 0.9277428611440052
471 SELECT RAND(120);    -- 0.17719353286288075
472 
473 -- PI()函数:获取圆周率
474 SELECT PI();        -- 3.141593
475 
476 -- 需求:如何获取圆周率的小数点后两位,形如:3.14
477 SELECT ROUND(PI(), 2) AS 获取圆周率的小数点后两位;
478 SELECT SUBSTRING(PI(), 1, 4) AS 获取圆周率的小数点后两位;
479 SELECT SUBSTR(PI(), 1, 4) AS 获取圆周率的小数点后两位;
480 SELECT LEFT(PI(), 4) AS 获取圆周率的小数点后两位;
481 
482 -- 4、转换函数
483 -- CAST()、IFNULL()
484 
485 -- CAST()函数:将某个表达式转换为某种类型,格式:CAST(Expression AS DataType)
486 SELECT ‘2016-09-21‘ AS 日期, CAST(‘2016-09-21‘ AS DATETIME) AS 日期和时间;    -- 2016-09-21   2016-09-21 00:00:00
487 SELECT CAST(‘2016ABCD‘ AS DATETIME) AS 日期和时间;                            -- (NULL)
488 
489 -- IFNULL()函数:判断字段内容为NULL时做什么处理,格式:IFNULL(字段名, 替换值)
490 DESC student;
491 SELECT * FROM student;
492 -- 查看一下student表,电话可以为NULL
493 INSERT INTO student VALUES(NULL, ‘荀彧‘, ‘男‘, NULL);
494 
495 SELECT studentname AS 学生姓名, IFNULL(phone, ‘未知号码‘) AS 联系电话 FROM student;

 

mysql<二>