mysql实践一:SQL基础
mysql简介
mysql是有名的开放源代码关系型数据库。它最早是AB公司开源的,后来到Sun公司手中。之后Sun公司被Oracle公司收购,mysql就归Oracle所有。从此mysql走向商业化,又有名为mariadb数据库作为mysql的分支被开源,之后mysql又出了社区版和企业版。mysql大致的历史就这样,更详细的可以百度,这里不多展开。
对于开发者来说,数据库是绕不开的一门技术,所有mysql这个有名,使用又频繁的开源数据库当然又学习的必要。
mysql的安装
mysql的安装可以是源代码编译安装,或者是在mysql的官网直接下载二进制文件,然后安装。当然,在容器技术这么火的2019,直接在docker上安装并使用mysql对开发者来说更合适。
先准备一台CentOS7虚拟机,安装docker。直接下载mysql镜像:
docker pull mysql:5.7
如果因为是在国内使用安装慢,可以使用阿里云的镜像加速。
然后启动mysql镜像
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
默认mysql数据库root用户的登陆密码为123456,。本机使用mysql命令登陆,未安装可以使用yum命令安装:
yum install -y mysql
使用mysql命令登陆:
mysql -uroot -p123456 -h 127.0.0.1
SQL简介
SQL全称为Structure Query Language(结构化查询语言),它是使用关系型模型的数据库应用语言。SQL语句主要分为三类:
- DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括create、drop、alter等。
- DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括insert、delete、update和select等。
- DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。
注:SQL语句中的
;
或者\g
都是语句的结束符。\G
表示行显示输出。
DDL语句
DDL是针对数据库内部的对象进行创建、删除、修改等操作,一般是数据库管理员(DBA)来使用。我们看列举常用的DDL语句。
创建数据库
创建数据库使用的命令为:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
例如创建一个名为test的数据库:
MySQL [(none)]> CREATE DATABASE test DEFAULT CHARSET utf8;
Query OK, 1 row affected (0.00 sec)
注:mysql中sql是不区别大小写的,所以上面的命令等同于
create database test default charset utf8;
选择数据库
创建数据库之后,就可以针对对应的数据库进行操作了,使用命令为:
USE dbname
例如使用数据库test:
MySQL [(none)]> use test;
Database changed
MySQL [test]>
可以看到[]内的内容变成test数据库的名称了。
删除数据库
创建数据库对应的就是删除数据库了,命令为:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
例如查看test数据库:
MySQL [test]> drop database if exists test;
Query OK, 0 rows affected (0.00 sec)
MySQL [(none)]>
注:数据库删除后,下面的所有表数据都会全部删除,所以在删除前需要检查并备份。
查看所有数据库
命令为:
SHOW DATABASES
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
创建表
在数据库中创建一张表的语法如下:
CREATE TABLE [IF NOT EXISTS] tablename (
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
...
column_name_n column_type_n constraints
);
例如创建一张user表,包含字段id,name,age。
MySQL [test]> create table if not exists user (
-> id int(11) primary key,
-> name varchar(32) not null,
-> age int(11)
-> );
注:创建表之前需要先选择数据库。
查看所有表
同样也是使用show
SHOW tables
例如:查看test数据库下的所有表
MySQL [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user |
+----------------+
1 row in set (0.00 sec)
查看表结构
查看表结构命令为:
DESC tablename
例如查看之前创建的user的结构。
MySQL [test]> desc user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(32) | NO | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
和这个命令相似功能的命令是show create table tbname
:
MySQL [test]> show create table user\G;
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(32) NOT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR: No query specified
删除表
表的删除命令如下:
DROP TABLE [IF EXISTS] tablename
例如:删除之前创建的user表:
MySQL [test]> drop table if exists user;
Query OK, 0 rows affected (0.00 sec)
修改表
修改表使用关键字alter
。它修改的内容可以是修改表的字段类型,还可以添加删除表字段。
1.修改表类型:
ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST|ALTER col_name]
例如:修改user表的name字段,将varchar(32)修改为varchar(64)
MySQL [test]> alter table user modify name varchar(64);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [test]> desc user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(64) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
2.添加表字段
ALTER TABLE tbname ADD [COLUMN] column_definition [FIRST|ALTER col_name]
例如:user中添加一个字段,名为email,类型是varchar(64)
MySQL [test]> alter table `user` add `email` varchar(64) not null;
Query OK, 0 rows affected (0.34 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [test]> desc user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(64) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| email | varchar(64) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
3.删除表字段
语法如下:
ALTER TABLE tablename DROP [COLUMN] col_name
例如:删除user中的email字段
MySQL [test]> alter table `user` drop `email`;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [test]> desc user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(64) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
4.字段改名
语法如下:
ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST|ALTER col_name]
例如:将name改名为username,类型为varchar(32):
MySQL [test]> alter table `user` change `name` `username` varchar(32);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [test]> desc user;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| username | varchar(32) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
注:change 和 modify 都可以修改表的定义,不同的是 change 后面需要写两次列名,不方便。但 change 可以改名,modify 则不能。
5.修改字段排列顺序。
修改字段的关键字ADD、CHNAGE、MODIFY中都支持可选项first|after,用于修改字段的位置。
例如:新增一个字段email,并置于username字段之前:
MySQL [test]> alter table `user` add `email` varchar(64) after `id`;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [test]> desc user;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| email | varchar(64) | YES | | NULL | |
| username | varchar(32) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+----------+-------------
例如:修改字段email在username字段之后:
MySQL [test]> alter table `user` modify `email` varchar(64) after `username`;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [test]> desc user;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| username | varchar(32) | YES | | NULL | |
| email | varchar(64) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
注:CHNAGE|FIRST|ALTER 这些关键字都属于MySQL在标准SQL上的扩展,在其他数据库上不一定适用。
6.修改表名
语法如下:
ALTER TABLE tablename RENAME [TO] new_name
例如:将表user修改为tb_user:
MySQL [test]> alter table `user` rename `tb_user`;
Query OK, 0 rows affected (0.00 sec)
MySQL [test]> desc tb_user;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| username | varchar(32) | YES | | NULL | |
| email | varchar(64) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
DML语句
DML语句为数据库表的操作语句,可以对数据库表的内容做增(insert)、删(delete)、改(update)、查(select)操作。
插入记录
表创建完毕后就往表中插入记录了,语法如下:
INSERT INTO tablename (field1,field2,field3,...,fieldn) VALUES (value1,value2,value3,...,valuen)
例如:在user表中插入一条记录,id为1,name为xiaoming,age为20:
MySQL [test]> insert into `user` (`id`,`name`,`age`) values (1,'xiaoming',20);
Query OK, 1 row affected (0.01 sec)
MySQL [test]> select id, name, age from `user`;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | xiaoming | 20 |
+----+----------+------+
1 row in set (0.00 sec)
注:如果表中的字段类型设置了初始值,那插入时可以不指定该字段的值,这样它就以默认的值插入到表中。
select是SQL查询操作的关键字,之后再说明。insert语句支持同时插入多条记录:
INSERT INTO tablename (field1,field2,field3,...,fieldn)
VALUES
(value1,value2,value3,...,valuen),
(value1,value2,value3,...,valuen)
...
(value1,value2,value3,...,valuen);
例如:同时在user表中插入多条记录:
MySQL [test]> insert into `user` (`id`,`name`,`age`)
-> values
-> (2,'John',40),
-> (3,'Lisa',18);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
MySQL [test]> select id, name, age from `user`;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | xiaoming | 20 |
| 2 | John | 40 |
| 3 | Lisa | 18 |
+----+----------+------+
3 rows in set (0.00 sec)
注:同时插入可以节省很多的网络开销,提高插入效率。
更新记录
更新表的记录语法如下:
UPDATE tablename SET field1=value1,field2=value2,...,fieldn=valuen [WHERE CONDITION]
例如:修改John的年龄为30:
MySQL [test]> update `user` set age=30 where name='John';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MySQL [test]> select id, name, age from `user` where name='John';
+----+------+------+
| id | name | age |
+----+------+------+
| 2 | John | 30 |
+----+------+------+
1 row in set (0.00 sec)
注:修改操作时需要使用关键字
where
指定条件,否则表中的所有记录的指定字段都会被修改。
UPDATE
支持同时修改多个表的记录,语法如下:
UPDATE t1,t2,...tn SET t1.field1=value1,...,tn.fieldn=valuen [WHERE CONDITION]
删除记录
删除数据库表记录使用命令delete
,语法如下:
DELETE FROM tablename [WHERE CONDITION]
例如:删除name为'xiaoming'的记录:
MySQL [test]> delete from `user` where name='xiaoming';
Query OK, 1 row affected (0.00 sec)
MySQL [test]> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 2 | John | 30 |
| 3 | Lisa | 18 |
+----+------+------+
2 rows in set (0.00 sec)
同样的,删除操作也支持多表删除,语法如下:
DELETE t1,t2,...,tn FROM t1,t2,...,tn [WHERE CONDITION]
在进行多表操作时,为了简化SQL命令,可以给表添加别名。如果使用了别名,则在字段前也需要用别名表示该表。
注:删除时也一定要指定条件,不加where条件会删除表的所有记录。
查询记录
查询记录使用命令select,语法如下:
SELECT * FROM tablename [WHERE CONDITION]
例如:查询user表的所有记录:
MySQL [test]> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 2 | John | 30 |
| 3 | Lisa | 18 |
+----+------+------+
2 rows in set (0.00 sec)
*
表示输出所有的字段,所以上面的select命令等同于 select id, name, age from user
。并且select命令也是使用最频繁的命令,它支持各种方式的查询。
1.查询去重。
使用关键字distinct对某一个字段的值去重。例如:字段name去重查询。
MySQL [test]> select * from user;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | John | 40 |
| 2 | John | 30 |
| 3 | Lisa | 18 |
| 4 | Lisa | 18 |
+----+------+------+
4 rows in set (0.00 sec)
MySQL [test]> select distinct name from user;
+------+
| name |
+------+
| John |
| Lisa |
+------+
2 rows in set (0.00 sec)
2.条件查询。
用where关键字指定查询条件。例如:查询name为John且age为30的记录:
MySQL [test]> select * from user where name='John' and age=30;
+----+------+------+
| id | name | age |
+----+------+------+
| 2 | John | 30 |
+----+------+------+
1 row in set (0.01 sec)
使用and连接多个查询条件,也可以使用or表示查询满足多个条件中某个条件的记录。例如:查询name为John或id=3的记录:
MySQL [test]> select * from user where name='John' or id=3;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | John | 40 |
| 2 | John | 30 |
| 3 | Lisa | 18 |
+----+------+------+
3 rows in set (0.00 sec)
where后面的条件时一个表达式,支持各种运算符:>、<、>=、<=、!=。
3.排序
使用关键字ORDER BY
可以对查询的记录进行排序,语法如下:
SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC], field2 [DESC|ASC],...,fieldn [DESC|ASC]
DESC和ASC是排序顺序的关键字,DESC表是按照字段进行降序排列,ASC则表示升序排列,默认为升序排列。如果有多个字段,则先对第一个字段排序,字段相同的情况下再根据第二个排序,依次类推。例如:按照age字段对user表的记录排序:
MySQL [test]> select * from user order by age desc;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | John | 40 |
| 2 | John | 30 |
| 3 | Lisa | 18 |
| 4 | Lisa | 18 |
+----+------+------+
4 rows in set (0.00 sec)
MySQL [test]> select * from user order by age asc;
+----+------+------+
| id | name | age |
+----+------+------+
| 3 | Lisa | 18 |
| 4 | Lisa | 18 |
| 2 | John | 30 |
| 1 | John | 40 |
+----+------+------+
4 rows in set (0.01 sec)
4.限制和偏移
使用关键字OFFSET
和LIMIT
限制查询记录的数量,已经查询的范围。语法如下:
SELECT * FROM LIMIT N OFFSET M
例如:查询user表的第一条记录:
MySQL [test]> select * from user limit 2;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | John | 40 |
| 2 | John | 30 |
+----+------+------+
2 rows in set (0.00 sec)
例如:查询user表的第二条记录:
MySQL [test]> select * from user limit 1 offset 1;
+----+------+------+
| id | name | age |
+----+------+------+
| 2 | John | 30 |
+----+------+------+
1 row in set (0.00 sec)
而且OFFSET
和LIMIT
配合使用还能实现查询的分页效果:如查询user表的第2页,每页5条记录:
MySQL [test]> select * from user limit 5 offset 5;
注:limit属于MySQL扩展SQL92后的语法,在其他数据库上不一定通用。
5.聚合
聚合操作的语法如下:
SELECT [field1,field2,...,fieldn] func_name
FROM tablename
[WHERE CONDITION]
[GROUP BY field1,field2,...,fieldn]
[WITH ROLLUP]
[HAVING CONDITION]
其参数说明如下:
- func_name 表示聚合函数,常用的有sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
- GROUP BY 关键字表示要进行分类聚合的字段。
- WITH ROLLUP 表示是否对分类聚合后的结果进行再汇总。
- HAVING 关键字表示对分类后的结果再进行条件的过滤。
注:having 和 where 都能对查询的数据进行条件过滤。但where是再聚合前就对记录进行过滤,having则是在聚合后再根据逻辑进行过滤。
例如:统计user表的记录数:
MySQL [test]> select count(1) from user;
+----------+
| count(1) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)
例如:在上面统计的基础上再统计各个性别的人数。
MySQL [test]> select gender,count(1) from user group by gender;
+--------+----------+
| gender | count(1) |
+--------+----------+
| man | 2 |
| woman | 2 |
+--------+----------+
2 rows in set (0.00 sec)
例如:再加上总人数
MySQL [test]> select gender,count(1) from user group by gender with rollup;
+--------+----------+
| gender | count(1) |
+--------+----------+
| man | 2 |
| woman | 2 |
| NULL | 4 |
+--------+----------+
3 rows in set (0.00 sec)
例如:统计人数大于1的性别
MySQL [test]> select gender,count(1) from user group by gender having count(1)>1;
+--------+----------+
| gender | count(1) |
+--------+----------+
| man | 2 |
| woman | 2 |
+--------+----------+
2 rows in set (0.00 sec)
例如:统计user表的最大年龄,最小年龄,年龄总和。
MySQL [test]> select max(age),min(age),sum(age) from user;
+----------+----------+----------+
| max(age) | min(age) | sum(age) |
+----------+----------+----------+
| 40 | 18 | 106 |
+----------+----------+----------+
1 row in set (0.00 sec)
6.表连接
当需要同时显示对各表的字段时,就可以使用表连接实现。表连接分为:
- 内连接:语法
SELECT * FROM tb1 INNER JOIN tb2 ON CONDITION
。它会根据条件输出两张表中都匹配的记录,简单讲就是取交集。 - 左连接:语法
SELECT * FROM tb1 LEFT JOIN tb2 ON CONDITION
。在多张表中以最左边的表为基础配置记录,如果其他表没有对应的记录,就留空。 - 左连接:语法
SELECT * FROM tb1 RIGHT JOIN tb2 ON CONDITION
。它和左连接对应,在多张表中以最右边的表为基础配置记录,如果其他表没有对应的记录,就留空。右连接和左连接可以互相转化。
这里user(用户表)和role(角色表),其内容如下:
MySQL [test]> select * from user;
+----+------+--------+------+---------+
| id | name | gender | age | role_id |
+----+------+--------+------+---------+
| 1 | Bob | man | 40 | 2 |
| 2 | John | man | 30 | 1 |
| 3 | Anna | woman | 18 | 3 |
| 4 | Lisa | woman | 18 | NULL |
+----+------+--------+------+---------+
4 rows in set (0.00 sec)
MySQL [test]> select * from role;
+----+---------------+
| id | name |
+----+---------------+
| 1 | administrator |
| 2 | manager |
| 3 | visitor |
| 4 | unknow |
+----+---------------+
4 rows in set (0.00 sec)
例如:内连接方式查询user中对应的角色名称:
MySQL [test]> select u.name,u.gender,u.age,r.name from user u inner join role r on u.role_id=r.id;
+------+--------+------+---------------+
| name | gender | age | name |
+------+--------+------+---------------+
| Bob | man | 40 | manager |
| John | man | 30 | administrator |
| Anna | woman | 18 | visitor |
+------+--------+------+---------------+
例如:同样的需求用左连接实现:
MySQL [test]> select u.name,u.gender,u.age,r.name from user u left join role r on u.role_id=r.id;
+------+--------+------+---------------+
| name | gender | age | name |
+------+--------+------+---------------+
| John | man | 30 | administrator |
| Bob | man | 40 | manager |
| Anna | woman | 18 | visitor |
| Lisa | woman | 18 | NULL |
+------+--------+------+---------------+
4 rows in set (0.00 sec)
因为Lisa用户没有对应的角色id,所以显示NULL。
例如:以右连接方式实现:
MySQL [test]> select u.name,u.gender,u.age,r.name from user u right join role r on u.role_id=r.id;
+------+--------+------+---------------+
| name | gender | age | name |
+------+--------+------+---------------+
| Bob | man | 40 | manager |
| John | man | 30 | administrator |
| Anna | woman | 18 | visitor |
| NULL | NULL | NULL | unknow |
+------+--------+------+---------------+
4 rows in set (0.00 sec)
unknow角色没有查询到对应的用户,显示NULL。
7.子查询
在某些情况下,进行查询时需要的条件是另一个select语句的结果,这种情况就要用到子查询。用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists、like、>、<等。语法如下:
SELECT * FROM table_name
WHERE CONDITION
SELECT * FROM table_name
例如:查询角色id为Manager或Administrator的用户:
MySQL [test]> select * from user where role_id in (select id from role where name in ('manager','administrator'));
+----+------+--------+------+---------+
| id | name | gender | age | role_id |
+----+------+--------+------+---------+
| 1 | Bob | man | 40 | 2 |
| 2 | John | man | 30 | 1 |
+----+------+--------+------+---------+
2 rows in set (0.00 sec)
上面的子查询可以用表连接实现:
MySQL [test]> select u.name,u.gender,u.age,r.name from user u inner join role r where r.name in ('manager','administrator') and r.id=u.role_id;
+------+--------+------+---------------+
| name | gender | age | name |
+------+--------+------+---------------+
| Bob | man | 40 | manager |
| John | man | 30 | administrator |
+------+--------+------+---------------+
2 rows in set (0.00 sec)
注:很多情况下表连接和子查询是可以互相转化的。而且很多情况下表连接查询效率优于子查询。
8.联合查询
当需要查询的数据散落在不同的表中,且表之间没有连接关系。语法如下:
SELECT * FROM t1
UNION | UNION ALL
SELECT * FROM t2
...
UNION | UNION ALL
SELECT * FROM tn
UNION 和 UNION ALL 的区别在于UNION会去点查询结果中的重复值,而UNION ALL则保留重复值。
例如:查询student表和user表中的人名:
MySQL [test]> select id, name from user union select id,name from student;
+----+------+
| id | name |
+----+------+
| 1 | Bob |
| 2 | John |
| 3 | Anna |
| 4 | Lisa |
| 1 | Mark |
| 2 | Li |
+----+------+
6 rows in set (0.00 sec)
DCL语句
DCL主要用于管理数据库的权限。语法如下:
GRANT PRI ON databasename.tablename TO 'user'@'ip' IDENTIFIED BY 'password'
例如:创建一个数据用户ks,具有对test数据库的所有表的select/insert权限:
MySQL [test]> grant select,insert on test.* to 'ks'@'172.17.1.254' identified by '123';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
MySQL [test]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql实践一:SQL基础的更多相关文章
- MySQL学习之SQL基础(一)DDL
Sql基础 DDL (data defination language) 创建表 CREATE TABLE emp( ename varchar(10), hiredate date, sal dec ...
- 《深入浅出MySQL》之SQL基础
SQL是Structure Query language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言.在众多开源数据中,MySQL正式其中最杰出的代表,MySQL是由三个瑞典人于20世纪 ...
- mysql实践:sql优化
---恢复内容开始--- 设计表的时候 1. 不同的表涉及同一个公共意义字段不要使用不同的数据类型(可能导致索引不可用,查询结果有偏差) 2. 不要一张表放太多的数据 主表20~30个字段 ...
- MySQL学习之SQL基础(一)DML
DML(data Manipulation language) INSERT DELETE UPDATE SELECT INSERT mysql> desc emp; +----------+- ...
- (2.15)Mysql之SQL基础——开发设计最佳规范
(2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...
- (2.13)Mysql之SQL基础——触发器
(2.13)Mysql之SQL基础——触发器 关键词:Mysql触发器 1.一般形式 -- 0.查看触发器[1]SHOW TRIGGERS;[2]SELECT * FROM `information_ ...
- MySQL基础整理(一)之SQL基础(未完成)
大家好,我是浅墨竹染,以下是MySQL基础整理(一)之SQL基础 1.SQL简介 SQL(Structure Query Language)是一种结构化查询语言,是使用关系模型的数据库应用语言. 2. ...
- 2.Mysql SQL基础
2.Mysql SQL基础2.1 SQL简介 SQL(Structure Query Language)是结构化查询语言.2.2 SQL使用入门 2.2.1 SQL分类 SQL分为DDL.DML(DQ ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
随机推荐
- .NET添加新项目-配置不同环境参数
添加新项目-配置不同环境参数 添加新项目后,需要对配置管理器进行设置.默认新加的项目只有debug和release 现加其他环境(dev.uat...)的配置[通过项目文件.csproj来加,拷贝其他 ...
- NOI 2019 游记
day -1 去报了个到,顺便买了一大堆衣服. 感觉学校饭堂不太行. day 0 上午是开幕式,. 下午是笔试,顺利获得 \(100\) 分. day 1 先看题. 第一题看到 \(At^2+Bt+C ...
- 洛谷 P2897 【蚯蚓】 题解
先分析一下题意: 这个题说的就是一开始给你很多条蚯蚓,然后给出你规定的次数,每一次都从蚯蚓里面拿出最长的来切成一条是原来q倍的,另一条是原来的(1 - q)倍,把切开的两条再放回去.规定次数完成之后, ...
- 洛谷 CF894A QAQ
目录 题目 思路 \(Code\) 题目 CF894A 思路 \(\text{DP}\) 一个数组\(\text{QAQ[4][101]}\) \(\text{QAQ[1][i]表示在i这个位置q的个 ...
- BZOJ1034 ZJOJ2008 泡泡堂BNB
BZOJ1034 ZJOJ2008 泡泡堂BNB Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表 队由n名选手组成,比赛 ...
- hhhhh我进步啦!
不要相信上面的标题,其实我是 一直都很强的 蒟蒻中的蒟蒻(卑微☹) 今天早上刷完水题后突然发现自己竟然进了一本通网站“排名”的首页(第 100 名欸),不禁 嘚瑟 开森不已. ☟☟☟ 继续A题↖(^ω ...
- lintcode-1174.下一个更大的元素 III
题目描述: 1174. 下一个更大的元素 III 给定一个32位整数n,用同样的数字组成新的32位整数,使得它要比n大,返回最小的这样的数.如果不存在这样的整数,返回-1. 算法思路: 首先将这个数转 ...
- JS和JQuery实现Button绑定键盘Enter事件实现提交
JavaScript实现方法 document.onkeydown = function(e) { if (!e) e = window.event;//火狐中是 window.event if (( ...
- 记录python循环引用带来的MemoryError错误解决
在以前的python中,没有遇到过这样的错误,上来之后还是很蒙蔽的,问了几个业内的人,他们 都给我说让我改服务器里面配置的东西, 因为是要给大家用的,服务器要保证长久运行,不能临时去修改这个,导致在大 ...
- DIV块中 元素垂直居中
1 DIV块中 元素垂直居中 作者:知乎用户链接:https://www.zhihu.com/question/20543196/answer/99429177来源:知乎著作权归作者所有.商业转载请联 ...