个人理解:随着互联网的发展,数据变得烦杂,冗余,量大,为了保证数据的持久性以及健壮性等等,同时也为了方便人们很好的处理数据,这就发明了数据库DB。
DB∶数据库,保存一组有组织的数据的容器。
DBMS∶数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据。
SQL:结构化查询语言:专门用来与数据库管理系统(DBMS)通信的语言。
2.1.1 关系型数据库
实质:
2.1.2 非关系型数据库
阉割版本
舍得,舍弃了一些功能,获得某些高性能的功能。数据表
,这些数据表的组成都是结构化的。数据记录
有关系。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。3.2.1一对一关系(one-to-one)
3.2.2 一对多关系(one-to-many)
客户表和订单表
,分类表和商品表
,部门表和员工表
3.2.3 多对多关系(many-to-many)
要表示多对多关系,必须创建第三个表,该表通常称为联接表
,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。
多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
3.2.4 自我引用(Self reference)
位置信息(删除时都要删):
卸载方式:
控制面板下卸载程序
通过360、电脑管家卸载
通过MySQL安装包本身卸载
最后要重启电脑
下载通过msi文件安装。
要在管理员模式下打开cmd:
net start mysql80 开启MySQL服务
net stop mysql80 关闭MySQL服务
也可在服务中手动开启手动关闭
注意:后面要加版本号80
安装好后登录uroot用户:
show databases; #展示现在所有的数据库
create databases dbtest1; #创建一个数据库
use dbtest1; #使用这个数据库进行操作。(以下操作在这个数据库中进行)* create table students(id int,name varchar[15]); #——创建一个表(关系模式)show tables; #在这个数据库下显示所有的表select * from students #在这个student表中筛选信息,*代表全部的意思。(正则表达式)insert into students values(1001,'Tom');insert into students values(1002,'Jeff');#往表里插入信息(用这个语句插入中文字符串会报错)insert into students values(1002,'汤姆'); #报错,但是在8.0版本中是可以的!因为以前版本的CHARSET = latin1 (latin中没有汉字中文编码,mysql最初是在瑞典被创建的,所以采用Latin码)show create table students; #战士创建表时的相关信息show create database dbtest1; #展示创建数据库时的相关信息
show variables like 'character_%'; #展示此版本下所使用的字符集
show variables like 'collation_%'; #展示字符集的比较规则
drop database dbtest1; #把数据库删除
alter database dbtest1 charset utf8; #修改修改数据库的字符编码为utf8
修改字符集通过MySQL数据目录下的my.ini文件配置修改(5.7以前(包括5.7)版本才需要)
(已安装)
(已安装)
(利于做大数据的操作)
SQL:数据查询语言
/*
DDL:数据定义语言。
CREATE\ALTER\DROP\RENAME\TRUNCATEDML数据操作语言。(使用频率最高)
INSERT\DELETE\UPDATE\SELECT
增 删 改 查DCL:数据控制语言。
COMMIT\ROLLBACK\SAVEPOINT\GRANT\REVOKE
COMMIT\ROLLBACK(与事物相关的操作,单独取出称为TCL:事物控制语言)因为查询语句使用的非常频繁,所以很多人把查询语句单拎出来一类:DQL(数据查询语言)学习技巧:大处着手、小处着手。
*/
MySQL在windows环境下是大小写不敏感的
MySQL在Linux环境下是大小写敏感的
推荐采用统一的书写规范
#单行注释 (MySQL注释独有的方式)
-- 单行注释(--后空格)
/*
多行注释
*/
mysql> source d:\mysqldb.sql
#source + 数据库的绝对路径
SELECT 1; #没有任何子句**
SELECT 9/2; #没有任何子句**
SELECT 1+1 FROM DUAL; #dual是一个伪表**
这个就相当于投影π
SELECT 字段1,字段2,... FROM 表名; #字段就是属性名
SELECT * FROM 表名; # *代表所有的字段,把所有的属性列显示出来。选择语句会返回给我们一个结果集。
SELECT employee_id emp_id,last_name AS lname,department_id FROM employees;
#表中字段名原本为employee_id,查询时加一个空格或者AS后面跟上另外一个名字(我们自己取的),查询返回结果集时,字段名就是我们定义的名字。但这并不会本质上改变我们表的字段名。
#as:全称为alias(别名)(可以省略不写、默认存在)
#列的别名同样也可以用一对双引号引起来。避免别名有空格而产生歧义性。
去除冗余的信息,获取不重复的数据
SELECT DISTINCT depatment_id FROM employees; #去除重复的department_id信息
SELECT DISTINCT depatment_id,salary FROM employees;
#给 department_id,salary 两个字段整体去重!
SELECT salary,DISTINCT depatment_id FROM employees
#错误写法!!先选了所有的salary再去重id,得到的结果集合表的记录条数不一致!
**空值:null **
#空值null不等同于0、''、'null',null是一个未知的。
SELECT employee_id, salary "月工资",salary * (1 + commission_pct) * 12 "年工资" FROM employees;SELECT employee_id, salary "月工资",salary * (1 + IFNULL(commission_pct,0)) * 12 "年工资" FROM employees;#表示的意思就是,判断commission_pct是否为null,若为null则用0代替。
空值参与运算,结果一定为null
解决方法:引入IFNULL(,)
` 这就是着重号(英文输入下1左边的按键)
也就是你所用的字段名、表名与关键字或者保留字冲突(重名),就必须要用``引起来。
SELECT '尚硅谷',employee_id,last_name FROM employees;
#前面的常数'尚硅谷'将会作为一个单独的字段出现在所查询到的结果集里面的每一行。
使用DESCRIBE或DESC命令,表示表结构。
DESCRIBE employees;
or
DESC employees;
#显示了表中字段的详细信息。
只筛选出满足某些条件的数据
相当于SIGMA选择,遵循先选择后投影的原则
SELECT *
FROM employees
#过滤条件,只选择出部门号为90的
WHERE department_id = 90;#WHERE要声明在FROM结构后面。SELECT *
FROM employees
#过滤条件,只选择出名字为'King'的
WHERE last_name = 'King';#SQL 是在windows下是不区分大小写的。
**+ - * /(div) **
SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5;
#结果就是一个表,属性列为这些运算的值,同时只有一个元组,内容也为这些运算值。#在SQL中,+没有连接作用,就表示加法运算。此时会将字符串转换为数值(隐式转换)
SELECT 100 * '1' FROM DUAL;
#结果:属性名为 100 + '1',元组值为101。#此时将'a'看做0处理。
SELECT 100 * 'a' FROM DUAL;#此时结果为null
SELECT 100 * null FROM DUAL;#100 div 0 结果为null
在SQL中,除法默认的就是浮点数。比如100/2 结果就为 50.000000
%(mod)
#取模运算的结果符号取决于被模数的符号。
SELECT 12 % 3, 12 % 5, 12 MOD -5, -12 % 5, -12 % -5
FROM employees;#练习:查询员工id为偶数的员工信息
SELECT employee_id, last_name, salary
FROM employees
WHERE employee_id % 2 = 0;
比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况则返回NULL。
比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符合条件的结果记录。
字母符号 | 中文名称 | 用途 | 语句范例 |
---|---|---|---|
= | 等于运算符 | 判断两个值、字符串或表达式是否相等 | SELECT C FROM TABLE WHERE A = B; |
<&#61;> | 安全等于运算符 | 安全地判断两个值、字符串或表达式是否相等&#xff08;注意NULL &#xff09; | SELECT C FROM TABLE WHERE A <&#61;> B; |
<>或者!&#61; | 不等于运算符 | 判断两个值、字符串或表达式是否不相等 | SELECT C FROM TABLE WHERE A <> B; SELECT C FROM TABLE WHERE A !&#61; B; |
< | 小于运算符 | 判断前面的值、字符串或表达式是否小于后面的值、字符串或表达式 | SELECT C FROM TABLE WHERE A ; |
<&#61; | 小于等于运算符 | 判断前面的值、字符串或表达式是否小于等于后面的值、字符串或表达式 | SELECT C FROM TABLE WHERE A <&#61; B; |
> | 大与运算符 | 判断前面的值、字符串或表达式是否大于后面的值、字符串或表达式 | SELECT C FROM TABLE WHERE A > B; |
>&#61; | 大于等于运算符 | 判断前面的值、字符串或表达式是否大于等于后面的值、字符串或表达式 | SELECT C FROM TABLE WHERE A >&#61; B; |
SELECT 1 &#61; 2, 1 !&#61; 2, 1 &#61; &#39;1&#39;, 1 &#61; &#39;a&#39;, 0 &#61; &#39;a&#39; FROM employees;
#结果 0 1 1 0 1
#字符串存在隐式转换。如果转换数值不成功&#xff0c;则看做0。 SELECT &#39;a&#39; &#61; &#39;a&#39;, &#39;ab&#39; &#61; &#39;ab&#39;, &#39;a&#39; &#61; &#39;b&#39; FROM employees;
#结果 1 1 0
#两边都是字符串的话&#xff0c;则按照ANSI的比较规则进行比较。SELECT 1 &#61; NULL, NULL &#61; NULL FROM employees;
#结果 NULL NULL
#只要有NULL参与判断&#xff0c;结果一定为NULL。SELECT last_name, salary, commission_pct
FROM employess
WHERE commission_pct &#61; NULL;
#此时有NULL参与运算&#xff0c;不会有任何结果。
SELECT 1 &#61; NULL, NULL &#61; NULL FROM employees;
#结果 0 1
#安全等于&#xff1a;若两个比较值&#xff0c;只有一个为NULL那么结果为NULL&#xff0c;如果两个为NULL那么结果为1。#练习&#xff0c;查询表中commission_pic属性值NULL的元组
SELECT last_name, salary, commission_pct
FROM employees
WHERE commission_pic <&#61;> NULL;
#练习1 查询表中commission_pic属性值为NULL的元组
SELECT last_name, salary, commission_pct
FROM employees
WHERE commission_pic IS NULL;
#或以下这种写法
SELECT last_name, salary, commission_pct
FROM employees
WHERE commission_pic ISNULL(commission_pct);#练习2 查询表中commission_pic属性值不为NULL的元组
SELECT last_name, salary, commission_pct
FROM employees
WHERE commission_pic IS NOT NULL;
#或
SELECT last_name, salary, commission_pct
FROM employees
WHERE NOT commission_pic <&#61;> NULL;
注意:运算表达书是有值的&#xff0c;只有当值为1时才输出&#xff0c;有的有NULL参与运算可能直接使运算结果为NULL从而不显示数据。
SELECT LEAST(&#39;g&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;), GREATEST(&#39;g&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;);
SELECT LEAST(last_name,first_name), LEAST(LENGTH(last_name),LENGTH(first_name)) FROM employees;
#查询工资在6000到8000之间的数据
SELECT last_name, salary, commission_pct
FROM employees
WHERE salary BETWEEN 6000 AND 8000;
#运用逻辑操作符等价&#xff1a;
SELECT last_name, salary, commission_pct
FROM employees
WHERE salary >&#61; 6000 AND salary <&#61; 8000;#查询工资不在6000 到 8000 之间
SELECT last_name, salary, commission_pct
FROM employees
WHERE salary NOT BETWEEN 6000 AND 8000;
#运用逻辑操作符等价&#xff1a;
SELECT last_name, salary, commission_pct
FROM employees
WHERE salary >&#61; 6000 AND salary <&#61; 8000;
#查找部门id为 10,20,30部门的员工信息。
SELECT last_name,salary,department_id
FROM employees
WHERE department_id IN (10,20,30);#以下这种写法是错误的&#xff0c;10,20,30本身非0&#xff0c;作或运算就为真&#xff0c;所以压根就没有选出数据。
SELECT last_name,salary,department_id
FROM employees
#WHERE department_id &#61; 10 OR 20 OR 30; 错误
WHERE department_id &#61; 10 OR department_id &#61; 20 OR department_id &#61; 30;#查询工资不是6000,7000,8000的员工信息。
SELECT last_name,salary,department_id
FROM employees
WHERE salary NOT IN (6000,7000,8000);
#练习1&#xff1a;查询last_name中包含字符&#39;a&#39;的员工信息。
SELECT last_name
FRoM employees
WHERE last_name LIKE &#39;%a%&#39;;
# % 代表不确定个数的字符&#xff08;0, 1或者多个&#xff09;#练习2&#xff1a;查询last_name中以&#39;a&#39;开头的员工信息。
SELECT last_name
FRoM employees
WHERE last_name LIKE &#39;a%&#39;;#练习3&#xff1a;查询last_name中包含字符&#39;a&#39;且包含字符&#39;e&#39;的员工信息。
#写法1&#xff1a;
SELECT last_name
FRoM employees
WHERE last_name LIKE &#39;%a%&#39; AND last_name LIKE &#39;%e%&#39;;
#写法2&#xff1a;
SELECT last_name
FRoM employees
WHERE last_name LIKE &#39;%a%e%&#39; OR last_name LIKE &#39;%e%a%&#39;;##练习4&#xff1a;查询last_name中第二个字符为&#39;a&#39;的员工信息。
SELECT last_name
FRoM employees
WHERE last_name LIKE &#39;_a%&#39;;
#下划线代表一个不确定的字符。#练习4&#xff1a;第二个字符为&#39;_&#39;且第3个字符是&#39;a&#39;的员工信息。
SELECT last_name
FRoM employees
WHERE last_name LIKE &#39;_\_a%&#39;;#练习5(了解即可)&#xff1a;第二个字符为&#39;_&#39;且第3个字符是&#39;a&#39;的员工信息。
SELECT last_name
FRoM employees
WHERE last_name LIKE &#39;_$_a%&#39; ESCAPE &#39;$&#39;;
#使用ESCAPE让美元符号$变成转移符号。
REGEXP运算符在进行匹配时&#xff0c;常用的有下面几种通配符&#xff1a;
(1)&#39;^&#39;匹配以该字符后面的字符开头的字符串。
(2)&#39;$&#39;匹配以该字符前面的字符结尾的字符串。
(3)&#39;.&#39;匹配任何一个单字符。
(4)"[...]"匹配在方括号内的任何字符。例如&#xff1a;"[abc]"匹配"a"或"b"或"c"。为了命名字符的范围&#xff0c;使用一个&#39;-&#39;。"[a-z]"匹配任何字母&#xff0c;而"[0-9]"匹配任何数字。
(5)&#39;*&#39;匹配零个或多个在它前面的字符。例如&#xff0c;"x*"匹配任何数量的&#39;x&#39;字符&#xff0c;"[0-9]*"匹配任何数量的数字&#xff0c;而"*"匹配任何数量的任何字符。
SELECT &#39;atguigu&#39; REGEXP &#39;gu.gu&#39;
FROM exployees;
#找出&#39;atguigu&#39;这个字符中有没有&#39;gu....gu&#39;这个字符&#xff0c;...表示中间无论有多少字符。
运算符 | 作 用 | 示例 |
---|---|---|
NOT 或 ! | 逻辑非 | SELECT NOT A |
AND 或 && | 逻辑与 | SELECT A AND B SELECT A && B |
OR 或 || | 逻辑或 | SELECT A OR B SELECT A || B |
XOR | 逻辑异或 | SELECT A XOR B |