数据库知识是每个开发人员必备的技能之一,但是真正花时间去了解的就比较少了,大部分都是可视化工具,简单的sql语句,在工作中基本上够用了,但是如果没有可视化工具,你对自己有多少的信心呢?反正我是好多都记不住(一个完整的创建表的sql我都写不下来,呜呜呜),这一系列博客,就简单介绍下我们传统的SQL语句怎么写(主要也是增进一下自己对数据库sql语句的认知)。所有的展示直接在虚拟机上进行了,安装mysql的过程就不展示了(是不是比较懒,哈哈哈)
官方给的标准创建数据库的sql语法:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
shcema和database是同义词,都可以用来创建数据库;如果db_name数据库存在,你需要加上if not exists,不然会出错,character set 指定数据库编码格式
我们先来创建数据库(创建数据库并指定编码格式为utf8):
create database if not exists db_test default character set utf8;
官方语法太多,贴出部分,感兴趣的可以自行到官网查看:https://dev.mysql.com/doc/refman/5.6/en/create-table.html#create-table-name
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
我们来创建自己的测试表:
id int not null auto_increment primary key comment '主键'(列名:id,类型int,不能为null,自动递增,主键,注释为:主键)
create table if not exists t_test(id int not null auto_increment primary key comment '主键',name varchar(50) comment '姓名',age age tinyint comment '年龄');
官方地址:https://dev.mysql.com/doc/refman/5.6/en/insert.html
我看网上有人说value和values执行顺序有比较大的差别,value比较快,不知道可不可行,有想深入了解的就得自己找找资料了。
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
SET assignment_list
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
SELECT ...
[ON DUPLICATE KEY UPDATE assignment_list]
value:
{expr | DEFAULT}
value_list:
value [, value] ...
assignment:
col_name = value
assignment_list:
assignment [, assignment] ...
插入我们自己的数据:
insert into t_test(id,name,age) values(2,'wangwu',15) (3,'xiaohong',15);
select * from t_test;
我们多插入几条数据之后(有重复的数据?现实中重名的也有啊,正常,哈哈):
如何删除数据?delete就行了:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
删除指定id的数据:
delete from t_test where id = 2;
现在有个需求是:删除姓名为zhangsan并且年龄最大,如何办?
有人说先把最大年龄查出来,再拿age做比较。这样是可以做到,但是没有发现多了一步操作吗?
mysql> delete from t_test
-> where age = (select max(age) from t_test where name='zhangsan');
当然还有别的方法,但是我说的是运用delete官方给的另一种方法。 我们可以仔细看下官方给的delete语句是什么样的?
order by...这不是排序吗?limit row_count 这不是限定行数的吗?是的,那么上面那个需求我们可以怎么做?
name为zhangsan的,按照age从大到小排序,limit限定删除1行,是不是也是可以的?
delete from t_test where name='zhangsan' order by age desc limit 1;
update语句:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET assignment_list
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
value:
{expr | DEFAULT}
assignment:
col_name = value
assignment_list:
assignment [, assignment] ...
我们先来来吧wangwu的年龄改为20,修改多个字段英文的逗号(,)隔开就行
mysql> update t_test set age=20 where name='wangwu';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0