标签:选择 select查询 类型 spec mat collate arc 特定 基础
数据库结构:层次模型
网状模型
关系模型
关系模型,是我们最常用的数据库管理系统类型;他的主要组成部分是表(表:由记录(行),和字段(列)组成)
关系型数据管理系统:
范式:是关系模式的集合,构造关系数据库需要遵守一定的规则,而这些规则就是范式
目前数据库有六种范式:第一范式,第二范式,第三范式,巴德斯科范式(BCNF),第四范式,第五范式;
满足最低要求的范式是第一范式,在第一范式的基础上再满足一些要求形成第二范式,以此类推,因此,范式等级越高越难实现数据存储;
表(二维表):包括行和列,一个表可以没有行(记录),但必须有一个列(字段)
数据库:
数据库包括的内容:表,索引,视图(虚表),SQL_interface,存储过程,存储函数,触发器,事件调度器;
约束:(约束的是字段(列))
主键约束:数据唯一不能为空;一个表中只能有一个主键
唯一键约束:数据唯一,可以为空,唯一键可以有多个也可以没有;
外键约束:引用性约束或参考性约束;即:如果某表中频繁出现冗余信息,应该将此类信息存储于其他的表中,而此表中该字段的数据为另一张表的主键中所包含的值;
检查性约束:表达式约束;
MySQL 和 MariaDB
客户端/服务器架构
客户端程序:mysql、mysqladmin、mysqldump.......
服务器端程序:msyqld_safe、msyqld、mysqld_multi
MySQL的安装:在CentOS Base源下有rpm包,也可以去官方下载二进制包或者源代码包;
MySQL的配置文件:/etc/my.cnf /etc/my.cnf.d ~/.my.cnf
通常在启动服务时按照如上的顺序去读取配置文件里面的参数,若配置文件内有相同的参数,则以最后的为准;
也可以使用mysqld_safe服务器端程序启动服务,-c + 文件,或-e +文件 使用指定的文件内的参数,-c 和 -e 一定要放在首位;-c 是只读指定文件内参数,而-e则是把指定文件附加到最后用来读取参数
mysql命令:
选项:
-u :指定用户
-h:指定主机
-p:指定密码
-P:指定端口号
-D:指定使用哪个数据库
[root@bogon ~]# mysql -p111111 -D wang4 -e 'create table wang2(ID char primary key);' MariaDB [wang4]> show tables; +-----------------+ | Tables_in_wang4 | +-----------------+ | wang2 | +-----------------+
mysql下的交互式命令(可以使用\?)查看:
\c,clear :停止当前输入的命令,返回提示符
MariaDB [mysql]> select User from user; +------------+ | User | +------------+ MariaDB [mysql]> select User from user \c MariaDB [mysql]>
\d,delimiter:设置语句的结束标记,默认是;
MariaDB [mysql]> \d . MariaDB [mysql]> select User from user. +------------+ | User | +------------+
\G,ego :让返回的结果纵向显示
MariaDB [mysql]> select User from user\G *************************** 1. row *************************** User: root
\g,go:不需要输入结束标记,直接送到mysql服务器
\q,quit、exit:退出mysql交互模式
\s,status:获取mysql的状态信息
\u,use:使用指定的数据库
MariaDB [mysql]> use hellodb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [hellodb]>
\.,source:在mysql交互模式执行SQL脚本文件,
\?,help:寻找命令帮助
mysqladmin:客户端命令
选项:-u, -h, -p, -P, -D, 和mysql命令一样
常用子命令:
create db_name:创建数据库;
[root@bogon ~]# mysqladmin -p111111 create db1;
drop db_name:删除数据库;
[root@bogon ~]# mysqladmin -p111111 drop db1; Dropping the database is potentially a very bad thing to do. Any data stored in the database will be destroyed. Do you really want to drop the 'db1' database [y/N] y Database "db1" dropped
flush-hosts:清除服务器缓存中所有信息;
flush-logs:清除日志,让日志滚动;
flush-privileges:刷新授权表;
flush-tables:为表加锁;
password new-password:为指定的用户设置新密码;
start-slave:在msyql的集群服务中的从节点启动用于实施复制功能的线程;
stop-slave:在msyql的集群服务中的从节点关闭用于实施复制功能的线程;
shutdown:停止服务;
mysqld_safe服务器端命令:用于启动mysql服务,定义mysql的工作特性;
这里定义工作特性是指定参数;
指定参数可以在mysql交互式命令里面使用如下方法查看
show [global | session] variables like '参数名称' (参数名称可以支持mysql的通配符) ,若不写global或session默认是global
或者
select @@[global|session].'参数名称'若不写global或session默认是global
MariaDB [(none)]> show variables like '%file' -> ; +-------------------------+------------------------------+ | Variable_name | Value | +-------------------------+------------------------------+ | ft_stopword_file | (built-in) MariaDB [(none)]> select @@ft_stopword_file -> ; +--------------------+ | @@ft_stopword_file | +--------------------+ | (built-in) | +--------------------+
查看与状态及统计信息相关的参数/变量的值;
show [global | session] status like '参数名称' (参数名称可以支持mysql的通配符) ,若不写global或session默认是global
修改服务器变量的方法:
set '参数名称' = 参数值
set @@参数名称 = 参数值
如
set global innodb_file_per_table=1;
set @@global.innodb_file_per_table=0;
MariaDB与MySQL模式
ANSI:宽松模式,当插入的数据不符合类型,或长度不匹配,则会发出warning警告
TRADITIONAL:严格模式。对于插入的数据进行校验,如果该数据不符合字段定义的数据类型或长度要求,报告Error错误警告,且错误数据不会被写入;
该模式用于事务时,此前可能已经进行了一系列的数据插入和修改操作,而一旦发送上述错误,此前所有的INSERT/UPDATE等操作均会被立即放弃并回滚。
该模式用于非事务时,一旦发送上述错误,则此前所有的INSERT/UPDATE等操作均不会回滚
(事务:包括事务开始条件和事务结束条件;一般包含一个或多个SQL语句)
STRICT_TRANS_TABLES:严格模式。对于插入的数据进行校验,如果该数据不符合字段定义的数据类型或长度要求,报告Error错误警告,且错误数据不会被写入;
STRICT_ALL_TABLES:严格模式。对于事务型操作,与STRICT_TRANS_TABLES模式效果一样;对于非事务操作,与TRADITIONAL模式效果一样。
数据库的数据类型:
数值型:
精确数值型:
TINYINT(3):8bits,0~255,-128~+127
SMALLINT(5):16bits,0~65535,-32768~+32767
MEDIUMINT(8):24bits,0~16777735
INT(10):32bits,
INTEGER:48bits,
BIGINT:64bits
近似数值型:
REAL
DOUBLE
FLOAT
字符串型:
变长字符型:
VARCHAR(length):字符不区分大小写;65536个字符;
VARCHAR(30)
qhdlink$ -- 8字节存储空间;
VARBINARY(length):字符区分大小写;65536个字符;
定长字符型
CHAR(length):字符不区分大小写;256个字符;
CHAR(30)
qhdlink -- 30字节空间;
BINARY(length):字符区分大小写;256个字符;
对象存储类型:
TEXT:存储大量的纯文本信息;
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
BLOB:存储非纯文本信息经过流式化处理之后的二进制数据;
TINYBLOB
BLOB
MEDIUMBLOB
LONGBLOB
日期时间型:
DATE:日期型,3字节;
TIME:时间型,3字节;
TIMESTAMP:时间戳类型,4字节;
DATETIME:日期时间型,8字节;
YEAR:年份,YEAR(2),YEAR(4)
内置特殊类型:
集合类型:
SET:集合,插入的数据可以是集合中各个元素的任意组合;
SET('a','b','c','d')
a
aa
aab
abdc
枚举类型:
ENUM:枚举,只能存放列举出来的固定的字符或字符串;
ENUM('F','M')
F
M
数据类型相关的修饰符:
与整数类型相关的:
UNSIGNED,无符号整数;
注意:UNSIGNED修饰符必须紧跟在精确数值类型标识符之后;
AUTO_INCREMENT [=] Value:
整型数据的递增或递减;
通用修饰符:
NOT NULL:非空约束;一般是为主键做约束;
DEFAULT Value:为字段设置默认值;
数据库语言
DDL:数据库定义语言
创建数据库:CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name]
IF NOT EXISTS:
如果指定要创建的数据库已经存在,则不报错也不执行创建操作;
db_name:
要创建的数据库的名称
CHARACTER SET [=] charset_name:
查看mysql服务器所支持的所有字符集及默认排序规则;
COLLATE [=] collation_name:
为新创建的数据库指定字符集的排序规则;
MariaDB [(none)]> create database lilei character set = 'utf8'; Query OK, 1 row affected (0.01 sec) MariaDB [(none)]> create database if not exists lilei character set = 'utf8'; Query OK, 1 row affected, 1 warning (0.00 sec)
修改数据库的字符集或排序规则:ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] [CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name]
注意:如果数据库中已经有表,且表中已经插入数据时,更改数据库的字符集和排序规则可能会导致已存数据的乱码;
删除数据库:DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
MariaDB [(none)]> drop database lilei; Query OK, 0 rows affected (0.01 sec)
创建表:
CREATE TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options]
MariaDB [lilei]> create table han×××1(ID tinyint unsigned not null auto_increment primary key,Name varchar(30)); Query OK, 0 rows affected (0.03 sec)
显示表的结构:
mysql> desc stu_info;
显示创建表的SQL语句:
mysql> show create table stu_info;
删除表:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
修改表:修改表的各个字段的属性和定义的内容;
ALTER TABLE tbl_name [alter_specification [, alter_specification] ...]
增加表的字段:
ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ]
MariaDB [lilei]> alter table han××× add (Age tinyint not null); Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [lilei]> alter table han××× add SAge tinyint not null after Age; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0
修改表的字段属性
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
modify和change不同的是 modify不能修改字段名称;
MariaDB [lilei]> alter table han××× change SAge sex tinyint not null after Age; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0
删除表的字段:
DROP [COLUMN] col_name
注意:删除字段的操作可能会引起数据的变化,所以,删除字段时要慎重;
DML:数据库管理语言
向表中添加数据:
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
Or:
INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ...
MariaDB [lilei]> insert into han××× values(2,'wang',1,2); MariaDB [lilei]> insert into han××× (Name) values ('zhao'),('yuan'); MariaDB [lilei]> insert into han××× set ID=6,Name='yuan';
注意:
1.如果向表中插入的value是字符串,则value必须使用引号引用;
2.如果向表中插入的value是数字,则value一定不能用引号引用;
查看表中的数据内容:
SELECT select_expr [, select_expr ...] [FROM table_references] [WHERE where_condition]
1.显示整张表:
SELECT * FROM tbl_name;
2.投影:显示指定的或符合要求的列;
SELECT col_name AS con_alias[,col_name AS con_alias,...] FROM tbl_name;
3.选择:显示符合要求或匹配条件的行;
SELECT col_name AS con_alias[,col_name AS con_alias,...] FROM tbl_name WHERE condition;
WHERE子句用于指明选择时依据的条件:
col_name 操作符 value
MariaDB [lilei]> select ID from han××× where ID=6; +----+ | ID | +----+ | 6 | +----+
WHERE条件子句:
通过指明特定的过滤条件或表达式来实现"选择"运算;过滤条件有下列几种:
1.算术表达式:Age+10,
算术操作符:+, -, *, /, %;
2.比较表达式:Age+10<20;
比较操作符:=, <=>, <>, !=, >, >=, <, <=;
3.逻辑表达式:
逻辑操作符:AND, OR, NOT, XOR;
4.其他表达式:
空值判断:IS NULL, IS NOT NULL;
连续区间判断:BETWEEN ... AND ...
MariaDB [lilei]> select * from han××× where ID between 3 and 5; +----+------+-----+-----+ | ID | Name | Age | sex | +----+------+-----+-----+ | 3 | li | 0 | 0 | | 4 | zhao | 0 | 0 | | 5 | yuan | 0 | 0 | +----+------+-----+-----+
列表从属关系判断:IN (LIST);
模糊值判断:
LIKE:可以支持通配符,%和_;如果想要使用索引实现加速检索,则最左侧字符不能使用通配符;
RLIKE或REGEXP:可以支持正则表达式元字符;只要在查询条件中包含正则表达式元字符,则一定无法使用索引进行检索;功能很强大,但检索性能可能变差;
GROUP BY子句:
根据指定的字段将查询结果进行分组归类,以方便进行聚合运算;
常用的聚合运算函数:
avg():取平均值运算;
max():取最大值运算;
min():取最小值运算;
sum():做和运算;
count():做次数统计;
MariaDB [lilei]> select Name,count(Name) from han××× group by Name; +------+-------------+ | Name | count(Name) | +------+-------------+ | 10 | 1 | | li | 1 | | wang | 1 | | yuan | 2 | | zhao | 1 | +------+-------------+
(若同时使用GROUP BY 和where) where 放在group by之前
HAVING子句:对于经过分组归类并进行了聚合运算以后的结果进行条件过滤;
其条件表达式的书写格式与WHERE子句相同;
ORDER BY子句:根据指定的字段将查询结果进行排序,可以使用升序或降序,默认是升序;
升序:ASC
降序:DESC
LIMIT子句:
对于查询的结果进行限定行数的输出;
1.LIMIT [offset,] row_count offset是一个数:偏移量 row_count :是一个数,显示几行
MariaDB [lilei]> select * from han××× limit 1,2; 偏移一行,显示俩行,也就是从首行开始,略过一行,显示接下来俩行 +----+------+-----+-----+ | ID | Name | Age | sex | +----+------+-----+-----+ | 2 | wang | 1 | 2 | | 3 | li | 0 | 0 | +----+------+-----+-----+
2.LIMIT row_count OFFSET offset
MariaDB [lilei]> select * from han××× limit 2 offset 1; +----+------+-----+-----+ | ID | Name | Age | sex | +----+------+-----+-----+ | 2 | wang | 1 | 2 | | 3 | li | 0 | 0 | +----+------+-----+-----+
视图: 实际上是一个虚表,使用select查询语句的结果
创建视图:CREATE VIEW view_name [(column_list)] AS SELECT clause;
MariaDB [lilei]> create view han as select ID,Name from han×××; Query OK, 0 rows affected (0.00 sec) MariaDB [lilei]> select * from han; +----+------+ | ID | Name | +----+------+ | 1 | 10 | | 2 | wang | | 3 | li | | 4 | zhao | | 5 | yuan | | 6 | yuan | +----+------+
删除视图:DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]
注意:之所以创建视图,是为了隐藏某些字段的信息,所以我们查询视图的时候 显示的只是基表的一部分,当我们去给视图内添加数据时,若基表没显示的字段部分要求数据不能为空,则添加失败, 除非数据库模式为宽松模式;
标签:选择 select查询 类型 spec mat collate arc 特定 基础
原文地址:http://blog.51cto.com/wangchaode/2149165