1.什么是数据库:
高效的存储和处理数据的介质(介质有:磁盘和内存)
文件保存数据的缺点:
- 文件的安全性问题
- 文件不利于查询和对数据的管理
- 文件不利于存放海量数据
- 文件在程序中控制不方便
2.连接数据库:
在Linux下要使用mysql数据库,首先要开启mysqld服务(mysqld服务是数据库的服务器端):
[root@localhost http]$ service mysqld start
关闭服务
[wuqian@localhost http]$ service mysqld stop
连接mysql:
语法:mysql [-h 主机] -u 用户 -p
一般主机不写就是默认本地。
[wuqian@localhost http]$ mysql -u root -p
3.数据库和表的关系
- 所谓安装数据库服务,只是在机器上安装了一个数据库管理程序,这个程序可以管理多个数据库,数据库中可以管理多个表。
- 数据库中的表用来保存应用中实体的数据。
4.数据库的基本操作
1.创建数据库:
create database 库名;
mysql> create database test;
当我们在创建数据库的没有指定字符集和校验规则时,系统默认字符集:utf8 ,校验规则:utf8_general_ci
默认字符集在 /etc/my.cnf中进行配置。
创建一个使用utf8字符集的数据库
mysql> create database test1 charset=utf8;
创建一个使用utf8字符集,并带校验规则的数据库
mysql> create database test2 charset=utf8 collate utf8-general_ci;
charset是指定字符集,collate是指定校验规则。
2.字符集和校验规则:
查看数据库支持的字符集:
字符集主要控制使用什么语言,utf8就可以装中文。
mysql> show charset;
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
校验规则:
1.用于区分大小写
- utf8_general_ci :不区分大小写
- utf8_general_bin :区分大小写
2.影响排序
区分大小写的,排序时,所有的大写字母在前,小写字母在后。
不区分大小写的,排序时,小写字母在前,其后是同名大写字母。
3.查看数据库
mysql> show databases;
显示数据库创建语句
mysql> show create database test;
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)
注:1 )数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字
2)/*!40100 default.... */ 这个不是注释,表示当前mysql 版本大于4.01版本,就执行这句话
4.删除数据库
mysql> DROP DATABASE IF EXISTS test;
mysql> DROP DATABASE test;
5.查看当前数据库的连接情况
mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 13 | root | localhost | test | Query | 0 | NULL | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)
可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。以后大家发现自己数据库比较慢时,可以用这个指令来看看数据库连接情况
6.备份和恢复数据库
备份:
语法:mysqldump ‐u root ‐p密码 数据库名 > 数据库存放路径
将test数据库备份到当前路径下
[root@localhost wu]# mysqldump -u root -p123 test > ./test.sql
[root@localhost wu]# ls
code Documents Music Public test.sql
test.sql中的内容为我们建库,建表,导入数据的语句。
恢复数据库:
进入mysql控制台,先删除原来的库,要恢复数据库,就必须先创建一个空的数据库,最好和以前的数据库的名字一样。
mysql> drop database test;
Query OK, 0 rows affected (0.40 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| sonar |
+--------------------+
3 rows in set (0.00 sec)
mysql> create database test;
Query OK, 1 row affected (0.02 sec)
mysql> use test;
Database changed
mysql> source /home/wuqian/test.sql
注意:备份一张表
[root@localhost test]# mysqldump -u root -p密码 数据库名 表名1 表名2 > ./testtable.bk
恢复指定的表
[root@localhost test]# source 备份的文件路径
[root@localhost test]# source ./testtable.bk
在使用source 恢复数据时,保证use对应的数据库
同时备份多个数据库:
[root@localhost Desktop]# mysqldump -u root -p密码 -B 数据库名1 数据库名2 ... > 数据库存放路径
同时恢复多个数据库:
mysql > source 备份的文件
如果我们备份一个数据库时,也带上-B参数,在恢复数据库时,不需要再创建空数据库。
7.使用库:要对表进行操作之前,需要使用库,之后的操作都是在该库下执行:
use 库名;
use test;
数据在库中的存储:
以表格的形式存储,表的一行称为一条记录,表中的一列称为一个字段。
9.删除数据库
mysql> drop database 数据库的名字;
当执行这句话后:
1. 数据库内部看不到对应的数据库
2. 对应的数据库文件夹被删除,级联删除,里面的数据表全部被删
注意:不要随意删除数据库。
4.表的操作
1.创建表
语法:
CREATE TABLE table_name(
field1 datatype,
field2 datatype,
field3 datatype,
field4 datatype
)character set 字符集 collate 校验规则 engine 存储引擎;
1.field是字段名
2.datatype是字段的类型
3.character set 是指定字符集,如果没有指定字符集,则以所在的数据库的字符集为准
4.collate 校验规则,如果没有指定校验规则,则以所在的数据库的校验规则为准
mysql> create table users (
‐> id int,
‐> name varchar(20),
‐> school char(20) comment '学校',
‐> ) character set utf8 engine MyISAM;
不同的存储引擎,创建表的文件不一样。
当指定的引擎是MyISAM时,对应的有三个文件。.frm (表结构),.MYD(表数据),.MYI(表索引)
查看表结构:
mysql> desc 表名;
2.修改表
添加一个字段
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column datatype]...);
修改字段
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column datatype]...);
删除一列
ALTER TABLE tablename DROP (column);
mysql> alter table users add sex char(2) after name;
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> alter table users modify name varchar(10);
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> alter table users modify name varchar(10);
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> alter table users drop sex;
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from users;
+------+-------+--------+
| id | name | school |
+------+-------+--------+
| 1 | kris | a |
| 1 | chris | b |
| 1 | qiana | c |
+------+-------+--------+
3 rows in set (0.00 sec)
5.表的增删查改
1.增加
语法:insert int table_name[(column[,column...])] values (value,[,value...]);
mysql> select * from users;
+------+-------+--------+
| id | name | school |
+------+-------+--------+
| 1 | kris | a |
| 1 | chris | b |
| 1 | qiana | c |
+------+-------+--------+
3 rows in set (0.00 sec)
mysql> insert into users values(2,'Tom','d');
Query OK, 1 row affected (0.00 sec)
注意:
- 插入的数据与字段的数据类型相同。
- 数据的大小应在规定的范围内。
- 在value中列出的数据位置应与被加入的列的位置相对应
- 字符和日期类型要包含在单引号中
- 插入空值,不指定或insert into table values(null)
- insert into table values(),(),();
- 如果给表中所有的字段添加数据,可以不写前面的字段名称
- 如果只给表的某几个字段赋值,则需要制定字段名
在数据插入的时候,假设主键对应的值已经存在,则会插入失败!
当主键存在冲突的时候,可以有如下处理:
- 更新操作:更改原主键中的其他字段的值
insert into 表名(字段列表) values(值列表) on duplicate key update 字段=新值; - 替换操作:replace into 表名(包含字段) values(值列表);
2.修改
更新表中的数据
语法:update table_name set col_name=exp1,[col_name=exp2...] [where condition];
没有条件时,整表进行修改
mysql> update users set school='a';
mysql> update users set name='Grace' where id=2;
注意:
- update 语法可以用新值更新原有表中的各列
- set子句指定要修改哪些列和要给予哪些值
- where子句指定应更新哪些行,如果没有where子句,则更新所有行
- 如果需要更新多个字段,可以通过 set 字段1=值1,字段2=值2...
update还可以限制更新的数量
update 表名 set 字段=值 [where 条件] [limit 更新数量]
3.删除表中数据
语法:delete from table_name [where 条件]
mysql> delete from users where id=2;
删除表中的所有记录,表的结构还在:
mysql> delete from users;
删除表的记录和表的结构:
mysql> truncate table users;
truncate和delete的区别:
- 效果一样,truncate更快一些
- delete可以带where条件,删除更加灵活
- delete可以返回被删除的记录数,而truncate返回0
4.查询
语法:select [distinct] *| {column1,column2,...} from table_name;
使用select * 查询所有的数据
select * from users;
查询某些字段
select id,name from users;
使用distinct去除重复行
select distinct school from users;
在select中可以使用表达式对查询的列进行计算
select name="chris" from users;
使用as起别名
select name as person from users;
可以使用表达式对查询的列进行计算
select name,chinese+math+english as total from student;
可以结合where,like(模糊查询)进行查询
select name,(chinese+math+english)/3 as average from student where name like 'k%';
select中可以使用where子句进行查询过滤。
在where子句中经常使用的运算符:
使用order by子句进行排序:
语法:select column1,column2 from tablename order by column asc|desc
使表中的数据按照column进行升序(asc)或降序(desc)排序,默认是升序排序
使用group by子句进行分组:
语法:select column1, column2, ... from tablename group by column;