MySQL入门级操作
一、数据库理论基础
1、什么是数据库
存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按照一定数据模型组织、描述和存储,具有较小的冗余度,较高的独立性和易扩展性,并为各种用户共享,总结为以下几点:
-
数据结构化
-
数据的共享性高,冗余度低,易扩充
-
数据独立性高
-
数据由 DBMS 统一管理和控制(安全性、完整性、并发控制、故障恢复)
2、常见数据库
关系型数据库:Oracle、DB2、Microsoft SQL Server、MicrosoftAccess、MySQL、浪潮K-DB 、武汉达梦、南大通用、人大金仓等
非关系型数据库:NoSQL(Not Only SQL )
3、MySQL数据库概述
DB-Engines Ranking - popularity ranking of database management systems
MySQL是一个中小型关系数据库管理系统
3.1 MySQL特性
-
使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。
-
支持AIX、BSDi、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、NetBSD、OpenBSD、OS/2 Wrap、Solaris、SunOS、Windows等多种操作系统。
-
为多种编程语言提供了API。这些编程语言包括C、C++、C#、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。
-
支持多线程,充分利用CPU资源,支持多用户。
-
优化的SQL查询算法,有效地提高查询速度。
-
既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。
-
提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。
-
提供TCP/IP、ODBC和JDBC等多种数据库连接途径。
-
提供用于管理、检查、优化数据库操作的管理工具。
-
可以处理拥有上千万条记录的大型数据库。
二、安装MySQL(见上一个博客)
三、MySQL数据库和表操作
1、SQL语句
SQL:结构化查询语言,在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。
2、SQL分类
DDL:数据定义语言,定义对数据库对象(库、表、列、索引)的操作。 create、drop、alter、rename、 truncate等
DML:数据操作语言,定义对数据库记录的操作。 insert、delete、update、select等
DQL:数据查询语言,select
DCL:数据控制语言,定义对数据库、表、字段、用户的访问权限和安全级别,grant
3、SQL语句的书写规范
在数据库系统中,SQL语句不区分大小写(关键字建议用大写) ,但字符串常量区分大小写。
SQL语句可单行或多行书写,以“;”结尾。
关键词不能跨多行或简写。
SELECT * FROM tb_table
注释: SQL标准: /**/。
多行注释 “-- ”
单行注释 MySQL注释: “#”
4、MySQL自带数据库
Information_schema: 主要存储了系统中的一些数据库对象信息:如用户表信息、列信息、权限信 息、字符集信息、分区信息等。(数据字典表)
performance_schema: 主要存储数据库服务器的性能参数
mysql: 存储了系统的用户权限信息及帮助信息。
sys: 5.7新增,之前版本需要手工导入。这个库是通过视图的形式把information_schema
performance_schema结合起来,查询出更加令人容易理解的数据
5、utf8和utf8mb4的区别
utf8:只支持基本多语言平面(BMP)的字符(最多3字节)
uft8mb4:支持完整的Unicode字符集,包括补充字符(如emoji、某些罕见汉字等,最多四字节)
修改为utf8
修改my.cnf配置文件,可修改MySQL默认的字符集,修改完毕重启MySQL
1.在[mysqld]下添加
default-character-set=utf8 #适合5.1及以前版本
(mysql 5.5及以后版本添加character-set-server=utf8)
init_connect = 'SET NAMES utf8'
2.在[client]下添加
default-character-set=utf8
3. 5.8开始,官方建议使用utf8mb4。
6、数据类型
Text类型
Number类型
data类型
常用数据类型
7、数据库约束
1、主键约束
主键从功能上看相当于非空且唯一,一个表中只允许一个主键,主键是表中唯一确定一行数据的字段。一般建议主键采用“int类型”,一般建议由数据库自身维护这个字段的值。当建立主键约束时,MySQL为主键创建对应的索引——主键索引,主键约束名总为primary。
四、SQL之DML
有关数据表的DML操作:INSERT INTO、DELETE、TRUNCATE、UPDATE、SELECT
条件查询、查询排序、聚合函数、分组查询
1、insert
insert INTO table_name[(field1 [, field2 ……]) values(value1 [, vaule2 ……]) [,()]];
mysql> INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区');
2、update
update table_name set 字段1=新值 [, 字段2=新值, 字段3=字段3 + 1] [where 条件];
update student set age=20 where id=1;
3、replace
当表里面没有这条数据时,则执行行插入,否则执行更新
注意:replace本质是先删除,再插入
replace into student(id,name,password) values(100,"hql","123")
4、select
select *|字段1 [, 字段2 ……] from 表名称 [, 表名称2……] [where 条件] [group by 字段 [having 分组后的筛选]] [order by 字段 [desc|asc] [字段2 [desc|asc] ……]] [limit 分页]
4.1 简单的SQL查询
-- 查询表中所有数据
select * from student;
-- 查询所需要的字段信息
select id,name from student;
-- 根据条件来查询信息
select name from student where id=1;
select password from student where name="hql";
4.2 条件查询
条件判断
=
判断两次的值是否相等
is
判断空null
is not null
来判断不为空
<=>
可以判断null或者普通值
!=
不等于
<>
也是不等于4.4 逻辑运算符
逻辑运算符是多条件关联的一种方式。(与或非)
and、or、not
注意:在sql中,如果要提升条件的运行顺序,或者提高条件的优先级别,则需要使用括号来提升。
-- 等值查询
select uname,age from student where age=20;
-- NULL不能用=判断
select * from student where age is NULL;
-- 逻辑运算符
select * from student where age<=20;
select * from sutdent age>=20 and age<=30;
-- and运算符(类似还有or)
select uname,age from student where uname="黄%" and age>=18;
-- 别名
select uname as "名字",age as "年龄" from student where age between 20 and 30;
-- IN
select uname,age from student where age in (18,20,30);
-- not
select uname,age from student where age not in (18,20,30);
-- like (%) 可表示零或多个字符、( _ ) 可表示一个字符
select uname from student where uname like "黄%";
4.3 分组统计与筛选
-- 分组(group by)
select gender as "性别" from student group by gender;
-- 统计(count(*))
select gender as "性别",count(*) as "人数" from student group by gender;
-- 分组后的条件筛选
select gender as "性别",count(*) as "人数" from student group by gender having count(gender)>4;
4.4 排序
-- 默认升序(asc)
select * from student order bby age;
-- 设置降序
select * from student order by desc;
--当存在多字段排序时,根据顺序依次排序
select * from student order by age asc,id desc;
4.5 分页
-- 显示前两条数据
select * from student limit 2;
-- 显示第6条数据到第9条数据
select * from student limit 6,4;
4.6 多表关联查询
多表关联
外键:指的是两张或者多张表之间关联关系的字段。
外键约束:是表的约束,是约束表在插入外键数据时能够正确的插入。
外键是构建于一个表的两个字段或者两个表的两个字段之间的关系
外键确保了相关的两个字段的两个关系:
子(从)表外键列的值必须在主表参照列值的范围内,或者为空(也可以加非空约束,强制不允许为空)。
当主表的记录被子表参照时,主表记录不允许被删除。
外键参照的只能是主表主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
表与表之间的关联
当表与表之间存在了外键,这就意味着,这两张表之间存在某种关联关系。
一旦表存在了关联关系,则会进行外键设计,如果设计外键,将外键设计在哪张表中?
-
一对一 :外键可以设计在任意一张表中
-
一对多 :外键必须设计在多方
-
多对多 :创建第三张表,来专门描述两张表的关联关系
-- 先看两张表的结构
mysql> select * from t_stu;
+----+--------+------+
| id | sname | c_id |
+----+--------+------+
| 1 | 张三 | 1 |
| 3 | 李四 | 2 |
| 4 | 王五 | 3 |
| 5 | 老六 | 4 |
+----+--------+------+
4 rows in set (0.00 sec)
mysql> select * from t_class;
+----+-----------------------+
| id | cname |
+----+-----------------------+
| 1 | MYSQL |
| 2 | Python |
| 3 | JAVA |
| 4 | 计算机网络基础 |
+----+-----------------------+
4 rows in set (0.00 sec)
-- 直接查询两张表(引发笛卡尔积现象)
mysql> select * from t_stu,t_class;
+----+--------+------+----+-----------------------+
| id | sname | c_id | id | cname |
+----+--------+------+----+-----------------------+
| 5 | 老六 | 4 | 1 | MYSQL |
| 4 | 王五 | 3 | 1 | MYSQL |
| 3 | 李四 | 2 | 1 | MYSQL |
| 1 | 张三 | 1 | 1 | MYSQL |
| 5 | 老六 | 4 | 2 | Python |
| 4 | 王五 | 3 | 2 | Python |
| 3 | 李四 | 2 | 2 | Python |
| 1 | 张三 | 1 | 2 | Python |
| 5 | 老六 | 4 | 3 | JAVA |
| 4 | 王五 | 3 | 3 | JAVA |
| 3 | 李四 | 2 | 3 | JAVA |
| 1 | 张三 | 1 | 3 | JAVA |
| 5 | 老六 | 4 | 4 | 计算机网络基础 |
| 4 | 王五 | 3 | 4 | 计算机网络基础 |
| 3 | 李四 | 2 | 4 | 计算机网络基础 |
| 1 | 张三 | 1 | 4 | 计算机网络基础 |
+----+--------+------+----+-----------------------+
16 rows in set (0.00 sec)
-- 给上条件可以解决
mysql> select * from t_stu,t_class where t_stu.c_id = t_class.id;
+----+--------+------+----+-----------------------+
| id | sname | c_id | id | cname |
+----+--------+------+----+-----------------------+
| 1 | 张三 | 1 | 1 | MYSQL |
| 3 | 李四 | 2 | 2 | Python |
| 4 | 王五 | 3 | 3 | JAVA |
| 5 | 老六 | 4 | 4 | 计算机网络基础 |
+----+--------+------+----+-----------------------+
4 rows in set (0.00 sec)
-- 使用join(没有条件时引发笛卡尔积)
mysql> select * from t_stu join t_class;
+----+--------+------+----+-----------------------+
| id | sname | c_id | id | cname |
+----+--------+------+----+-----------------------+
| 5 | 老六 | 4 | 1 | MYSQL |
| 4 | 王五 | 3 | 1 | MYSQL |
| 3 | 李四 | 2 | 1 | MYSQL |
| 1 | 张三 | 1 | 1 | MYSQL |
| 5 | 老六 | 4 | 2 | Python |
| 4 | 王五 | 3 | 2 | Python |
| 3 | 李四 | 2 | 2 | Python |
| 1 | 张三 | 1 | 2 | Python |
| 5 | 老六 | 4 | 3 | JAVA |
| 4 | 王五 | 3 | 3 | JAVA |
| 3 | 李四 | 2 | 3 | JAVA |
| 1 | 张三 | 1 | 3 | JAVA |
| 5 | 老六 | 4 | 4 | 计算机网络基础 |
| 4 | 王五 | 3 | 4 | 计算机网络基础 |
| 3 | 李四 | 2 | 4 | 计算机网络基础 |
| 1 | 张三 | 1 | 4 | 计算机网络基础 |
+----+--------+------+----+-----------------------+
16 rows in set (0.00 sec)
-- 带上条件
mysql> select * from t_stu join t_class where t_stu.c_id = t_class.id;
+----+--------+------+----+-----------------------+
| id | sname | c_id | id | cname |
+----+--------+------+----+-----------------------+
| 1 | 张三 | 1 | 1 | MYSQL |
| 3 | 李四 | 2 | 2 | Python |
| 4 | 王五 | 3 | 3 | JAVA |
| 5 | 老六 | 4 | 4 | 计算机网络基础 |
+----+--------+------+----+-----------------------+
4 rows in set (0.00 sec)
5、SQL中的函数
5.1 聚合函数
除了COUNT()以外,聚合函数都会忽略NULL值。