MySQL数据库

MySQL数据库

切实执行你的梦想,以便发挥它的价值,不管梦想有多好,除非真正身体力行,否则,永远没有收获。
———————比尔盖茨

前言

学习后台,肯定免不了要接触数据库,所以对于一名从事后台开发的人员来说,掌握一门数据库语言是非常的重要,一定要重视起来,因为数据一旦处理不好,那么数据就会乱七八糟的。

我们在发布动态时候输入的内容都会发送到服务器,然后经手服务器储存起来,另外提供了访问接口给客户端,在客户端可以访问到后台的数据,不管是什么样的应用,大部分都离不开这个逻辑,废话不多说,我们现在来认识一下数据库。

在Android开发的时候,我们接触过Sqlite数据库,数据库储存数据的思路大概都是一致的,我们今天要看到的就是MySql数据库,Php中支持很多数据库,但是在LAMP模式中,MySql仍占据一席之地。

MYSQL特点

  • Mysql是一个关系数据库系统,把数据储存在表格,使用结构化查询语言(sql)访问数据库
  • Mysql是免费的
  • Mysql是一个功能齐全,运行快的数据库
  • Mysql是一个客户机/服务器系统,支持多线程,支持不同客户程序和管理工具

操作数据库

1、创建数据库

create database mydb;

2、查看创建数据库语句(查看mysql创建的源码)

show create database mydb;

3、使用数据库(需要先调用此语句,才进行其他操作)

use mydb (可写可不写分号)

4、删除数据库

drop database mydb;  

5、查看所有的数据库

show databases;  

6、修改数据库mydb1的字符集为utf8

alter database mydb1 character set utf8;  

7、了解

创建数据库mydb1,字符集用gbk

create database mydb1 character set gbk;  

查看数据库中所有的校对规则

show collation ;  

查看中文的校验规则

show collation like '%gb%';  

创建数据库mydb2,字符集用gbk,校验规则用gbk_bin

create database mydb2 character set gbk collate gbk_bin;  

设置客户端的字符集为gbk

set character_set_client=gbk;  

设置结果集的字符集为gbk

set character_set_results=gbk;  

关于表

1、创建表t

create table t(
    id int ,
    name varchar(30)
);

创建表t1,使用字符集gbk

create table t1(
    id int ,
    name varchar(30)
)character set gbk;

自动增长

create table t2(
    id int primary key auto_increment,
    name varchar(20)
) ;

2、查看创建表的源码

show create table t;

3,插入数据

insert into t(id,name) values(1,'张无忌');
insert t(id,name) values(2,'乔峰');
省略字段,意味着所有的字段都必须给值(自增例外)
insert t4 values(3,'杨过','2014-4-3');

4、更新

将表t4的第三条记录姓名字段改为杨康
update t4 set name='杨康' where id = 3;
将所有记录的名字都改为东方不败
update t4 set name = '东方不败';
修改多个字段
update t4 set id=6,name='萧峰' where id = 2;

5、删除

删除表格
drop table t4;
删除所有的记录
delete from t4 where id = 4;
delete from t4;
truncate table t4;

6、字段处理

给表t4增加一个字段address
alter table t4 add address varchar(100); 
删除字段address
alter table t4 drop column address;

7、查看表的结构

desc t4 ;

DQL:数据查询语言

创建一个学生表

create table stu(
id int primary key,   #主键约束
name varchar(30) unique,  #唯一约束
sex char(2) not null,  #非空约束
age int ,  
address varchar(50) default '北京'  #默认约束
);

insert into stu values(1,'张无忌','男',20,'北京');
insert into stu values(2,'小龙女','女',18,'古墓');
insert into stu values(3,'黄蓉','女',15,'桃花岛');
insert into stu values(4,'韦小宝','男',24,'扬州');
insert into stu values(5,'乔峰','男',34,'雁门关');
insert into stu values(6,'张果老','男',30,'雁门关');
insert into stu values(7,'老张','男',38,'黒木崖');
insert into stu values(8,'张','男',34,'桃花岛');
insert into stu values(9,'韦小宝','女',24,'新东方');
insert into stu(id,name,sex,age) values(10,'令狐冲','男',27);

1、查看所有数据

select * from stu;

2、查看小龙女的信息

select * from stu where id = 2;
select * from stu where name='小龙女';

3、查看年龄在20~30之间的人

select * from stu where age >=20 and age <=30;
select * from stu where age between 20 and 30;  # 包括20和30

4、查看所有的的姓名

select name from stu;
查看所有的的姓名,年龄,性别
select name,age,sex from stu;

5、模糊查询

# % 表示任意字符数
# _ 表示任意的一个字符
select * from 表名 where 字段名 like 字段表达式
#查询所有以张开头的人
select * from stu where name like '张%';
#查询姓名中含有张这个字的人
select * from stu where name like '%张%';
#查询姓名中含有张这个字的人并且姓名的长度是3个字的人
select * from stu where name like '张__' or name like '_张_' or name like '_张';

6、distinct

查询表中有几种性别
select distinct sex from stu;
查找姓名和性别整体都不同的记录
select distinct name,sex from stu;

创建分数表

create table score(
    id int primary key,
    sid int,
    china int,
    english int,
    history int,
    constraint sid_fk foreign key(sid) references stu(id)
);

insert into score values(1,1,68,54,81);
insert into score values(2,3,89,98,90);
insert into score values(3,4,25,60,38);
insert into score values(4,6,70,75,59);
insert into score values(5,8,60,65,80);

7、建带有外键的表(即score是stu的子表),需要要添加此语句

constraint sid_fk foreign key(sid) references stu(id)

带外键表的查询源码

8、给字段起别名

select id as 编号,china as 语文,english as 英语,history as 历史 from score;
select id 编号,china 语文,english 英语,history 历史 from score;

9、字段可以有表达式

select id,china+10,english,history from score;
查看所有人考试的总分是多少
select id,china + english + history 总分 from score;
查看总分大于200的人
select * from score where china + english + history > 200;

别名和表达式一起使用1

别名和表达式一起使用2

10、or 和 in 字段查询

//查询或
select * from stu where address = '桃花岛' or address = '黒木崖';
//查询包含
select * from stu where address in('桃花岛','黒木崖');

11、not int 字段查询以及语句嵌套查询

select id ,name from stu where id not in(select sid from score); 

12、null 字段查询

select * from stu where address = null; #错误的
select * from stu where address is null; 
#查询有地址的人
select * from stu where address is not null;

排序(order by)

1、升序排列

select * from score order by china asc;

2、降序排列

select * from score order by history desc;

3、多个字段进行排序(语文升序,对语文成绩一样的人再进行历史降序类排)

select * from score order by china asc,history desc;(优先前面的查询)
根据考试总分降序进行排序
select *,china + english + history 总分 from score order by china + english + history desc;

约束

1、外键约束

可以理解为一个特殊的字段

创建引用约束

alter table score add constraint stu_score_fk foreign key(sid) references stu(id); 

删除约束

alter table score drop foreign key stu_score_fk;

删除外键约束

2、引用约束

注意:   
   1. 添加记录时必须先添加主表中的记录,再添加字表中的记录  
   2. 不能更改主表中具有外键约束的记录的主键  
   3. 删除记录的时候不允许删除具有外键关系的主表中的记录   
     (删除的顺序应当是先删除字表中的记录,然后删除主表中的记录)

多表查询

1,交叉查询

(cross  join ... on ...)查询每个人的考试成绩  
select * from stu s cross join score c on s.id = c.sid;  #交叉 比较了45次

(inner  join ... on ...)查询参加考试的人的成绩  
select name,china,english,history,china+english+history 总分 
from stu s inner join score c on  s.id = c.sid;

(left join ...on...,以左表为主的查询)查询所有人的成绩  
select name,china,english,history,china+english+history 总分 
from stu s left out join score c on  s.id = c.sid;

(not int)查询没有参加考试的人  
select * from stu where id not in(select sid from score);

查询参加考试的人的成绩  
select name,china,english,history,china+english+history 总分 
  from stu s,score c where s.id = c.sid;

2、聚合函数

  • sum max,min avg ,count

    //stu表中最大年龄最大的
    select max(age) from stu;
    //score表中china的平均值
    select avg(china) from score;

3、分组函数(group by)

select count(*) 数量,sex,name from stu group by sex,name; #根据多个字段进行分组
//分组条件 group by ...having ...
select count(*),sex from stu where age >=16 group by sex having count(*) >1;

你可能感兴趣的:(MySQL数据库)