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;