网站建设的实验的结论,网站开发电脑,手机小程序制作,嘉兴自助建站软件《MySQL必知必会》#xff08;点击查看详情#xff09;1、写在前面的话这本书是一本MySQL的经典入门书籍#xff0c;小小的一本#xff0c;也受到众多网友推荐。之前自己学习的时候是啃的清华大学出版社的计算机系列教材《数据库系统概论》#xff0c;基础也算是半罐水点击查看详情1、写在前面的话这本书是一本MySQL的经典入门书籍小小的一本也受到众多网友推荐。之前自己学习的时候是啃的清华大学出版社的计算机系列教材《数据库系统概论》基础也算是半罐水糊里糊涂知识点欠缺梳理。于是也算是借此机会从这本书对数据库和SQL部分的知识点进行梳理记录一下基础的关键的东西也便于以后翻阅查询好了就不叨叨了。2、MySQL基本操作命令输入在 mysql 之后命令用或 \g 结束仅按Enter不执行命令输入 help 获得帮助输入 quit 或 exit 退出命令行实用程序{ }花括号中的内容表示实际内容而非此处的固定字符。操作命令进入MySQL 安装目录的bin下打开命令行输入mysql -u {yourAccountName} -p显示现有数据库 show databases;选择数据库 use {databaseName};显示已选数据库的表show tables;显示列字段show columns from {tableName}; 或 describe {tableName};显示授权用户的安全权限show grants;3、基本查询 SELECT操作 语法查询单列 SELECT {columnName} FROM {tableName};查询多列 SELECT {columnName1, columnName2} FROM {tableName};查询所有列 SELECT * FROM {tableName};其他关键字AS放在字段名后或表名后表示别名e.g. SELECT {newTableName}.{columnName} AS {newColumnName} FROM {tableName} as {newTableName};e.g. SELECT b.author as zuozhe FROM books as b;DISTINCT放在SELECT之后字段名之前表示互异使SQL对任何元组只生成一份副本且应用于所有列e.g. SELECT DISTINCT {columnName} FROM {tableName};ORDER BY排序BY后面跟字段名默认为升序从小到大排列多个排序规则用逗号隔开依次满足条件e.g. SELECT * FROM fruits ORDER BY price;DESC配合ORDER BY表示降序排列放在字段名后限制单列e.g. SELECT * FROM fruits ORDER BY price DESC;LIMIT beginColumnNum, ColumnAmount限制结果指定输出从beginColumnNum开始的索引从0开始而不是1的ColumnAmount行记录常用于分页e.g. SELECT * FROM {tableName} LIMIT 5, 10 输出表中包括第6行开始的10条数据另外SQL语句不分大小写为了便于阅读可以将所有关键字大写列和表名采用小写SQL语句可以分一行给出也可以分成多行不需要查询出明确的列时尽量采用通配符 * 可以提高性能。4、条件查询 WHERE为了获取特定的结果而指定条件SQL中根据WHERE子句中指定的搜索条件进行过滤WHERE跟在表名FROM子句之后。基本操作符1说明等于 不等于 !不等于 小于 小于等于 大于 大于等于 BETWEEN指定两值之间含开始和结束配合ANDBETWEEN valA AND valBIS NULL 空值检查注意表示要查询某字段为空值不能使用NULL或NULL而是IS NULL或IS NOT NULL基本操作符2说明AND “与”同时过滤多个条件子句OR “或”配合检索匹配任一条件的记录NOT “非”否定它之后所跟着的条件常配合IN、BETWEEN、EXISTS等IN 指定条件范围多值之间逗号隔开功能类似OR注意NOT优先级高于ANDAND优先级高于OR5、模糊查询 LIKE用于查询包含某个关键字的记录。操作符说明LIKE 表示搜索模式利用通配符匹配通配符说明%不限长度的字符序列匹配_单个字符的序列匹配转义符说明\表示某些特殊符号如‘\%’表示匹配百分号字符而不是通配符6、分组查询 GROUP BY 关键字说明GROUP BY根据字段进行分组必须在WHERE子句之后ORDER之前HAVING过滤分组用法类似于WHERE但分组只能用HAVING不能用WHERE注意GROUP BY 可以包含多列即分组嵌套且嵌套后数据在最后规定的分组上进行汇总分组列如果有NULL则NULL会作为一个分组返回多行NULL将分为一组GROUP BY 如果用于输出实际只会输出每组首行而不是全部7、聚合函数函数说明COUNT()求行数在使用 * 通配符时才不会忽略NULL值的行 AVG() 求平均值自动忽略NULL值的行MAX()求最大值自动忽略NULL值的行MIN() 求最小值自动忽略NULL值的行SUM() 求和自动忽略NULL值的行注意以上的算值函数可以利用算术符作用多列其含义是类似 “SELECT MAX(price*amount) FROM fruits” 如此用法以上5种聚合函数在MySQL 5.0 版本之后其括号中的表达式可以使用前缀关键字DISTINCT聚合函数多配合分组GROUP BY使用8、子查询子查询即嵌套在其他查询中的查询。在SELECT语句中子查询总是从内向外分步进行处理。8.1 子查询过滤SELECT cust_id
FROMorders
WHEREorder_num IN
(
SELECTorder_num
FROMorderitems
WHEREprod_id TNT2
)141SELECT 2 cust_id3FROM4 orders5WHERE6 order_num IN 7(8SELECT9 order_num10FROM11 orderitems12WHERE13 prod_id TNT214)子查询应与WHERE匹配相同数量的列通常是单个列匹配结合IN等关键字使用8.2 子查询作为计算字段SELECTcust_name,cust_state,(SELECTCOUNT(*)FROMordersWHEREorders.cust_id customers.cust_id) AS orders
FROMcustomers
ORDER BY cust_name141SELECT2 cust_name,3 cust_state,4 (5 SELECT6 COUNT(*)7 FROM8 orders9 WHERE10 orders.cust_id customers.cust_id11 ) AS orders12FROM13 customers14ORDER BY cust_name涉及外部查询的子查询叫做相关子查询每次取外部查询的值和子查询所有行分别匹配再取外部查询下一行和子查询匹配循环至结束子查询可以逐步建立用来进行测试和调试这是很有技巧性的9、创建计算字段直接从数据库中检索出转换、计算或格式化过后的数据而不是检索出数据然后再到客户机程序中重新格式化。9.1 拼接字段输出指定格式如vendors供应商表包含name和location希望name按照name(location)格式输出使用Concat函数多数DBMS使用 或 || 实现拼接而MySQL使用Concat()实现SELECTConcat(vend_name, (, vend_country, ))
FROMvendors
ORDER BY vend_name;51SELECT2 Concat(vend_name, (, vend_country, ))3FROM4 vendors5ORDER BY vend_name;Concat()拼接串把多个串连接起来形成长串各串之间用逗号隔开。还可以用类似去空格函数对数据进行进一步的整理RTrim()删除数据右侧多余的空格同理LTrim()删除左侧多余的空格Trim()删除两端的空格SELECTConcat(RTrim(vend_name), (, RTrim(vend_country), )) AS vend_title
FROMvendors
ORDER BY vend_name;51SELECT2 Concat(RTrim(vend_name), (, RTrim(vend_country), )) AS vend_title3FROM4 vendors5ORDER BY vend_name;9.2 执行算术计算可以针对检索出来的数据直接进行基本的算术计算加减乘除如SELECTprod_id,quantity,item_price,quantity*item_price AS expanded_price
FROMorderitems
WHEREorder_num 20005;91SELECT2 prod_id,3 quantity,4 item_price,5 quantity*item_price AS expanded_price6FROM7 orderitems8WHERE9 order_num 20005;10、处理数据的函数写在前面的话SQL语句的通用性很强可以说是可移植的虽然部分数据库之间存在差异可是通常并不是那么难以处理。但是函数的可移植性就比较差了几乎每种主要的DBMS的实现都支持其他实现不支持的函数有时候差异还很大。如果你决定在SQL中使用函数应该确保做好代码注释以便将来你或者他人能确切地知道SQL代码的含义。10.1 文本处理函数Left() 返回串左边的字符Length() 返回串的长度 Locate() 找出串的一个子串Lower() 将串转换为小写 LTrim() 去掉串左边的空格 Right() 返回串右边的字符 RTrim() 去掉串右边的空格 Soundex() 返回串的soundex值将任何文本串转换为描述其语音表示的字母数字模式你可以理解为变成读音p70SubString() 返回子川的字符 Upper()将串转换为大写10.2 日期和时间处理函数写在前面的话MySQL使用的日期格式无论什么时候都必须为 yyyy-mm-dd虽然其他日期格式可能也行但是这个是首选日期格式。AddDate() 增加一个日期天、周等 AddTime() 增加一个时间时、分等 CurDate() 返回当前日期 CurTime() 返回当前时间Date() 返回日期时间的日期那部分 DateDiff() 计算两个日期之差 Date_Add() 高度灵活的日期运算函数 Date_Format() 返回一个格式化的日期或时间串 Day() 返回一个日期的天数部分 DayOfWeek() 对于一个日期返回对应的星期几 Hour() 返回一个时间的小时部分 Minute() 返回一个时间的分钟部分 Month() 返回一个日期的月份部分 Now() 返回当前日期和时间 Second() 返回一个时间的秒部分 Time() 返回一个日期时间的时间部分 Year() 返回一个日期的年份部分 WHERE order_date 2005-09-01 可靠吗假如时间是 2005-09-01 11:30:05则该匹配会失败如果我们使用Date()提取日期部分则 WHERE Date(order_date) 2005-09-01 则更可靠了。检索某年2月的所有数据WHERE Date(order_date) BETWEEN 2005-02-01 AND 2005-02-28这种方式可行但是需要你自己去计算是闰年还是平年以确定这个月份到底有多少天比较麻烦实际上你可以用更简单的方式WHERE Year(order_date) 2005 AND Month(order_date) 9;10.3 数值处理数值处理一般用于代数、三角或几何运算使用并不频繁Abs() 返回一个数的绝对值 Cos() 返回一个角度的余弦 Exp() 返回一个数的指数值 Mod() 返回除操作的余数 Pi() 返回圆周率π Rand() 返回一个随机数 Sin() 返回一个角度的正弦 Sqrt() 返回一个数的平方根 Tan() 返回一个角度的正切11、用正则表达式进行搜索正则表达式的作用是匹配文本其概念和基本使用可以参考在JS篇中的一篇博客《03标准对象-02-RegExp 正则表达式》这跟在JS还是在SQL里都没有关系因为几乎所有种类的程序设计语言、文本编辑器和操作系统等都支持正则表达式。正则表达式在SQL中使用时要使用REGEXP关键字Regular Expression正则表达式用法类似LIKESELECTprod_name
FROMproducts
WHEREprod_name REGEXP .000
ORDER BY prod_name;71SELECT2 prod_name3FROM4 products5WHERE6 prod_name REGEXP .0007ORDER BY prod_name;上条SQL你可以得到价格尾数带000的记录如1000或2000都会得到匹配返回。除了在延伸阅读的博客里的内容还有一些需要提到的不同的1匹配特殊字符用\\为前导如希望查找 -要使用\\- 正则一般只用一个\做转义但MySQL要求两个因为它自己要解释一个正则要解释一个2匹配字符类[:alnum:] 任意字母和数字同[a-zA-Z0-9][:alpha:] 任意字符同[a-zA-Z][:blank:] 空格和制表[:cntrl:]ASCII控制字符[:digit:]任意数字[:graph:]与print相同但不包括空格[:lower:]任意小写字母[:print:]任意可打印字符[:punct:]既不在[:alnum:]也不在[:cntrl:]中的任意字符[:space:]包括空格在内的任意空白字符[:upper:]任意大写字母[:xdigit:]任意十六进制数字同[a-fA-F0-9]一个例子SELECTprod_name
FROMproducts
WHEREprod_name REGEXP \\([0-9] sticks?\\)
ORDER BY prod_name;1SELECT2 prod_name3FROM4 products5WHERE6 prod_name REGEXP \\([0-9] sticks?\\)7ORDER BY prod_name;输出结果TNT (1 stick)TNT (5 sticks)12、其他12.1 SELECT子句的顺序SELECTFROMWHEREGROUP BYHAVINGORDER BYLIMIT转载于:https://www.cnblogs.com/deng-cc/p/6534872.html