MySQL的常规知识

标准的SQL语句通常可分为如下的几种类型:

1,DCL(Database Control Language) :数据控制语言,主要由grant和revoke关键字组成。

2.DDL(Database Define Language):数据定义语言,主要由Create、Drop、Alter和Truncate关键字组成。

3,DML(Database Manipulate Language):数据控制语法,主要由insert、update和delete关键字组成。

4,DQL(Database Query Language):数据查询语言,主要由select关键字组成

5,TCL(Tranlasion Control Language):事物控制语言,主要由commit、rollback和savePoint关键字组成。

show

查看数据库

show databases;

查看表

查看编码格式

show variables like 'character%';

存在的所有表

show tables;

创建表的命令

show create table table_name;

表的结构

show index from table_name;

show columns from table_name;

注:“show columns from table_name;”和“desctable_name;”效果是一样的。

show table status like "table_name"\G

注:”\G”是为了让数据显示更清晰易懂,也可以不设置。

查看服务器

服务器状态

show status;

服务器配置变量

show variables;

use

使用数据库

use database_name;

create

创建数据库

create database if not exists database_name;

创建表

创建非临时表

create table student_info(StuID int not null auto_increment,StuName varchar(15) not null,Telephone bigInt not null,primary key(StuID));

注:

1,auto_increment属性的对象只能是整形,在进行值插入时若不指定具体的值,或指定其为null或0,则其自动赋值为当前列的最大值再加上1的值。

2,primary key()是设置主键,一个表可以不止一个主键。

创建临时表

create temporary table Student_info(StuID int not null auto_increment,StuName varchar(15) not null,Telephone bigInt not null,primary key(StuID));

注:创建临时表要用关键字”temporary”,临时表主要是用于保存一些临时数据,临时表的数据只是在当前连接可用,当断开链接后就会,MySQL就会自动删除临时表。

创建复制旧表的数据和结构的新表

create table new_table select * from old_table;

注:这种方法会将旧表中的所有内容都拷贝过来,当然我们也可以用deleteinsert into来删除、增加。不过这种方法最不好的地方就是没有了旧表的primary
key
extra(auto_incremet)等属性。需要自己用alter手动添加。

创建复制旧表的结构的新表

  create table new_table select * from old_table where 1 = 2;

    注:这种方法只是复制表结构,当然旧表中的primary key 和auto_increment等属性都是复制过来了。

创建表时指定引擎和编码方式

  create table new_table(id int not null,name varchar(20) not null)engine=InnoDB,default charset=UTF-8;

    注:因为默认的引擎就是InnoDB,默认的编码方式就是utf-8,所以如果不改变引擎和编码方式可以不添加engine=InnoDB,default charset=utf-8

创建表的时候,指定默认的值

  create table new_table(id int not null,name varchar(20) not null,salary int not null default 1200)engine=InnoDB,default charset=UTF8;

    注:salary int not null default 1200,表示插入所有行中salary的默认值都是1200。

desc

查看表结构

desc table_name;

drop

撤销数据库

drop database databasename;

撤销表

drop table if exists table_name;

注:dropexists的用法是不一样的,drop是永久删除表,而delete只是删除表中的数据。

delete

删除表数据

删除表的所有数据

delete from table_name;

删除指定表中的数据

delete from table_name where column_name > value;

truncate

删除表数据

删除表的所有数据

truncate table_name;

  注:truncate和delete的区别,对于大部分数据库而言,truncate都被当成DDL处理,truncate被称为“截断”某个表-它的作用是删除该表里的全部数据,但保留数据结构。相当于DML中的delete命令,truncate的速度要快得多,而且truncate不像delete可以删除指定的记录,truncate只能删除表中的全部记录。MySQL对truncate的处理比较特殊-如果使用非InnoDB的存储引擎,truncate要比delete快;如果使用InnoDB的存储引擎,在MySQL5.0.3之前,truncate和delete完全一样,在5.0.3之后,truncate比delete要快,但如果该表被外键约束所参照,truncate又变成delete操作。在5.0.13之后,快速truncate总是可用的,即比delete的速度要快。在使用

insert

插入数据

插入完整元组

insert into Student_info values (10,'宋文',123456789);

插入非完整元组

insert into Student_info(StuName,Telephone) values ('小吴,'123456789');

注:在决定插入元组数据中的属性个数时,主要依据表中属性的完整性来决定。

复制表数据

复制旧表的数据到新表

insert into 新表 select * from 旧表

注:

这里两个表的结构要求要一样

这里只是复制数据,旧表的primary keyauto_increment还是需要自己添加。下面的方法也可以得到两个完全一样的表

方法一:首先用“creat table 新表 like 旧表”将旧表的结构复制过来,然后使用“insert
into 新表 select * from 旧表
”将表中的数据复制过去。

方法二:show create table旧表命令得到创建表的命令,复制粘贴再更改名称最后运行,得到一个数据结构和属性一样的新表(除名称),再用这里insert命令,将数据复制过去,就可以得到完全一样的表了。

复制旧表的部分数据到新表

insert into 新表 (字段1,字段2......)select 字段1,,字段2,.....from 旧表

注:

1,这里两个表的匹配字段数据类型要一致。

2,这里只是复制数据,旧表的primary keyauto_increment还是需要自己添加。

insert ignore into 和 insert into 的区别

INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。INSERT IGNORE INTO当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。 而REPLACE INTO into如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录。

select

查看当前日期

select current_date;

查看服务器版本

select version();

查看当前数据库名称

select database();

查看当前用户名

select user();

查询表中数据的语句

查询表中指定字段无重复的数据

select distinct column_name from table_name wherecondition;

注:

1,distinct用于显示的数据内容不存在重复

2,*表示所有数据

3,condition可以用大于、小于等

查询数据之动态指定条件语句

比如有两个表,分别是table1和table2,在table1中有一个id1属性,在table2中有一个id2属性。如果要查询符合id2中的id1的数据,不需要分两句书写,可以直接将其写到一起,比如:

select table1.id1 from table1 where id1=(select table2.id2 from table2 where id2=1);

必须注意:在条件语句中的得出table2的数据只能是一个明确的数值,不能是一个数组。

连接查询

语法:

select 属性 from 表1,表2 where (表1.属性 = 表2.属性);

注:“表1.属性 = 表2.属性” 是很重要的,它表示两个表连接的条件。

简单连接查询

select * from student_info,test_table where( StuID >2) and(StuID < 5) and (student_info.StuID = test_table.test_StuID);

注:查询Student_info表中StuIDtestable表中tesStuID的值相同的所有数据,并且满足Student_info中的StuID在2到5的条件。

自连接查询

语法:

  使用别名

例如:

打印这个表中所有的id,name,但是这个name对应的id至少有一次出现在manager_id中(如果把id看成员工编号,manager_id看成员工上司的id号,那么请打印所有的管理层)。

select distinct z.id,z.name from zilianjie z,zilianjie j where j.manager_id=z.id;

超连接查询

语法:

内部连接:select 属性1,属性2....... from 表1 inner join 表2 on 表1.属性 = 表2.属性

左连接: select属性1,属性2....... from 表1 left join 表2 on 表1.属性 = 表2.属性

右连接 : select 属性1,属性2....... from 表1 left join 表2 on 表1.属性 = 表2.属性

内部连接

inner join 形式的连接称为内部连接,也可以写为join。内部连接表示只有满足条件的记录才会显示到查询结果中

select * from student_info inner join test_table on student_info.StuID = test_table.test_StuID;

这个语句等价于select * from student_info,test_table where(student_info.StuID =test_table.test_StuID);

左连接

left join 形式的连接称为左连接。查询结果包含join左侧表中的所有记录以及右侧表满足条件的记录

右连接

right join 形式的连接称为右连接。查询结果包含join右侧表中的所有记录以及左侧表中满足条件的记录

并运算查询

语法

union表示并运算

实例

将两个表中满足条件的数据显示

select StuID,StuName,Telephone from student_info where StuName = "第三个名称"

union

select test_StuID,test_Name from test_table where test_StuID= 4;

注:这里两个表需要查询出来的属性数目要一致,否则就会出现“ERROR 1222 (21000): The used SELECT statements have a different number of columns”的错误。

update

更新部分数据

update table_name set StuName = "易建联" where StuID = 1;

更新整列的值

update table_name set Telephone= Telephone + 1;

alter

更改表

在表中增加一个属性

alter table 表 add column 属性 数据类型 [列的完整性];

改变表中某个属性

alter table 表 change 属性 属性 数据类型 [列的完整性];

alter table 表 modify 属性 数据类型 [列的完整性];

注:change可以改变属性名称,但是modify只能在原来的属性上进行修改。

撤销表中的某个属性

alter table 表 drop 属性;

更改表的名称

alter table 旧表名 rename 新表名;

撤销和更改表的主键

alter table 表 drop primary key,add primary key(属性);

在第一行添加属性

alter table table_name add I [….]first;

注:

这里的first表示在第一行添加属性I

[….]用于表示列的完整性

比如:

alter table userinfo add userAge varchar(2) not null first;

在属性I后面添加J属性

alter table table_name add I […] after J;

注:

[…]用于表示列的完整性

这里的I[…] after J表示在J后面添加属性I

删除字段I的默认值

alter table table_name alter I drop default;

注:使用 ALTER命令及 DROP子句来删除字段的默认值

更改表的引擎

alter table table_name engine=engineName;

注:将数据表的引擎更改为指定的引擎。

修改表序列的起始值

alter table table_name auto_increment=value;

注:

更改表的序列起始值为value。

这里的value依据设定auto_increment的列的数据类型而定,如int则可以为整数,如varchar(4)可以为字符串

视图

创建视图

创建或替换视图语法:

create or replace view 视图名[字段名1,字段名2,.....] as 查询语句

从单个表中派生视图

如:

create view v1 as select StuID,StuName from Student_info;

从多个表中派生视图

如:

create view v2 as select * from student_info,test_table where student_info.StuID = test_table.test_StuID;

视图虚字段

如:

create view v3 as select StuName,Telephone as oritel,telephone + 1 as retel from student_info;

注:这里重新创建了一个视图,有三个属性分别为StuName、oritel、retel,其中oritel属性就是Telephone,retel属性是Telephone+1的值。因为这里的oritel和retel属性在原表中是没有的,需要通过计算而来的,所有被成为虚字段。

删除视图

删除视图语法:

drop view 视图名

如:

drop view v3;

视图的说明

MySQL中的视图是可更新的,任何对原表的更改都会反应到视图中,或者任何对视图的更改都会反应到原表上。

正则表达式

查找指定的数据

查找name字段中以'st'为开头的所有数据:

select name from table_name where name regexp'^st';

查找name字段中以'ok'为结尾的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符开头且以'ok'字符串结尾的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou].+ok$';

查找name字段中以元音字符开头或者以'ok'字符串结尾的所有数据:

SELECT name FROM person_tbl WHERE nameREGEXP '^[aeiou]|ok$';

NULL运算符

说明:

IS NULL: 当列的值是NULL,此运算符返回true。

IS NOT NULL: 当列的值不为NULL, 运算符返回true。

<=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。

例子:

比如:

select * from table where column_name is null;

注:将会显示column_name为null的所有数据,不能使用select * from table where column_name = null。

select * from table where column_nameis not null;

注:将会显示column_name不为空的所有数据,不能使用select * from table where column_name != null。

select null <=> null;

注:将会显示1。

select null <=>"NotEmpty";

注:将会显示0。

SQL注入

sql注入是什么

就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

举例

MySQL特点,执行语句的时候如果出现这样的语句将会不报错,并且继续执行,

select * from table_name where user =value;show tables;

这样回车就是两个语句,这里是会执行两个语句的,如果在表单中查询用户的信息,那么在表单输入中的用户名一栏写入,

'jame;delete from user;'

那么最后就会删除user表。

事务

一般来说,事务是必须满足4个条件(ACID):Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

1、事务的原子性:一组事务,要么成功;要么撤回。

2、稳定性 : 有非法数据(外键约束之类),事务撤回。

3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。

双索引

primary key(column1,column2);

设置了双索引的话,那么满足两个数据都重复的数据不会存入,有一个数据重复则可以存储。

order by

语法:

order by 属性1,属性2,...... [asc,desc];

注:asc为升序(默认为升序)

desc为降序

当有多个属性值进行排序的时候,按照先后顺序进行排序。

:

select * from Student_info order byStuID,StuName desc;

先按照StuID进行降序排序,再按照StuName进行升序排序。

删除某个数据库下的所有表

SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')

FROM information_schema.tables

WHERE table_schema = 'mydb';

将mydb换成需要删除的数据库就可以了。

binary

binary用于可以用于区分大小写

MySQL中本来是不区分大小写的,

比如:“select* from table_name where name = "Jame";”可以搜索出table_name 表中Jame、jame、jAme等数据,

但是“select * from table where binary name ="Jame";”就只能搜索出Jame数据。

addcslashes() 

addcslashes() 函数在指定的字符前添加反斜杠。

参数    描述

string 必需。规定要检查的字符串。

characters     可选。规定受 addcslashes() 影响的字符或字符范围。

select coalesce(a,b,c)

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

如:

创建一个employee_tbl表:

CREATE TABLE `employee_tbl`(`id`int(11) NOT NULL,`name`char(10) NOT NULL DEFAULT '',`date` datetime NOT NULL,`singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

向表中插入数据:

INSERT INTO `employee_tbl` VALUES ('1','小明','2016-04-22 15:25:33','1'),('2','小王','2016-04-20 15:25:47','3'),('3','小丽','2016-04-19 15:26:02','2'),('4','小王','2016-04-07 15:26:14','4'),('5','小明','2016-04-11 15:26:40','4'),('6','小明','2016-04-04 15:26:54','2');

查询表中数据:

mysql> SELECT * FROM employee_tbl;+----+--------+---------------------+--------+| id | name   | date                | singin |+----+--------+---------------------+--------+|1|小明|2016-04-2215:25:33|1||2|小王|2016-04-2015:25:47|3||3|小丽|2016-04-1915:26:02|2||4|小王|2016-04-0715:26:14|4||5|小明|2016-04-1115:26:40|4||6|小明|2016-04-0415:26:54|2|+----+--------+---------------------+--------+

接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:

mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;+--------+----------+| name   | COUNT(*)|+--------+----------+|小丽|1||小明|3||小王|2|+--------+----------+3 rows inset(0.01 sec)

使用 WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:

mysql> SELECT name, SUM(singin)as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;+--------+--------------+| name   | singin_count |+--------+--------------+|小丽|2||小明|7||小王|7|| NULL   |16|+--------+--------------+4 rows inset(0.00 sec)

如果不使用With Rollup则结果不会出现NULL字段

其中记录 NULL 表示所有人的登录次数。

我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:

select coalesce(a,b,c);

参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

以下实例中如果名字为空我们使用总数代替:

mysql> SELECT coalesce(name,'总数'), SUM(singin)as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;+--------------------------+--------------+| coalesce(name,'总数')| singin_count |+--------------------------+--------------+|小丽|2||小明|7||小王|7||总数|16|+--------------------------+--------------+4 rows inset(0.01 sec)

参考文章连接:

http://www.runoob.com/mysql/mysql-tutorial.html

http://blog.csdn.net/qq_30276065/article/details/52998178

【MySQL】MySQL的常规操作的更多相关文章

  1. mysql服务器的常规操作

    mysql服务器的常规操作 导读 MySQL是一个小型关系数据库管理系统,目前被广泛的应用在Internet上的中小型网站中,体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,使得许多中小型网站 ...

  2. php操作mysql(数据库常规操作)

    php操作数据库八步走 <?php .建立连接 $connection '); .判断连接是否成功 if (mysqli_connect_error() != null) { die(mysql ...

  3. 数据库mysql的常规操作

    1. 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进 ...

  4. MySQL常规操作以及问题

    背景 作为一个前端,偶尔搞下后端 要熟悉 SQL 操作,但是一段时间不用 会大部分忘记,之后又要重新查资料 所以自己整理一遍经常用到的 SQL 操作 和使用过程遇到的问题,方便自己快速查阅 一.安装 ...

  5. python操作mysql数据库的相关操作实例

    python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...

  6. [转]Mysql命令行常用操作

    Mysql命令行常用操作 一.从命令行登录MySQL数据库服务器 1.登录使用默认3306端口的MySQL /usr/local/mysql/bin/mysql -u root -p 2.通过TCP连 ...

  7. [mysql]brew 安装 配置 操作 mysql(中文问题)

    mac 下卸载mysqldmg mac下mysql的DMG格式安装内有安装文件,却没有卸载文件--很郁闷的事. 网上搜了一下,发现给的方法原来得手动去删. 很多文章记述要删的文件不完整,后来在stac ...

  8. mysql 查看 删除 日志操作总结(包括单独和主从mysql)

    我们可以在mysql的安装目录下看到mysql的二进制日志文件,如mysql-bin.000***等,很多人都不及时的处理,导致整个硬盘被塞满也是有可能的.这些是数据库的操作日志.它记录了我们平时使用 ...

  9. MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项

    以下的文章主要介绍的是MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项是值得我们大家注意的,我们大家可能不知道过多的对索引进行使用将会造成滥用.因此MySQL索引也会有它的缺点: 虽然索引 ...

  10. MySQL【Update误操作】回滚(转)

    前言:      继上一篇MySQL[Delete误操作]回滚之后,现在介绍下Update回滚,操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和bi ...

随机推荐

  1. JavaScript中一个对象如何继承另外一个对象

    如题,JavaScript中一个对象a如何继承另外一个对象b.即将b中的属性和方法复制到a中去. 面试中遇到了这个问题,当时脑子里的想法是: 1.除了循环遍历复制,还能怎样 2.javascript中 ...

  2. Java 面向切面编程(Aspect Oriented Programming,AOP)

    本文内容 实例 引入 原始方法 装饰者模式 JDK 动态代理和 cglib 代理 直接使用 AOP 框架--AspectWerkz 最近跳槽了,新公司使用了 AOP 相关的技术,于是查点资料,复习一下 ...

  3. HTML DOM defaultValue 属性

    定义和用法 defaultValue 属性设置或返回文本框的初始内容. 注释:文本框的初始值是位于 <textarea> 和 </textarea> 标签之间的文本.在表单被重 ...

  4. Android Developers:按钮

    按钮是有文本或者图标(或者文本和图标)组成,它传达用户触摸它的时候所发生的动作. 你可以在你的布局中使用三种方式创建按钮,取决于你是否想创建文本按钮,突变按钮或者两者都有: 设置文本,使用Button ...

  5. Ubuntu MYSQL环境搭建

    前期准备: 检查系统资源 内存大小 # grep MemTotal/proc/meminfo 检查系统版本 统一为: Ubuntu 12.04.1 LTS(GNU/Linux 3.2.0-29-gen ...

  6. reStructuredText - 一个比MarkDown更好用的标记语言

    文档和教程 http://docutils.sourceforge.net/rst.html http://zh-sphinx-doc.readthedocs.io/en/latest/rest.ht ...

  7. Linux安装和设置Samba服务器

    1. 安装 安装前先关闭iptables和SELinux. Centos输入以下命令: yum install samba samba-client Ubuntu输入以下命令: apt-get ins ...

  8. dpkg: warning: files list file for package `*****' missing, assuming package has no files currently installed解决办法

    一个好友的国外VPS由于操作不当,结果装软件的时候总是提示dpkg: warning: files list file for package `*****' missing, assuming pa ...

  9. 删除sql server用户时报15138错误

    问题 在删除sql server中某数据库下的用户时报15138错误,见下图  解决 可用下述sql代码检查该用户的架构信息,然后逐一修正 SELECT s.name FROM sys.schemas ...

  10. Reading CheckBoxes and Radio Buttons

    Input tags with the type attribute checkbox can be grouped like radio buttons so that several checkb ...