1.添加记录
INSERT [INTO] tbl_name [(col_name,...)] {VALUE|VALUES}(VALUES...);
不指定字段名称
INSERT tbl_name VALUE (value)
需要按照建表时的字段顺序给每一个字段赋值列出指定字段
INSERT tbl_name(字段名称...) VALUES (值...)
INSERT … SET的形式
INSERT tbl_name SET 字段名称=值,...;
eg.
INSERT user SET username='d',age=45,email='[email protected]';
INSERT … SELECT的形式
INSERT tbl_name [(字段名称...)] SELECT 字段名称,... FROM tbl_name [WHERE 条件];
一次添加多条记录
INSERT tbl_name [(字段名称,...)] VALUES (值,...),(值...),(值...)
2.修改记录
UPDATE tbl_name SET 字段名称=值,字段名称=值 [WHERE 条件]
#如果不添加条件,整个表中的记录都会被更新
3.删除记录
DELETE FROM tbl_name [WHERE 条件]
#如果不添加条件,整个表中的记录都会被删除
- 使用DELETE清空数据表的时候不会重置AUTO_INCREMENT的值,可以通过ALTER语句将其重置
- 查看当前自增长内容的编号
SHOW CREATE TABLE tbl_name;
- 修改当前表中自增长的编号的值
ALTER TABLE tbl_name AUTO_INCREMENT=1;
- 查看当前自增长内容的编号
- 彻底清空数据表
TRUNCATE [TABLE] tbl_name;
- 清空表中所有记录
- 重置AUTO_INCREMENT的值
4.查询记录
SELECT select_expr,... FROM tbl_name
[WHERE 条件]
[GROUP BY {col_name|position} HAVING 二次筛选]
[ORDER BY {col_name|position|expr} [ASC|DESC]]
[LIMIT 限制结果集的显示条数]
查询表中所有记录
SELECT * FROM tbl_name;
查询指定字段信息
SELECT 字段名称 FROM tbl_name;
不用打开数据库,直接传指定库中的表的信息
SELECT * FROM database_name.tbl_name;
给字段起别名
SELECT 字段名称 [AS] 别名名称 FROM db_name.tbl_name;
eg.
SELECT id AS '编号',username AS '用户名',sex AS '性别' FROM user1;
给数据表起别名
SELECT 字段名称,... FROM tbl_name [AS] 别名;
表名.字段名的形式
SELECT tbl_name.col_name,... FROM tbl_name;
WHERE条件用于筛选出符合条件的记录
比较运算符> >= < <= != <> <=> 【注意:
<=> NULL 和is NULL
检测是否为NULL值】=和<=>的区别:<=>可以检测NULL值。
可以使用
IS [NOT] NULL
检测值是否为NULL或者NOT NULL指定范围
[NOT] BETWEEN ... AND
指定集合
[NOT] IN (值1,...)
逻辑运算符
AND逻辑与 OR逻辑或
匹配字符
[NOT] LIKE
%通配符匹配任意长度的字符串
- _通配符匹配任意一个字符
eg.
#查询用户长度为三位的用户 SELECT id,username,age,sex FROM user1 WHERE username LIKE '___'; #%与_混合使用,查询姓张且有一个或多个名的用户 SELECT * FROM user1 WHERE username LIKE '张_%';
GROUP BY 分组
把值相同放到一个组中,最终查询出的结果只会显示组中一条记录
分组配合
GROUP_CONCAT()
查看组中某个字段的详细信息
eg. #分组查看信息,使用GROUP_CONCAT()将该组对应字段的内容全部输出 SELECT GROUP_CONCAT(username),age,sex,addr FROM user1 GROUP BY sex;
配合聚合函数使用
- COUNT():统计记录总数
#COUNT(*)和COUNT(字段名)的区别 COUNT(字段名)当对应记录为null时,记录个数不算在内 COUNT(*)会统计null的记录
SUM():求和
MAX():求最大值
MIN():求最小值
AVG():求平均值
配合
WITH ROLLUP
关键字使用:会在记录末尾添加一条记录,是上面所有记录的总和按照字段的位置来分组
SELECT id,sex,GROUP_CONCAT(username) AS usersDetail,COUNT(*) AS totalUsers FROM user1 GROUP BY 1;#相当于GROUP BY id,即以第一个查询内容的位置进行排序
- HAVING子句对分组结果进行二次筛选
#对分组后的结果只保留总人数大于3的记录 SELECT addr,GROUP_CONCAT(username) AS usersDetail,COUNT(*) AS totalUsers FROM user1 GROUP BY addr HAVING totalUsers >=3;
ORDER BY排序:
ORDER BY 字段名称 ASC|DESC
按照多个字段排序
ORDER BY 字段名称1 ASC|DESC,字段名称2 ASC|DESC;
实现随机记录(通过RAND()函数)
SELECT id,username,age FROM user1 ORDER BY RAND();
LIMIT限制结果集显示条数
LIMIT值:显示结果集的前几条记录
LIMIT offset,row_count:从offset开始,显示row_count条记录[offset从0开始]
#显示user表中前5条记录 SELECT * FROM user LIMIT 5; #或 SELECT * FROM user LIMIT 0,5;
5.多表连接
笛卡尔积的形式[得到表1记录*表2记录长度的表]
eg. SELECT emp.id,emp.username,emp.age,dep.depName FROM emp,dep;#结果为emp记录数*dep记录数
内连接的形式
查询两个表中符合连接条件的记录
语法
SELECT 字段名称,... FROM tbl_name1 INNER JOIN tbl_name2 ON 连接条件
- 举例
SELECT e.id,e.username,e.age,d.depName FROM emp AS e [INNER] JOIN dep AS d ON e.depId=d.id;
外连接的形式
- 左外连接[先显示左表中的全部记录,再去右表中查询符合条件的记录,不符合的以NULL值代替]
SELECT 字段名称,... FROM tbl_name1 LEFT [OUTER] JOIN tbl_name2 ON 条件;
- 右外连接[先显示右表中的全部记录,再去左表中查询符合条件的记录,不符合的以NULL值代替]
SELECT 字段名称,... FROM tbl_name1 RIGHT [OUTER] JOIN tbl_name2 ON 条件;
6.外键约束
只有InnoDB存储引擎支持外键
保证数据的一致性和完整性
创建外键
- 建表时指定外键
[CONSTRAINT 外键名称]FOREIGN KEY(字段名称) REFERENCES 主表(字段名称)
注意:
(1)子表的外键字段和主表的主键字段类型要相似;如果是数值型要求一致,并且无符号也要一致;如果是字符型,要求类型一致,长度可以不同。
(2)如果外键字段没有创建索引,MySQL会自动帮我们添加索引。
(3)子表的外键关联的必须是父表的主键。
(4)外键约束的参照操作:CASCADE从父表删除或更新,子表也跟着删除或更新,级联的操作;SET NULL从父表删除或者更新记录,并设置子表的外键列为NULL;NO ACTION|RESTRICT拒绝对父表做更新或删除操作(默认)
ALTER TABLE news ADD FOREIGN KEY(cateId) REFERENCES new_cate(id) ON DELETE CASCADE ON UPDATE CASCADE
- 动态添加外键
ALTER TABLE tbl_name ADD [CONSTRAINT 外键名称] FOREIGN KEY(外键字段) REFERENCES 主表(主键字段)
- 动态添加外键之前表中的记录一定是合法的记录,没有脏值,否则外键添加不成功
删除外键
- 动态删除外键
ALTER TABLE tbl_name DROP FOREIGN KEY fk_name;
7.特殊形式的查询
子查询
SELECT 字段名称 FROM tbl_name WHERE col_name = (SELECT col_name FROM tbl_name); SELECT 字段名称 FROM tbl_name WHERE col_name IN (SELECT col_name FROM tbl_name);
内层语句查询的结果,可以作为外层语句查询的条件
由IN引发的子查询
由比较运算符引出子查询
由EXISTS引发的子查询(看EXISTS后面的语句真假进行判断)
SELECT * FROM emp WHERE EXISTS(SELECT depName from dep WHERE id=10);
- ANY SOME ALL
关键字 | ANY | SOME | ALL |
---|---|---|---|
> >= |
最小值 | 最小值 | 最大值 |
< <= |
最大值 | 最大值 | 最小值 |
= |
任意值 | 任意值 | |
<> != |
任意值 |
* INSERT…SELECT
* CREATE…SELECT
* CREATE TABLE tbl_name1 LIKE tbl_name2(创建跟表2一样表结构的表1)
eg.
#创建一个user1表,id username
CREATE TABLE user1(
id int UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20)
)SELECT id,username FROM emp;
#将user表中的用户名写入到user1表中
INSERT user1(username) SELECT username FROM user;
#将stu表中天才用户名添加到user2表中
INSERT user2 SET username = (SELECT username FROM stu WHERE id=9);
去掉重复值,使用关键字
distinct
联合查询
- UNION(合并重复记录的联合查询)
SELECT 字段名称,... FROM tbl_name1 UNION SELECT 字段名称,... FROM tbl_name2;
- UNION ALL(不合并重复记录的联合查询)
SELECT 字段名称,... FROM tbl_name1 UNION ALL SELECT 字段名称,... FROM tbl_name2;
- UNION ALL是简单的合并,UNION会去掉表中的重复记录
自身连接查询
无限级分类的实现形式
- 表如下【pid为0表示顶级分类,其他表示对应分类下的子分类】
id cateName pid 1 服装 0 2 数码 0 3 男装 1 4 女装 1 5 电视 2 6 液晶电视 5 7 等离子电视 5 - 自身连接查询如下
eg. #查询所有的分类信息,并且得到其父分类 SELECT s.id,s.cateName AS sCateName,p,cateName AS pCateName FROM cate AS s LEFT JOIN cate AS p ON s.pid=p.id; #查询所有的分类及其子分类 SELECT p.id,p,cateName AS pCateName,s.cateName AS sCateName FROM cate AS s RIGHT JOIN cate AS p ON s.pid=p.id; #查询所有的分类并且得到子分类的数目 SELECT p.id,p.cateName AS pCateName,count(s.pCateName) AS count FROM cate AS s RIGHT JOIN cate AS p ON s.pid=p.id GROUP BY p.cateName ORDER BY id ASC;
8.MYSQL常用函数
数学函数
CEIL()
进一取整FLOOR()
舍掉小数部分ROUND()
四舍五入TRUNCATE()
截取小数点后几位MOD()
取余数ABS()
取绝对值POWER()
幂运算PI()
圆周率RAND()或者RAND(X)
0~1之间的随机数SIGN(X)
得到数字符号EXP(X)
计算e的x次方
eg. SELECT CEIL(1.2);#2 SELECT FLOOR(2.9);#2 SELECT ROUND(3.56789,2);#3.57 SELECT TRUNCATE(3.56789,2);#3.56 SELECT SIGN(-12);#-1 SELECT SIGN(12);#1 SELECT SIGN(0);#0 ...
字符串函数
CHAR_LENGTH()
得到字符串的字符数LENGTH()
返回字符串的字节数CONCAT(s1,s2,...)
将字符串合并成一个字符串[注意:如果字符串中包含NULL,返回拼接结果为NULL]CONCAT_WS(x,s1,s2,...)
以指定分隔符拼接字符串UPPER(s1)|UCASE(s1)
将字符串转换成大写LOWER(s1)|LCASE(s1)
将字符串转换成小写REVERSE(s1)
字符串反转LEFT()|RIGHT()
返回字符串的前几个字符或后几个字符LPAD()|RPAD()
用字符串填充到指定长度TRIM()|LTRIM()|RTRIM()
去掉字符串两端的空格;去掉字符串左侧的空格;去掉字符串右侧的空格REPEAT(s,num)
重复指定的次数REPLACE()
字符串替换SUBSTRING(s,startIndex,num)
截取字符串[注意:startIndex下标从1开始]STRCMP(s1,s2)
比较字符串,比较ASCII码,如果s1小于s2则返回-1,s1大于s2返回1,s1=s2返回0
SELECT CHAR_LENGTH('你好呀');#3 SELECT LENGTH('你好呀');#9[原因:在UTF-8下中文为3个字节] SELECT CONCAT('a','b','c');#abc SELECT CONCAT('a','b','c',NULL);#NULL SELECT CONCAT_WS('-','a','b','c');#a-b-c SELECT CONCAT_WS('-','a','b','c',NULL);#a-b-c SELECT CONCAT_WS(NULL,'a','b','c');#NULL SELECT UPPER('aBc');#ABC SELECT LOWER('AbC');#abc SELECT LEFT('hello',2),RIGHT('hello',2);#he lo SELECT LPAD('abc',10,'?');#???????abc SELECT RPAD('abc',10,'!');#abc!!!!!!! SELECT CONCAT('*',TRIM(' abc '),'*'),CONCAT('*',LTRIM(' abc '),'*'),CONCAT('*',RTRIM(' abc '),'*');#*abc*,*abc *,* abc* SELECT REPEAT('hello',3);#hellohellohello SELECT REPLACE('hello king','king','queen');#hello queen SELECT SUBSTRING('abcdef',1,3);#abc SELECT STRCMP('a','b');#-1
日期时间函数
- 返回当前日期
SELECT CURDATE(),CURRENT_DATE();
- 返回当前时间
SELECT CURTIME(),CURRENT_TIME();
- 返回当前的日期时间
SELECT NOW(),CURRENT_TIMESTAMP(),SYSDATE();
- 返回日期中的月份
SELECT MONTH('2017-02-19');#2 SELECT MONTH(CURDATE());#9 SELECT MONTH(CURDATE()),MONTHNAME(CURDATE());#9 September
- 返回星期几
SELECT DAYNAME(NOW());#Wednesday
- 返回一周内的第几天[注意:星期天为1,…]
SELECT DAYOFWEEK(NOW());#4
- 返回一年中的第几个星期
SELECT WEEK(NOW());#36
- 计算两个日期相差的天数
SELECT DATEDIFF('2017-03-01','2017-03-05');#-4
其他常用函数
- 获得版本
SELECT VERSION();#5.7.22
- 获得当前连接数
SELECT CONNECTION_ID();#81
- 获得当前打开的数据库
SELECT DATABASE();或者SELECT SCHEME();
- 获得当前登录的用户
SELECT USER()|CURRENT_USER()|SYSTEM_USER()|SESSION_USER();
- 得到上一步插入操作产生的AUTO_INCREMENT的值
SELECT LAST_INSERT_ID();
- 加密算法加密
SELECT MD5(str);
- mysql默认的密码加密算法(添加用户时使用的加密算法)
SELECT PASSWORD(str);
- 获得版本
9.MYSQL Workbench的使用
图形化工具进行数据库的创建删除,表格的创建删除,以及数据的增删改查操作