命令行操作
net stop mysql服务名
net start mysql服务名
mysql -h 主机名 -P端口 -u用户名 -p密码 //无-h则默认本机,无-P则默认3306,实际工作中3306一般修改
quit
# 备份数据库(DOS执行命令行)
mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sql #mysqldump.exe在mysql安装目录\bin
# 恢复数据库(进入MySQL命令行再执行 mysql -u root -p)。 备份文件就是对应sql语句
Source 文件名.sql #或将备份文件内容sql语句贴入查询编辑器中执行一遍
# 备份库的表
mqsqldump -u 用户名 -p密码 数据库 表1 表2 表n > d:\\文件名.sql
数据库操作
# 创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] #[]代表可选。如果不存在则创建,存在则不创建,不写[IF NOT EXISTS]条件存在则报错
create_specification:
[DEFAULT] CHARACTER SET charset_name #指定字符集,默认utf8
[DEFAULT] COLLATE collation_name #指定字符集校对规则(常用的utf8_bin[区分大小写]、默认utf8_general_ci[不区分大小写])
# 查看数据库
SHOW DATABASES #显示当前数据库服务器中的所有数据库
SHOW CREATE DATABASE db_name #显示数据库创建的定义信息
#CREATE DATABASE `hsp_db01` /*!40100 DEFAULT CHARACTER SET utf8 */ #创建数据可和表的时候,使用``规避关键字, /*代表数据库版本要在4以上,该语句方可执行
# 删除数据库
DROP DATABASE [IF EXISTS] db_name #慎用
表操作
# 创建表
CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype
)character set 字符集 collate 校对规则 engine 引擎
# 修改表
# 添加列
ALTER TABLE tablename ADD (columnname datatype [DAEFAULT expr][, column datatype]...); #列名/类型/默认值/表达式/列... 无需括号
# ALTER TABLE emp ADD image VARCHAR(32) NOT NULL DEFAULT '' [FIRST | AFTER 'resume'; #注意引号,新添加的列名无,原有的列名有
# 修改列
ALTER TABLE tablename
MODIFY (column datatype [DEFAULT expr][, column datatype]...);
# ALTER TABLE employee CHANGE `name` user_name VARCHAR(32) NOT NULL DEFAULT ''; #修改列名
# 删除列
ALTER TABLE tablename
DROP (column);
查看表结构:desc 表名; -- 可以查看表的列
# 修改表名:
Rename table 表名 to 新表名
# 修改表字符集:
alter table 表名 character set 字符集;
# 删除表
DROP TABLE tablename;
CURD
# 添加数据
INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]);
# 注意:
-- 字符和日期型数据应包含在单引号中;
-- 列可以插入空值(前提是该字段允许为空)
INSERT INTO tablename value (NULL);
# 添加多条记录
INSERT INTO tablename (column1, column2, column3...) VALUES (v1, v2, v3), (u1, u2, u3), (w1, w2, w3);
--如果是给表中所有字段添加数据,可以不写前面的字段名称
--当不给某个字段值时,如果允许为空,有默认值就会添加默认值,没有报错;创建表时可以指定希望的默认值
# 更新数据
UPDATE tbl_name SET col_name=expr1 [, col_name2=expr2 ...] [WHERE where_definition] # 不写where条件代表修改表的所有记录/数据/行,慎用
# 删除数据
DELETE FROM tbl_name [WHERE where_defination] #无where条件代表删除所有数据/记录/行
# 查找数据
SELECT [DISTINCT] *|{column1, column2, column3...} FROM tablename; #distinct去重,*代表查询所有列
SELECT *|{column1 | expression, column2 | expression...} FROM tablename; #使用表达式对查询的列进行运算
SELECT columnname AS 别名 from tablename;
# SELECT `name` (chinese + math + english) AS total_score FROM student;
SELECT column1. column2, column3... FROM tablename [WHERE where_defination] ORDER BY columnx asc|desc; # 默认asc升序 ascending/descending
函数
分组统计
group by 对查询结果分组统计(示意图)
having 子句用于限制分组显示结果
多表操作
内连接:同时满足多表条件
自连接,将同一张表看作多张表
# 写出正确的过滤条件:多表查询条件不能少于表数-1,否则会出现笛卡尔集
SELECT column1, table1_column2 FROM table1, table2 WHERE table1.column2 = table2.column2;
SELECT emp, sal, grade FROM emp, salgrade WHERE sal BETWEEN losal AND hisal;
外连接
左外连接:左侧的表完全显示
右外连接:右侧的表完全显示
常见基础问题
1 drop和delete的区别是什么?
DROP命令:
DROP是用来删除数据库中的对象,如表(TABLE)、视图(VIEW)、索引(INDEX)、约束(CONSTRAINT)等。
一旦使用DROP命令删除了某个对象,该对象以及与之相关的所有数据都会被永久移除,且通常无法恢复,除非有专门的备份。
DROP命令是不可逆的,慎用,通常需要先进行备份。
例如,使用DROP TABLE命令可以删除一个表及其所有数据。
DELETE命令:
DELETE是用来删除表中的数据记录,而不是表结构本身。
使用DELETE命令时,表的结构仍然存在,只是表中的数据被删除。
DELETE命令可以删除表中满足特定条件的所有记录,但不会删除表结构、索引、约束等。
DELETE命令可以指定删除所有记录(使用DELETE FROM table_name),或者删除满足特定条件的记录(使用DELETE FROM table_name WHERE condition)。
通常情况下,执行DELETE操作前应该先使用SELECT语句检查要删除的记录。
简而言之,DROP用于删除数据库中的对象,而DELETE用于删除对象中的数据。使用时需要根据实际需求和权限谨慎操作,避免不必要的数据丢失。
2 where和having的区别是什么?
都是SQL查询语句中的子句,用于过滤数据
执行时机:
WHERE子句在数据分组之前执行。这意味着它用于过滤整个记录行,在分组操作之前确定哪些行将被包括在分组中。
HAVING子句在数据分组之后执行。它用于过滤由GROUP BY子句创建的组,允许你根据聚合值的结果来筛选组。
过滤对象:
WHERE子句过滤的是表中的行。它不能用于过滤聚合函数的结果,如SUM()、COUNT()等。
HAVING子句可以过滤聚合函数的结果。它通常与GROUP BY子句一起使用,以便对分组后的结果进行条件筛选。
使用的列:
WHERE子句可以引用表中的任何列,以及聚合函数。
HAVING子句只能引用聚合函数和GROUP BY子句中指定的列。
语义:
WHERE子句通常用于过滤数据以选择特定的行,例如基于某个字段的值。
HAVING子句通常用于对分组后的结果进行条件筛选,例如选择平均值大于某个值的组。
例子:
如果你想要选择年龄大于30的所有人,你会使用WHERE子句:
SELECT * FROM people WHERE age > 30;
如果你想要选择平均年龄大于30的所有组,你会使用HAVING子句:
SELECT group_name, AVG(age) as avg_age
FROM people
GROUP BY group_name
HAVING AVG(age) > 30;
总结来说,WHERE子句用于过滤行,而HAVING子句用于过滤由GROUP BY分组的聚合结果。两者都是用于数据筛选的重要工具,但应用场景和用法有所不同。
内连接和外连接的区别?
内连接(Inner Join)和外连接(Outer Join)是SQL中用于合并两个或多个表中数据的两种方式。它们的主要区别在于如何处理存在于一个表中但不在另一个表中的数据行。
内连接(Inner Join):
内连接是最常见的连接类型,它只返回两个表中都有匹配的行。
在内连接中,只有在两个表中的相关列有匹配值的情况下,才会返回行。
如果不存在匹配,则结果集中不会包含那些没有匹配的行。
内连接可以看作是“交集”,只返回两个表中都有的数据。
外连接(Outer Join):
外连接会返回两个表中所有行,包括那些在另一个表中没有匹配的行。
外连接分为左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。
左外连接(LEFT JOIN)返回左表的所有行,即使右表中没有匹配的行。如果右表中存在匹配,则返回完整的结果集;如果不存在匹配,则右表的部分会返回NULL。
右外连接(RIGHT JOIN)返回右表的所有行,即使左表中没有匹配的行。如果左表中存在匹配,则返回完整的结果集;如果不存在匹配,则左表的部分会返回NULL。
全外连接(FULL OUTER JOIN)返回两个表中的所有行。如果左表中有匹配,则返回左表的行;如果右表中有匹配,则返回右表的行。两个表中都没有匹配的行,则返回NULL。
下面是一个简单的例子来说明内连接和外连接的区别:
假设我们有两个表:employees(员工表)和departments(部门表)。员工表中有员工的详细信息,而部门表中有部门的详细信息。员工表中的department_id字段与部门表中的id字段相关联。
内连接查询示例:
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
这个查询只返回在两个表中都有匹配department_id和id的行。
左外连接查询示例:
SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
这个查询返回员工表中的所有行,即使某些行在部门表中没有匹配的行。如果存在匹配,则返回完整的员工和部门名称。