查询表字段详细信息
mysql> desc employees;
易百教程寻址
https://my.oschina.net/u/2263383/blog/757044
查询
https://www.yiibai.com/mysql/select-statement-query-data.html
SELECT
column_1, column_2, ...
FROM
table_1
[INNER | LEFT |RIGHT] JOIN table_2 ON conditions
WHERE
conditions
GROUP BY column_1
HAVING group_conditions
ORDER BY column_1
LIMIT offset, length;
SELECT语句由以下列表中所述的几个子句组成:
SELECT之后是逗号分隔列或星号(*)的列表,表示要返回所有列。
FROM指定要查询数据的表或视图。
JOIN根据某些连接条件从其他表中获取数据。
WHERE过滤结果集中的行。
GROUP BY将一组行组合成小分组,并对每个小分组应用聚合函数。
HAVING过滤器基于GROUP BY子句定义的小分组。
ORDER BY指定用于排序的列的列表。LIMIT限制返回行的数量。
GROUP BY子句
https://www.yiibai.com/mysql/mysql-group-by-clause.html
GROUP BY将一组行组合成小分组,并对每个小分组应用聚合函数。
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber;
group by col1,col2,...
SELECT
city,
contactLastName
FROM
customers
GROUP BY
city,
contactLastName ASC;
先按照city分组,然后在city分组的基础上再分组contactLastName,
开发中要明确执行是升序还是降序,而不应该依赖于默认的排序策略。
having子句
https://www.yiibai.com/mysql/having.html
在SELECT语句中使用HAVING
子句来指定一组行或聚合的过滤条件。
HAVING
子句通常与GROUP BY子句一起使用,以根据指定的条件过滤分组。如果省略GROUP BY
子句,则HAVING
子句的行为与WHERE
子句类似。
请注意,
HAVING
子句将过滤条件应用于每组分行,而WHERE
子句将过滤条件应用于每个单独的行。
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber
HAVING total > 55000;
inner join
https://www.yiibai.com/mysql/inner-join.html
MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录。
主表连接其他表,一块查询;
主表和其他表是一对多的关系;
SELECT column_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
...
WHERE where_conditions;
SELECT
productCode,
productName,
textDescription
FROM products t1
INNER JOIN productlines t2 ON t1.productline = t2.productline;
由于两个表的连接列是使用相同一个列:productline,因此可以使用以下语法:SELECT
productCode,
productName,
textDescription
FROM
products
INNER JOIN
productlines USING (productline);
SQL上面语句返回相同的结果集,但是使用此语法,不必使用表的别名。
SELECT
T1.orderNumber,
status,
SUM(quantityOrdered * priceEach) total
FROM
orders AS T1
INNER JOIN
orderdetails AS T2 ON T1.orderNumber = T2.orderNumber
GROUP BY orderNumber;
外连接:左外连接
https://www.yiibai.com/mysql/left-join.html
MySQL LEFT JOIN
子句允许您从两个或多个数据库表查询数据。LEFT JOIN
子句是SELECT语句的可选部分,出现在FROM
子句之后。
SELECT
t1.c1, t1.c2, t2.c1, t2.c2
FROM
t1
LEFT JOIN
t2 ON t1.c1 = t2.c1;
当使用LEFT JOIN子句将t1表加入t2表时,如果来自左表t1的行与基于连接条件(t1.c1 = t2.c1)的右表t2匹配,则该行将被包含在结果集中。
如果左表中的行与右表中的行不匹配,则还将选择左表中的行并与右表中的“假”行组合。“假”行对于SELECT子句中的所有相应列都包含NULL值。
换句话说,LEFT JOIN子句允许您从匹配的左右表中查询选择行记录,连接左表(t1)中的所有行,即使在右表(t2)中找不到匹配的行也显示出来,但使用NULL值代替。
select distinct :去重查询
SELECT DISTINCT
lastname
FROM
employees
ORDER BY lastname;
SQL
如果列具有NULL值,并且对该列使用DISTINCT子句,MySQL将保留一个NULL值,并删除其它的NULL值,因为DISTINCT子句将所有NULL值视为相同的值。
SELECT DISTINCT state FROM customers;
SELECT
state,
city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY
state,
city;
去除重复组合:
SELECT DISTINCT
state,
city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY
state,
city;
分组:
SELECT state FROM customers GROUP BY state;
SELECT DISTINCT state FROM customers ORDER BY state;
SELECT
COUNT( DISTINCT state )
FROM
customers
WHERE
country = 'USA';
SELECT DISTINCT
state
FROM
customers
WHERE
state IS NOT NULL
LIMIT 3;
不应该指望默认排序策略,在开发中排序策略必须明确指定,是升序还是降序。
order by
SELECT column1, column2,...
FROM tbl
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC],...
SQLASC表示升序,DESC表示降序。默认情况下,如果不明确指定ASC或DESC,ORDER BY子句会按照升序对结果集进行排序。
如果要按姓氏按降序和名字按升序排序联系人,请在相应列中分别指定DESC和ASC,如下所示:
SELECT
contactLastname,
contactFirstname
FROM
customers
ORDER BY
contactLastname DESC,
contactFirstname ASC;
ORDER BY子句还允许您根据表达式对结果集进行排序。请参阅以下orderdetails表结构 -
SELECT
ordernumber,
orderlinenumber,
quantityOrdered * priceEach
FROM
orderdetails
ORDER BY
ordernumber,
orderLineNumber,
quantityOrdered * priceEach;
为了使查询更易于阅读,可以按列别名进行排序,方法如下:SELECT
ordernumber,
orderlinenumber,
quantityOrdered * priceEach AS subtotal
FROM
orderdetails
ORDER BY
ordernumber,
orderLineNumber,
subtotal;
可以使用FIELD()函数将这些值映射到数值列表,并使用数字进行排序; 请参阅以下查询:SELECT
orderNumber, status
FROM
orders
ORDER BY FIELD(status,
'In Process',
'On Hold',
'Cancelled',
'Resolved',
'Disputed',
'Shipped');
ORDER BY子句以线性方式排序字符串,即从第一个字符开始的每个字符一次。
这被称为自然排序。不幸的是,MySQL不提供任何内置的自然排序语法或函数。
https://www.yiibai.com/mysql/natural-sorting.html
自然语言排序:
当我们查询选择数据并按item_no
排序时,得到以下结果:
SELECT
item_no
FROM
items
ORDER BY item_no;
+---------+
| item_no |
+---------+
| 1 |
| 10Z |
| 1C |
| 2 |
| 20D |
| 2A |
| 3C |
+---------+
7 rows in set
这不是我们的预期的结果,我们想要看到的结果如下:
+---------+
| item_no |
+---------+
| 1 |
| 1C |
| 2 |
| 2A |
| 3C |
| 10Z |
| 20D |
+---------+
这被称为自然排序。不幸的是,MySQL不提供任何内置的自然排序语法或函数。 ORDER BY子句以线性方式排序字符串,即从第一个字符开始的每个字符一次。
但是,如果所有上述解决方案都不适合。 则需要在应用程序层执行自然排序。 一些语言支持自然排序功能,例如,PHP提供了使用自然排序算法对数组进行排序的natsort()函数。
子查询
SELECT
lastName,
firstName
FROM
employees
WHERE
officeCode IN ( SELECT officeCode FROM offices WHERE country = 'USA' );
mysql> SELECT fname, lname, addr FROM prospect
-> UNION
-> SELECT first_name, last_name, address FROM customer
-> UNION
-> SELECT company, '', street FROM vendor;
如果想选择所有记录,包括重复的记录,请使用UNION关键字后面接一个 ALL 关键字:mysql> SELECT fname, lname, addr FROM prospect
-> UNION ALL
-> SELECT first_name, last_name, address FROM customer
-> UNION
-> SELECT company, '', street FROM vendor;
主键
CREATE TABLE sales (
product_id INT,
store_id INT,
quantity DECIMAL(13 , 2 ) NOT NULL,
sales_date DATE NOT NULL,
PRIMARY KEY (product_id , store_id),
FOREIGN KEY (product_id)
REFERENCES products (id)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (store_id)
REFERENCES stores (id)
ON DELETE CASCADE ON UPDATE CASCADE
);
MySQL主键(Primary Key)是唯一标识表中每行的列
或一组列
。当定义表的主键时,必须遵循以下规则:
主键必须包含唯一值。如果主键由多个列组成,则这些列中的值的组合必须是唯一的。
主键列不能包含NULL值。 这意味着必须使用NOT NULL属性声明主键列。如果没有指定NOT NULL,MySQL将强制为主键列为NOT NULL。
一张表只有一个主键。
因为MySQL使用整数工作更快
,所以主键列的数据类型应该是整数类型,例如:INT
,BIGINT
。可以选择一个较小的整数类型:TINYINT
,SMALLINT
等。但是,应该确保值的范围的主键的整数类型足以存储表可能所具有最大行数。
主键列通常具有自动生成键的唯一序列的AUTO_INCREMENT
属性。下一行的主键值大于前一个行的主键值。
MySQL为表中的主键创建一个名为PRIMARY
的PRIMARY
索引类型。
create table users(
user_id int not null primary key autoincrement,
);
create table toles(
role_id int not null autoincreament,
primary key(role_id)
);
create table userroles(
user_id int not null,
role_id int not null,
primary key(user_id,role_id),
foreign key(user_id) references users(user_id),
foreign key(role_id) references roles(role_id)
);
alter table table_name add primary key(col_name);
unique
UNIQUE索引为其值必须是唯一的列创建约束。
与PRIMARY索引不同,MySQL在UNIQUE索引中允许有NULL值。 一个表也可以有多个UNIQUE索引。
例如,users表中的用户的email和username必须是唯一的。可以为email和username列定义UNIQUE索引,如下语句所示:
在username列上添加UNIQUE索引。
ALTER TABLE users ADD UNIQUE INDEX username_unique (username ASC) ;
SQL在email列上添加UNIQUE索引。
ALTER TABLE users ADD UNIQUE INDEX email_unique (email ASC) ;
unique:null可以重复
CREATE TABLE `users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(40) DEFAULT NULL,
`PASSWORD` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `email_unique` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
外键
在MySQL中,InnoDB存储引擎支持外键,因此您必须创建InnoDB表才能使用外键约束。
customers表称为父表或引用表,orders表称为子表或引用表。
表可以有多个外键,子表中的每个外键可能引用不同的父表。
子表中的行必须包含父表中存在的值,例如,orders表中的每个订单记录必须在customers表中存在customerNumber。 因此,多个订单可以指同一个客户,因此这种关系称为一个(客户)到许多(订单)或一对多。
有时,子表和父表是一样的。外键返回到表的主键,例如以下employees表:
外键执行引用完整性,可以帮助您自动维护数据的一致性和完整性。 例如,不能为不存在的客户创建订单。
此外,可以为
customerNumber
外键设置级联删除操作,以便在customers
表中删除客户时,与客户关联的所有订单也将被删除。 这样可以节省您使用多个DELETE语句或DELETE JOIN语句的时间和精力。
添加外键:
constraint constraint_name
foreign key fk_name (columns)
references parent_table(columns)
on delete cascade
on update cascade
新增字段和添加外键的关系:
先添加字段,也就是说这个表中得先有这个字段,然后才能给这个字段添加外键。